9-文檔、測試和管道
================
本章我們將實現“解析”功能,來解析在第一章提到的命令行操作指令(還記得嗎?我們在寫一個簡易redis!):
```elixir
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:
```elixir
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```:
```elixir
defmodule KVServer.CommandTest do
use ExUnit.Case, async: true
doctest KVServer.Command
end
```