結城浩
2003年7月26日
子供を連れてお出かけ。
帰ってきてから、最近作っているCGIのUnitTestを作り始める。 Test::Unitを入手して、perldocを読む。 自分が作ったクラスに対応したTest::Unit::TestCaseのサブクラスを作る。 その後、AllTestsというCompositeクラスを作って、 TestRunner.plからAllTestsをテスト。 まずはOKになって当たり前のテストから、と思ったらいきなりバグを見つけてしまった。 苦笑。
Perlだと、すさまじいテストが1行で書けたりする。 たとえばこんなの。 sanitize関数を通したら、文字が全部エスケープされるというテスト (sanitizeとcontains_invalid_charをテストしている)。
sub test_sanitize_many1 { shift->assert(not contains_invalid_char(sanitize(join("", "\x00".."\xFF"))); }
join("", "\x00".."\xFF")
という部分で、256バイト長の文字列を一気に作っている。
さらに作業。 順番が逆になっちゃったけれど、h2xsでモジュールのボイラープレートを作り、 t/1.tを削除してt/all_tests.tを作り、この中でTestRunnerを動かすようにしてみた。 そうすると、perl Makefile.PLして、nmake testするとちゃんと自分が作ったUnitTestが動く。 めでたい。
こういうときに参考になるのがEffective Perlという本ですね。
さらに作業。 次のモジュールのテストケースを作ってみる。 テストケースを作りながらコーディングすると、 引数のチェックとかをきちんとやるようになりますね。 それから、ユニットテストしやすいモジュールを作ると、 モジュール間の連携を疎になるようにしようという気持ちが働きますね。 低結合(low coupling)の心。
もっと作業。 うーん、テストが増えてくると、どんどん楽しくなるね。 気になったところをテストに追加していると、 何だか安心してコーディングやリファクタリングができる。 いま30個ほどテストがあるが、実行するのに1秒くらい。 ちょっとコーディングしてはテストして、おかしくないことを確かめつつ進む感覚だ。