9-文档、测试和管道

本章我们将实现“解析”功能,来解析在第一章提到的命令行操作指令(还记得吗?我们在写一个简易redis!):

  1. CREATE shopping
  2. OK
  3. PUT shopping milk 1
  4. OK
  5. PUT shopping eggs 3
  6. OK
  7. GET shopping milk
  8. 1
  9. OK
  10. DELETE shopping eggs
  11. OK

解析功能完成后,我们会把代码更新到之前创建的:kv程序里面去。

文档测试(Doctests)

Doctest常见于python,ruby等语言,是一种基于代码注释文档书写单元测试的方法。
用特定的语法为函数或方法书写注释,用doctest命令执行这些文档测试代码。
注意:为了保证代码简洁,不能完全用doctest代替传统的单元测试代码

在语言官网首页,我们说Elixir视代码中的文档标记为语言中的一等公民。在文档手册中,我们也多次涉及这个概念。
比如经常在IEx命令行中执行mix help,以及输入h Enumh + 其他模块名字。

本章中,我们在实现上文所说“解析”功能的时候,引入文档注释的内容。它能够让我们直接通过代码的文档注释写测试,
有助于我们在文档注释中写出更准确的sample。

现在来创建我们的解析功能函数lib/kv_server/command.ex。先写doctest:

  1. defmodule KVServer.Command do
  2. @doc ~S"""
  3. Parses the given `line` into a command.
  4. ## Examples
  5. iex> KVServer.Command.parse "CREATE shopping\r\n"
  6. {:ok, {:create, "shopping"}}
  7. """
  8. def parse(line) do
  9. :not_implemented
  10. end
  11. end

Doctests规定的书写形式:在4空格缩进之后的iex>提示符后。
如果一个命令不止一行,则在除第一行的其它行用...>代替iex>字样。
命令的结果则写在iex>...>的下一行,后面以一个新行或者下一个新的iex>行结束。

同时注意,我们写注释文档时用@doc ~S"""起头。~S可以保证文档里写的/r/n不会在执行doctests测试前被转义成回车。

执行doctets,我们先创建一个测试脚本test/kv_server/command_test.exs
在用例中调用doctest KVServer.Command

  1. defmodule KVServer.CommandTest do
  2. use ExUnit.Case, async: true
  3. doctest KVServer.Command
  4. end