Test :: Most - 使用stacktrace报告测试失败

时间:2015-01-02 23:45:37

标签: perl

我正在修复一个大型测试脚本(> 1000行),它使用一些实用工具方法(也包括1000行)对各种初始数据设置执行重复测试。这有助于整合代码。但是,当测试失败时,它会报告实用程序方法内部的行号,这使得很难跟踪哪个测试失败。

当测试失败时,是否可以将Test::Most配置为提供堆栈跟踪而不是单个行号?

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

use Test::Most tests => 3;

ok(1, 'first test');

note "The following includes a failed test, but a stack trace would be more helpful";

helper_sub_with_test();       # Line 13

ok(1, 'third test');

sub helper_sub_with_test {
    ok(0, "second test");     # Line 17
}

输出:

$ perl scratch.pl 
1..3
ok 1 - first test
# The following includes a failed test, but a stack trace would be more helpful
not ok 2 - second test
#   Failed test 'second test'
#   at scratch.pl line 17.
ok 3 - third test
# Looks like you failed 1 test of 3.

正如您所看到的,如果失败的测试报告了对实用程序方法进行多次调用时第17行和第13行,将会很有帮助。

2 个答案:

答案 0 :(得分:4)

我不相信Test :: More基础设施提供了这样的野兽,但你真的需要一个堆栈跟踪吗?只要您为测试提供描述性名称,报告第13行就足够了。

要报告第13行而不是第17行,只需将以下内容添加到您的子文件中:

local $Test::Builder::Level = $Test::Builder::Level + 1;

更长的例子:

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

use Test::Most tests => 3;

ok(1, 'first test');

note "The following includes a failed test, but a stack trace would be more helpful";

helper_sub_with_test();       # Line 13

ok(1, 'third test');

sub helper_sub_with_test {
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    ok(0, sprintf "second test (look at line %d)", __LINE__);     # Line 18
}

答案 1 :(得分:3)

获得所需内容的快速而肮脏的方法是在Test :: Builder :: ok周围放置一个包装器。这就是Test :: Most的运作方式。

使用Aspect可以减少黑客攻击。

use Carp qw(longmess);
use Test::Most;
use Aspect;

after {
    # For some reason, the return value is not being captured by Aspect
    my $last_test = ($_->self->summary)[-1];
    print longmess if !$last_test;
} call "Test::Builder::ok";

sub foo { ok(0) }

foo();
pass;

done_testing;