Test::More
我用and写了一个大测试Test::Deep
。该测试包含子测试。当我运行代码时,在最后一行我得到:
# Looks like you failed 3 tests of 25.
如何打印指定失败子测试的摘要?(每个子测试都有一个标题。)
Test::More
我用and写了一个大测试Test::Deep
。该测试包含子测试。当我运行代码时,在最后一行我得到:
# Looks like you failed 3 tests of 25.
如何打印指定失败子测试的摘要?(每个子测试都有一个标题。)
简短的回答:你不能。
稍微长一点的答案:你必须修补Test::Builder或TAP::Harness。
Hacky answer:在 subtest 函数周围放置一个包装器,该函数捕获名称和结果(subtest() 与所有测试函数一样,通过时返回 true,失败时返回 false)并在 END 块中输出额外的摘要信息。实施留给读者。
tl;博士信息...
Test::Builder(以及整个测试生态系统)不会在摘要中报告子测试。我不相信 Test::Builder 的发布版本(0.9x)根本不会存储子测试的结果。在 Test::Builder 0.9x 中,子测试是一种可怕的 hack。Test::Builder 1.5 更优雅地处理子测试,所以如果你想打补丁,我会针对 1.5 做。
TAP::Harness(并因此证明)不理解子测试,就它而言,它的垃圾被忽略了。为了解决这个问题,每个子测试最后都会产生一个额外的测试,这是 Test::Harness 所理解的。
# TAP::Harness sees this line, the overall plan.
1..1
# All this indented subtest info is ignored by TAP::Harness.
ok 1
ok 2
not ok 3
1..3
# Looks like you failed 1 test of 3.
# TAP::Harness sees this line, and that all it knows about the subtest
# It doesn't even know its a subtest.
not ok 1 - foo
TAP::Harness需要修补才能理解子测试,这将是非常受欢迎的。
subtest 的包装器,使用Test::More 自己的 subtest 函数作为指导,看起来像这样:
use Test::Builder;
my @Failed_Subtests;
sub my_subtest {
my $name = shift;
# Call subtest
my $tb = Test::Builder->new;
my $subtest_ok = $tb->subtest($name, @_);
# Record the name of any failing subtests
push @Failed_Subtests, $name if !$subtest_ok;
return $subtest_ok;
}
# When the test is over, show the failed subtests
END {
if( @Failed_Subtests ) {
diag sprintf "These subtests failed: %s", join(", ", @Failed_Subtests);
}
}
如果你使用my_subtest
而不是subtest
你会得到类似的东西:
# These subtests failed: bar, baz
# Looks like you failed 2 tests of 3.
您可以替换 Test::More 的,而不是定义新的子测试函数。函数的主体看起来是一样的,但是替换 Perl 函数的技术是另一个问题的主题。