我怎样才能记录一系列 TAP 测试的结果,同时保持对用户的输出分开?

How can I log the results of a series of TAP tests, while keeping the output to the user separate?

我有一系列的测试,我 运行 通过 Test::Harness。到目前为止,我对测试的冗长程度感到非常满意:用户知道 运行 的测试数量和成功的测试数量,以及测试的总体结果:

/home/user/project/t/01.my_test.t .. ok
All tests successful.
Files=1, Tests=136, 15 wallclock secs ( 0.03 usr  0.00 sys + 13.84 cusr  0.55 csys = 14.42 CPU)
Result: PASS

但是,我想将每个测试的输出记录到一个单独的文件中,以后可以检查。 运行 测试时的常规输出应该仍然相同(聚合),但是 test.log(或者它被命名)应该包含每个测试的特定结果的信息 运行(希望包括输出的任何其他部分,如注释等)。

我最接近的是使用 Capture::Tiny 捕获整个输出,然后自己手动处理。但除了这很麻烦且容易出错之外,输出是作为一个整体处理的,所以虽然测试 运行ning 没有什么可显示的。我想避免这种情况。

我也看过TAP::Harness::Archive,但是我没法把它弄到运行,所以我不确定它是否可以用于此。

最好的方法是什么?

编辑

我正在实施一个伪包管理器,我运行宁的测试是安装过程的一部分。安装包后会对其进行测试,如果测试失败,安装将中止。

这现在作为 package 对象的 test 方法实现。我认为,因为这必须在多个不同的平台上 运行,所以在 Perl 中做事可能是一个更好的主意,而不必调用系统命令(包括 prove),但我准备好改变我的方式了。

现在 运行 的测试是这样的:

use Path::Class;
my @tests;
while (my $file = readdir(DIR)) {
  push @tests, file($path, $file) if ($file =~ /\.t$/);
}
@tests = sort @tests;

# Run the tests
my $harness = TAP::Harness->new({
  failures  => 1,
  exec => [ 'myinterpreter' ],
});
my $aggregator = $harness->runtests(@tests);

if ($aggregator->all_passed) { return 1 } else { return 0 }

您可以 运行 使用工具 prove 进行测试。它提供选项 -a 以 TAP 格式归档每个 运行。然后可以稍后处理,例如Archive::TAP::Convert.

这里我运行模块目录下的工具,代码在lib,测试在t:

prove -a tests.tgz -Ilib t/

结果显示在终端上,并在文件 tests.tgz 中捕获。

也许不是您要找的东西?但它有效并且坚固。当工具已经存在时,您应该使用它们。

注意: 根据 Michael Carman 的评论,“prove 只是 App::Prove 的一个(非常薄的)包装器。如果你'要避免系统调用,您可以直接使用该模块。"