9-文档、测试和管道
本章我们将实现“解析”功能,来解析在第一章提到的命令行操作指令(还记得吗?我们在写一个简易redis!):
CREATE shopping
OK
PUT shopping milk 1
OK
PUT shopping eggs 3
OK
GET shopping milk
1
OK
DELETE shopping eggs
OK
解析功能完成后,我们会把代码更新到之前创建的:kv
程序里面去。
文档测试(Doctests)
Doctest常见于python,ruby等语言,是一种基于代码注释文档书写单元测试的方法。
用特定的语法为函数或方法书写注释,用doctest命令执行这些文档测试代码。
注意:为了保证代码简洁,不能完全用doctest代替传统的单元测试代码
在语言官网首页,我们说Elixir视代码中的文档标记为语言中的一等公民。在文档手册中,我们也多次涉及这个概念。
比如经常在IEx命令行中执行mix help
,以及输入h Enum
或h
+ 其他模块名字。
本章中,我们在实现上文所说“解析”功能的时候,引入文档注释的内容。它能够让我们直接通过代码的文档注释写测试,
有助于我们在文档注释中写出更准确的sample。
现在来创建我们的解析功能函数lib/kv_server/command.ex
。先写doctest:
defmodule KVServer.Command do
@doc ~S"""
Parses the given `line` into a command.
## Examples
iex> KVServer.Command.parse "CREATE shopping\r\n"
{:ok, {:create, "shopping"}}
"""
def parse(line) do
:not_implemented
end
end
Doctests规定的书写形式:在4空格缩进之后的iex>
提示符后。
如果一个命令不止一行,则在除第一行的其它行用...>
代替iex>
字样。
命令的结果则写在iex>
或...>
的下一行,后面以一个新行或者下一个新的iex>
行结束。
同时注意,我们写注释文档时用@doc ~S"""
起头。~S
可以保证文档里写的/r/n
不会在执行doctests测试前被转义成回车。
执行doctets,我们先创建一个测试脚本test/kv_server/command_test.exs
,
在用例中调用doctest KVServer.Command
:
defmodule KVServer.CommandTest do
use ExUnit.Case, async: true
doctest KVServer.Command
end