2013-01-12 41 views
3

我用Test::MoreTest::Deep写了一个大测试。 该测试包含子测试。 当我运行的代码,在最后一行我得到:使用Test :: More和Test :: Deep打印失败的子测试

# Looks like you failed 3 tests of 25. 

如何打印指定失败的子测试的总结? (每个子测试都有一个标题。)

+0

请包括一些代码,因为答案取决于你做了什么。 –

+2

'prove -v ...' –

+0

用'perl test.t'而不是'prove'运行它们。 – simbabque

回答

6

简答:你不能。

稍微长一点的答案:您必须补丁Test::BuilderTAP::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函数的技术是另一个问题的主题。

+0

谢谢! 我没有设法使用测试::生成器并正确包装子测试..你能帮我一些例子吗? – user1836185

+0

更新了一个例子。 – Schwern

相关问题