unit test
2007/07/15
自分の脳味噌のふがい無さに、unit test toolの導入を決心しました。
common lisp用のunit test toolはいろいろあるようでした。
- CLUnit http://www.ancar.org/CLUnit/docs/CLUnit.html
- Lisp Unit http://www.cs.northwestern.edu/academics/courses/325/readings/lisp-unit.html
- HEUTE http://www.rdrop.com/~jimka/lisp/heute/heute.html
ぱっと見、CLUnitは良くも悪くも簡単そうでした。テストを実行する関数を指定してテストを行なうので、使うのは簡単だと思います。
しかし、JUnitに慣れてる身としては、テスト失敗したときに、期待値と実測値の差違を見れないと満足できません。
その点、Lisp Unitは、JUnitにインスパイアされて作られたそうで、期待どおりに見えました。
Lisp Unit を clisp で動かす
Lisp Unitのサイトの使い方を見ながらやってみました。
lisp-unit.lispをダウンロードする。
いつも、カレントディレクトリからロードする訳にもいかないので、emacsでいうsite-lispディレクトリを探して man clispしたらヒントが書いてありました。lisp-lib-dir は、*LIB-DIRECTORY* に格納されているパスだということがわかりました。
[1]> *lib-directory* #P"/usr/lib/clisp/"
cygwinのclispなので、C:\cygwin\lib\clisp *1 に、lisp-unit.lisp を格納しました。ここで、はまりました。*lib-directory* に格納してるのに、(load “lisp-unit.lisp”)ではロードできませんでした。clispで *lib-directory* は、emacsのsite-lispみたいなものじゃないのか?
[1]> (load "/usr/lib/clisp/lisp-unit.lisp") ;; Loading file /usr/lib/clisp/lisp-unit.lisp ... ;; Loaded file /usr/lib/clisp/lisp-unit.lisp t [2]> (use-package :lisp-unit) t [3]> (defun kakeru (a b) (+ a b)) ;テスト対象 間違った実装 kakeru [4]> (define-test kakeru (assert-equal 4 (kakeru 2 2)) (assert-equal 1 (kakeru 1 1))) kakeru [5]> (run-tests kakeru) kakeru: (kakeru 1 1) failed: Expected 1 but saw 2 kakeru: 1 assertions passed, 1 failed. [6]> (defun kakeru (a b) (* a b)) ;テスト対象 正しい実装 kakeru [7]> (run-tests kakeru) kakeru: 2 assertions passed, 0 failed.
Lisp Unitで書くテストは自然に書けて良いです。これから、しばらく Lisp Unitを使ってみます。
あと、実感したのは動的言語はテストファーストと相性がいい、ということです。
*1:cygpath -w /usr/lib/clisp の結果から