我怎样才能记录一系列 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 的一个(非常薄的)包装器。如果你'要避免系统调用,您可以直接使用该模块。"
我有一系列的测试,我 运行 通过 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 的一个(非常薄的)包装器。如果你'要避免系统调用,您可以直接使用该模块。"