使用TAP :: Harness处理测试,如何在测试退出时打印输出

时间:2013-10-06 15:03:19

标签: perl testing junit formatter tap-harness

我正在努力寻找答案,但我没有找到任何答案。 我使用 test :: more (test1.t,test2.t,test3.t ...)编写了一些测试。 我写了一个主要的perl脚本(main.pl),它使用 TAP :: Harness 处理所有测试,并使用 formatter_class =>以JUnit格式打印输出。 “TAP ::格式化:: JUnit的即可。 在我的测试中,我使用BAIL_OUT函数。 问题是,当测试被保释时,主脚本也会退出,根本没有输出。如果,例如test3.t bailed_out,我需要查看test1.t和test2.t的结果。我怎么能这样做?

我不能使用exit或die而不是BAIL_OUT,因为我不希望其他测试继续。 (如果test3.t是BAIL_OUT,我不希望test4.t运行。)

有人可以帮帮我吗? 我需要查看在保释测试之前运行的测试的结果。

感谢。

2 个答案:

答案 0 :(得分:0)

根据Test::More文档:

  

BAIL_OUT($原因);

     

向线束表明事情进展如此糟糕,所有测试都应终止   这包括运行任何其他测试脚本。

这就解释了为什么你的套房会中止。

您可能需要考虑来自Test::Mostdie_on_fail的{​​{1}},具体取决于BAIL_OUT的原因。

编辑:看起来Test :: Builder在“灾难性失败”according to the source code退出时无意打印摘要:

skip_all

但是,sub BAIL_OUT { my( $self, $reason ) = @_; $self->{Bailed_Out} = 1; $self->_print("Bail out! $reason"); exit 255; } # Don't do an ending if we bailed out. if( $self->{Bailed_Out} ) { $self->is_passing(0); return; } 标志仅用于考虑打印摘要诊断,并且由于Bailed_Out公开了基础Test::More对象,您可能只需调整Test::Builder子程序并没有设置这个标志。当然,所有未经测试的; YMMV。

答案 1 :(得分:0)

不是将所有测试传递给一个TAP :: Harness,而是在BAIL_OUT

的情况下,您需要一次传入一个测试到线束

我还没有看到你的代码,所以这里是我的意思的样本。调整以包括格式化程序和您需要的任何其他内容。

use TAP::Harness;

my $harness = TAP::Harness->new({ merge => 0 });
my $tests = ['t/test1.t', 't/test2.t'];

foreach my $test (@$tests) {
    eval {
        $harness->runtests([$test]);
    }; if ($@) {
        # create new harness object if the previous fails catastrophically.
        $harness = TAP::Harness->new({ merge => 0 });
    }
}