Shiro(2009/07/07 02:59:40 PDT): Shibuya.lisp TT#3の懇親会にて、gauche.testの機能追加の話がちょっと出たので考えてみた。 使い勝手が良くなるなら機能を足すこと自体は問題ない。ただ、やたらにAPIを増やすのは却ってわかりづらいので、組み合わせで済むものなら(よっぽど便利にならない限りは)足さないんじゃないかな、というのはある。 なので、私があまり積極的でない機能を足してほしいという方は、「こういう理由で便利なんだよ!」と私を説得してくださいな。
0.8.14までは<test-error>オブジェクトのひとつのインスタンスが*test-error* に束縛されてて、結果として上がってくるものが<test-error>かどうかを 調べる、という形が推奨だったんですが:
(test* name *test-error* エラーを上げる式)
これには2つ欠点がありました。
(test* name <read-error> (guard (e (else (class-of e))) expr))
これについては既に次のように改善してtrunkにコミットしてあります。
これを使うと、例えばexprが<read-error>を上げるかどうかはこう書ける:
(test* name (test-error <read-error>) expr)
exprが上げるのは<read-error>のサブクラスであっても構いません。
failすることが期待されるテストって矛盾してるじゃん、 そもそも期待されてるなら、その結果をexpectすれば単なるsuccessになるから 意味ないじゃん、と思っていたのですが、 「環境によってはfailする場合がある」というテストを 書いておくのに便利だな、ということに気づきました。
これはtest-moduleの発展形なんだけれど、 koguroさんの[glint http://homepage.mac.com/naoki.koguro/prog/codecheck/index-j.html]的 なことをテスト時にやれないか、ということです。
Gaucheでは実行時のon-the-flyのコンパイル時間が短いことも重要なので、 実行時compileであまり重いチェックが出来ません。 でもテスト時なら少々時間を食ってもいいので、 グローバルな依存関係を見れば、手続きの引数の違いや 型の違いなどまである程度追えるんじゃないかと思います。
テストが失敗した場合、標準出力に出るサマリに失敗した結果が含まれますが ("discrepancy found" のところ)、実行結果が巨大だとこれがかなり見にくいです。 例えば大きなSXMLを生成するのとか。Common Lispの省略記法みたいな感じで 短縮できるといいかな、と思ってます。 必要があればログを見てもらうと全部出てる、ということで。
特定のfailureだけ潰している時は、テスト全部を毎回走らせるのは 重いことがあります。
指定した文字列やregexpにマッチする名前を持つ test-sectionだけ走らせる、というのはできるかな、と思ってます。
テストの前処理や後処理に副作用を使ってる場合、 それがトップレベルにべたで書いてあると選択的に実行するのが難しくなりますが、 そのへんも含めて構造化する構文を導入すべきか、 それともトップレベルの実行を何らかの方法でハックするか、というのは 思案中ですが。
JUnitとかにはassertTrueとかassertFalseとかありますが、Schemeのような 無名関数が簡単にかける言語でこれらを使うメリットがよくわからないんですね。 というのは、
(test* name ナニカ 結果を返す式 rがナニカに沿っているかどうかテストする手続き)
で、JavaやC++ではこのrがナニカに沿っているかどうかテストする手続きを さらっと書くのが面倒だからわざわざassertTrueが用意してあるんじゃないか、 と私は思っていましたよ。
今のGaucheでも、
(test* name #t test-expr)
と書くのは本来は述語をテストしたい場合だけに止め、できる限りexpectedの ところには具体的な値を書くべきじゃないか、と思ってます。つい#tにしたくなっちゃう 気持ちはわかるし、私もそういうテストをたくさん書いてるんですが、 例えばmy-funcの戻り値が文字列であることをテストしたいなら、
(test* name #t (string? (my-func)))
ではなく、
(test* name <string> (class-of (my-func)))
あるいは
(test* name <string> (my-func) (lambda (t r) (is-a? r t))
と書くのがいいんじゃないかと。
で、これだと長くなっちゃうんで、最後のやつをマクロにして
(test-type* name type expr)
と書けるようにする、というのはありだと思います。
kou (2009/07/07 04:39:20):
kou (2009/07/07 04:42:37):
shiro (2009/07/07 05:10:03):
shiro (2009/07/07 05:15:20):
koguro (2009/07/07 06:32:59):
higepon (2009/07/07 07:44:53):
naoya_t (2009/07/07 08:36:48):
shiro (2009/07/07 15:44:27):
koguro (2009/07/08 06:04:29):