2011年07月30日
皆さん subtest 使ってますか?僕はよく使ってます。
でも最近いろいろとアレげだなーと思っていることがあって、適当に Test::Flatten とかいう謎モジュールをでっち上げてみました。
xaicron/p5-Test-Flatten - GitHub
キャプションが最後に来る
use Test::More; subtest 'foo' => sub { pass 'ok'; }; done_testing;
というようなテストを走らせた場合の TAP 出力は以下のようになりますが、その subtest が終わったあとになって初めて「ああ、このテストは foo だったのかー」とわかります。
$ prove -lvc t/foo.t t/foo.t .. ok 1 - ok 1..1 ok 1 - foo 1..1 ok
その subtest の開始時に見たいですね。
本当のテスト数がまとめられてしまう
use Test::More; subtest 'foo' => sub { pass 'bar'; pass 'baz'; }; done_testing;
$ prove -lvc t/foo.t t/foo.t .. ok 1 - bar ok 2 - baz 1..2 ok 1 - foo 1..1
こんなかんじで、テスト数が、subtest 1つで 1 としてカウントされてしまいます。
例えば、実際にどの位の数のテストを本当に行っているかを集計したい場合とかは、ちょこっと悲しい感じです。
いっぱいテスト書いたのに、結果が超少ない!とかなってしまう!!(まぁ別にテストの数を競うゲームとかじゃないしいいんですけど)
fork したテストが壊れる
fork したテストは、Test::More 自体ではそもそも壊れるのですが、Test::SharedFork を使うことで正しくテストを行うことができます。
しかし、subtest を使った場合は、いい感じになりません。テストのカント数が混ざったりなんだりでぐちゃぐちゃです><*1
そもそも以下のテストがコケませんし。なんてっこった!
use Test::More; subtest 'foo' => sub { pass 'parent one'; pass 'parent two'; my $pid = fork; unless ($pid) { pass 'child one'; pass 'child two'; fail 'child three'; exit; } wait; pass 'parent three'; }; done_testing;
t/foo.t .. ok 1 - parent one ok 2 - parent two ok 3 - child one ok 4 - child two not ok 5 - child three # Failed test 'child three' # at t/foo.t line 13. ok 3 - parent three 1..3 ok 1 - foo 1..1 ok
というわけで、全部解決する Test::Flatten をかいたよー
使い方はベリーシンプルで、Test::More と一緒に use するだけです。ロード順も特に気にしなくて OK。
use Test::More; use Test::SharedFork; use Test::Flatten; subtest 'foo' => sub { pass 'parent one'; pass 'parent two'; my $pid = fork; unless ($pid) { pass 'child one'; pass 'child two'; fail 'child three'; exit; } wait; pass 'parent three'; }; done_testing;
これを気ままに実行すると、

みたいな感じになって、いいかんじですね!!
実装としては、Test::More::subtest を上書きして、ただ渡されたテストコードを実行してるだけです。
キャプションはテストを走らせる前に、note で出力しているので、make test の時とかは普通に消えてくれます。
ボーダーの色を変えることもできますが、ちょこっとこのあたりは変更予定。
追記
ちなみに、
$ prove -lvc --exec "perl -MTest::Flatten" t/foo.t
とかすると、既存の Test::Flatten を使ってないテストもいい感じになります。
- *1 : これは Test::SharedFork をにパッチを送るべきなのかもしれないですが、結構大変そう...
コメント一覧
この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
更新された場合に、より良く、より面白いかもしれ
更新された場合に、より良く、より面白いかもしれ

