Test::Class と subtest を組み合わせた場合に、とあるテストメソッドの subtest 内で例外が発生してしまうと、それ以降の別のテストメソッドの subtest も全部失敗してしまうっぽい?
subtest を Test::Class と組み合わせると、とあるテストメソッド中の subtest 内で例外が発生した場合に他のテストメソッド内の subtest が問答無用で失敗になるっぽくて最悪だ。
— nobuoka (@nobuoka) 2013, 7月 13
@nobuoka 気になる
— 柴崎優季 (@shiba_yu36) 2013, 7月 13
Perl のテストで、Test::Class と subtest を組み合わせた場合に、とあるテストメソッドの subtest 内で例外が発生してしまうと、それ以降の別のテストメソッドの subtest も全部失敗してしまうっぽい?
package MyTest; use strict; use warnings; use parent qw( Test::Class ); use Test::More; sub t1 : Tests { subtest '死んでも大丈夫?' => sub { die '死にます'; }; } sub t2 : Tests { subtest '絶対通るはずのテスト' => sub { ok 1; }; } __PACKAGE__->runtests();
上のようなコードを prove -lvr で実行すると、
subtest_test.t .. # # MyTest->t1 # Child (死んでも大丈夫?) exited without calling finalize() not ok 1 - 死んでも大丈夫? not ok 2 - t1 died (死にます at subtest_test.t line 9.) # Failed test '死んでも大丈夫?' # at /home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/site_perl/5.8.8/Test/Class.pm line 269. # (in MyTest->t1) # Failed test 't1 died (死にます at subtest_test.t line 9.)' # at subtest_test.t line 19. # (in MyTest->t1) # # MyTest->t2 not ok 3 - t2 died (You already have a child named (死んでも大丈夫?) running at /home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/Test/More.pm line 747.) # Failed test 't2 died (You already have a child named (死んでも大丈夫?) running at /home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/Test/More.pm line 747.)' # at subtest_test.t line 19. # (in MyTest->t2) 1..3 # Looks like you failed 3 tests of 3. Dubious, test returned 3 (wstat 768, 0x300) Failed 3/3 subtests Test Summary Report ------------------- subtest_test.t (Wstat: 768 Tests: 3 Failed: 3) Failed tests: 1-3 Non-zero exit status: 3 Files=1, Tests=3, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.05 cusr 0.00 csys = 0.07 CPU) Result: FAIL
みたいな結果になった。
『Failed test 't2 died (You already have a child named (死んでも大丈夫?) running at /home/nobuoka/perl5/perlbrew/perls/perl-5.8.8/lib/5.8.8/Test/More.pm line 747.)'』 って書かれてるから、「死んでも大丈夫?」 って名前の subtest が悪いっぽいということはわかるけど、他のテストメソッドの subtest のせいで、本来通るはずの subtest に失敗するのはなんだかなー、という気持ちになる。
subtest の実装をちょっと調べてみたけど、prove 時のメッセージにもあるように finalize メソッドが呼ばれてないのがダメそうだなーという感じがある。
subtest の実装は Test::Builder モジュールの の subtest メソッドあたりを見れば良さそう。
Test::More のバージョン 0.98 で確認。