了解如何在 Exercism 上測試你的 YAMLScript 練習
測試用 YAMLScript 撰寫的 Exercism 練習解答,非常簡單。既容易執行,也容易理解。
你只要在練習目錄中執行make test就可以了。
第一次執行make test時,所有測試都會失敗,純粹只是因為你還沒寫任何程式碼來解這些測試。
一般的練習開發流程,是先執行make test,然後一次專注在一個測試上,撰寫程式碼讓那個測試通過。當所有測試都通過時,你就完成了!
額外的好處是,執行make test也會確保正確版本的ys YAMLScript 翻譯員(也就是目前這個練習所需的版本)安裝在正確的位置(/path/to/exercism/yamlscript/.local/)。這表示你甚至不必事先安裝ys就能開始!
如果你正在做一個叫做the-great-exercise的練習,那麼exercism download --exercise=the-great-exercise --track=yamlscript會建立目錄/path/to/exercism/yamlscript/the-great-exercise。
在這個目錄裡,測試檔的檔名會是the-great-exercise-test.ys,解答程式的檔名則是the-great-exercise.ys。另外還會有README.md,裡面是練習說明,以及HELP.md,在你卡關時提供一些實用的資訊。
make會有兩個檔案:Makefile和GNUmakefile。這麼做是為了確保(不是雙關喔)你使用的是 GNU make 來執行測試,而不是系統上可能安裝的其他make指令。GNUmakefile才是真正的那個,GNU make 一律會優先採用它,而不是Makefile。其他make指令則會使用Makefile,而它應該會出現錯誤訊息,提醒你改用 GNU make!
YAMLScript 的測試當然是用 YAMLScript 寫的!既然 YAMLScript 就是 YAML,而 YAML 就是資料,這些測試基本上也只是資料而已。
以下是個簡單測試檔的範例。其實它就是acronym練習的前 3 個測試。:-)
#!/usr/bin/env ys-0
use ys::taptest: :all
load: 'acronym.ys'
test::
- name: Basic
code: abbreviate('Portable Network Graphics')
want: PNG
- name: Lowercase words
code: abbreviate('Ruby on Rails')
want: ROR
- name: Punctuation
code: abbreviate('First In, First Out')
want: FIFO
done: 3
第一行是 shebang 行,用來告訴prove指令(由 Makefile 執行)使用 YAMLScript 的ys翻譯員來執行測試,而不是prove預設使用的perl。
第二行是use敘述,它會載入 YAMLScript 的ys::taptest TAP 測試函式庫。
注意:TAP 是測試腳本和測試框架之間簡單的文字介面,而
prove是在 Perl 中執行 TAP 測試的標準框架。由於 Perl 隨處可見,使用 TAP 和prove最後會成為許多語言(包括 YAMLScript)測試套件的絕佳選擇。
use敘述會載入acronym.ys解答程式,讓這個測試檔能夠進行測試。
我們所有的測試都放在test鍵底下的 YAML 序列裡。
最後一行done:是必要的,用來告訴測試框架所有測試都確實執行過了。那個數字(可有可無)代表我們預期要執行的測試數量。
test鍵底下的每個測試都是一個映射,包含以下的鍵值對:
name: - 測試標籤,會由prove -v印出。code: - 要執行的 YAMLScript 程式碼。
這段程式碼會呼叫我們正在開發的解答程式中的某個函式。what: - 對於預期會發生錯誤的測試,值是error。
一般測試則不會有這一對。want: - 測試的預期結果。
這是一個 YAML 值,可能是字串、數字、布林、序列或映射。
如果what:是error,那麼這個值就是預期的錯誤訊息。SKIP: - 設為true即可跳過執行該測試。ONLY: - 設為true即可只執行該測試。
如果你有一個以上的ONLY:測試,每一個都會被執行。這樣應該就是你在 Exercism 練習中用 YAMLScript 進行測試驅動開發時所需要知道的一切了!
ys::taptest函式庫還有其他功能,可以用來撰寫更複雜的測試,不過 Exercism 的測試都已經幫你寫好了。想進一步了解ys::taptest函式庫,請參閱說明文件。