1

我想捕获我的脚本的 TAP 输出,将它与一些附加信息一起写入我的同事的 openoffice 文档中,并作为我的正常 TAP 输出到控制台中。这必须在(!)我的脚本中完成。

我猜 TAP::Parser 是我应该走的路,对吧?我不知道怎么做,我找不到一个简单的例子。如果我有这样的脚本:

#!/usr/bin/perl

use strict;
use warnings;
use Test::More tests => 2;

is( 1 + 1, 2, "one plus one is two" );
#missing code to capture the result of the test above

is( 1 + 1, 11, "one plus one is more than two" );
#missing code to capture the result of the test above

如何获得每次测试的结果?创建一个openoffice文档不是问题。

TAP::Parser 是做我想做的事情的正确方法吗?

谢谢

萝莉

4

2 回答 2

2

捕获输出的一种简单方法是使用标志--archive来证明。这会将测试套件输出连同结果摘要一起保存在 tarball 中。您还应该使用该--merge标志以便捕获 STDERR。

$ prove --archive test_out.tgz --merge my_test.pl
my_test.pl .. ok   
All tests successful.
Files=1, Tests=3,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.01 cusr  0.00 csys =  0.02 CPU)
Result: PASS

TAP Archive created at /home/you/test_out.tgz

一旦你有了它,你可以在闲暇时读回它,用 TAP::Parser 重新解析它,然后用它做你喜欢的事情。

use TAP::Parser;

my $tap_file = shift;
open my $tap_fh, $tap_file or die $!;

# Can't just pass in the .t file, it will try to execute it.
my $parser = TAP::Parser->new({
    source => $tap_fh
});

while ( my $result = $parser->next ) {
    # do whatever you like with the $result, like print it back out
    print $result->as_string, "\n";
}

如果由于某种原因您不能/不会使用证明,您可以将捕获代码插入到您的脚本中。我强烈建议您不要这样做,因为您必须为每个测试脚本执行此操作,它必须硬编码到测试中,这使得它们对正常测试不太有用(即通过证明或 Test::Harness 运行测试(证明是只是一个包装))。您还必须做一些花哨的工作,以确保您捕获测试的完整输出,任何发送到 STDERR 或 STDOUT 的警告,而不仅仅是测试输出。

所以在我解释之前,因为你是手动运行测试程序(你不应该这样做),所以这里是你如何使用 bash shell 来做的。

perl my_test.pl > test.out 2>&1

如果这对您有用,请使用它。将其硬编码到脚本中是不值得的。

您仍然必须使用上面的 TAP::Harness 脚本之类的东西来处理 test.out 以从中获取意义,但这将捕获程序的完整输出。您可以一步完成,再次使用 shell 重定向。

perl my_test.pl 2>&1 | tap2oo

其中 tap2oo 是将 TAP 转换为 Open Office 文档的程序。

于 2012-12-08T22:32:08.237 回答
1

你可以为 App::Prove 写一个插件。一个很好的参考/起点是Test::Pretty

于 2012-12-08T20:28:14.057 回答