1

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

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

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

谢谢。

4

2 回答 2

0

根据Test::More文档:

BAIL_OUT($原因);

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

这就解释了为什么您的套件会中止。

根据 BAIL_OUT 的原因,您可能需要考虑die_on_failfromTest::Most或。skip_all

编辑:看起来 Test::Builder根据源代码在“灾难性故障”退出时无意打印摘要:

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对象,您可能只需调整BAIL_OUT子例程而不设置此标志。当然,所有都未经测试;YMMV。

于 2013-10-06T15:29:16.583 回答
0

无需将所有测试传递给一个 TAP::Harness,您需要一次将一个测试传递给 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 });
    }
}
于 2013-10-07T21:11:24.703 回答