我使用 Perl 的
Test::more
编写了一些测试框架,特别是使用 ok($test_result, $test_description)
。
由于一些测试“集群”,我编写了一个执行多个ok()
测试的子程序,主程序调用这样的子程序。
现在测试失败的问题是:
Test::More
输出子例程中的行号(直接调用者),但我希望输出“调用者的调用者”(间接调用者)行。
这可能吗?
想象代码类似于这样:
#!/usr/bin/perl
use 5.18.2;
use warnings;
use strict;
use Test::More;
sub foo(@)
{
# do something magical
return undef;
}
sub foo_OK(@)
{
ok(foo(@_), 'foo_OK: ' . join(' ', @_)); # actually less trivial
}
sub complex_test(@)
{
foo_OK(qw(something special), @_);
foo_OK(qw(something else), @_);
#...
}
sub main()
{
complex_test(qw(abra kadabra));
complex_test(qw(more magic));
#...
}
main();
done_testing();
因此,如果
main
失败,我希望看到 test_OK
的行,而不是 ok()
的行。
如图所示,输出将是:
not ok 1 - foo_OK: something special abra kadabra
# Failed test 'foo_OK: something special abra kadabra'
# at /tmp/test.pl line 15.
not ok 2 - foo_OK: something else abra kadabra
# Failed test 'foo_OK: something else abra kadabra'
# at /tmp/test.pl line 15.
not ok 3 - foo_OK: something special more magic
# Failed test 'foo_OK: something special more magic'
# at /tmp/test.pl line 15.
not ok 4 - foo_OK: something else more magic
# Failed test 'foo_OK: something else more magic'
# at /tmp/test.pl line 15.
1..4
# Looks like you failed 4 tests of 4.
Test::More 不支持此功能。我正在查看 Test::More 源代码,我发现了这个:
my($pack, $file, $line) = $self->caller;
...
$result->{fail_diag} = (" $msg test ($file at line $line)\n");
也许我看错了部分。为了百分百确定,您可以临时修改该行(例如将
$msg
更改为 ZZZ$msg test
),然后查看是否收到修改后的消息。