読者です 読者をやめる 読者になる 読者になる

一角獣は夜に啼く

ただの日記です。

思ってることとか考えたこととか適当に書きます。 まじめな話は 「ひだまりソケットは壊れない」 に書いています。

Test::Class と subtest を組み合わせた場合に、とあるテストメソッドの subtest 内で例外が発生してしまうと、それ以降の別のテストメソッドの subtest も全部失敗してしまうっぽい?


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 で確認。