4

Test::More我用and写了一个大测试Test::Deep。该测试包含子测试。当我运行代码时,在最后一行我得到:

# Looks like you failed 3 tests of 25.

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

4

1 回答 1

7

简短的回答:你不能。

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

于 2013-01-13T00:34:55.197 回答