我用Test::More
和Test::Deep
写了一个大测试。 该测试包含子测试。 当我运行的代码,在最后一行我得到:使用Test :: More和Test :: Deep打印失败的子测试
# Looks like you failed 3 tests of 25.
如何打印指定失败的子测试的总结? (每个子测试都有一个标题。)
我用Test::More
和Test::Deep
写了一个大测试。 该测试包含子测试。 当我运行的代码,在最后一行我得到:使用Test :: More和Test :: Deep打印失败的子测试
# Looks like you failed 3 tests of 25.
如何打印指定失败的子测试的总结? (每个子测试都有一个标题。)
简答:你不能。
稍微长一点的答案:您必须补丁Test::Builder或TAP::Harness。
Hacky回答:在子测试函数中包含名称和结果(subtest(),与所有测试函数类似,在传递时返回true,在失败时返回false),并在END块中输出额外的摘要信息。实施留给读者。
TL; DR信息...
Test::Builder(从而对整个生态系统测试)不报告在摘要测验。我不相信Test :: Builder的发布版本(0.9x)存储了子测试的结果。在Test :: Builder 0.9x中,子测试是一种可怕的黑客攻击。 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将需要修补理解测验,这将是非常欢迎的。
各地分测验的包装纸,使用Test::More's own subtest function为指导,应该是这样的:
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's。函数的主体看起来是一样的,但是替换Perl函数的技术是另一个问题的主题。
谢谢! 我没有设法使用测试::生成器并正确包装子测试..你能帮我一些例子吗? – user1836185
更新了一个例子。 – Schwern
请包括一些代码,因为答案取决于你做了什么。 –
'prove -v ...' –
用'perl test.t'而不是'prove'运行它们。 – simbabque