【发布时间】:2009-10-02 22:34:45
【问题描述】:
我有一个使用Test::More 编写的 Perl 测试脚本。就在退出之前,如果所有测试都通过了,我想执行一些清理操作。如果有任何测试失败,我想保留一切以进行故障排除。
Test::More 中是否有一个标志,或者在单个测试脚本中是否有其他一些最佳实践,以便在测试本身完成后判断“一切正常”?
【问题讨论】:
标签: perl unit-testing
我有一个使用Test::More 编写的 Perl 测试脚本。就在退出之前,如果所有测试都通过了,我想执行一些清理操作。如果有任何测试失败,我想保留一切以进行故障排除。
Test::More 中是否有一个标志,或者在单个测试脚本中是否有其他一些最佳实践,以便在测试本身完成后判断“一切正常”?
【问题讨论】:
标签: perl unit-testing
您可以通过Test::Builder 访问测试的当前状态,可通过Test::More->builder 获得:
use strict;
use warnings;
use Test::More tests => 1;
ok(int rand 2, 'this test randomly passes or fails');
if (Test::More->builder->is_passing)
{
print "hooray!\n";
}
else
{
print "aw... :(\n";
}
或者,您可以在脚本末尾进行清理,但如果出现问题,请提前退出,使用Test::More 的BAIL_OUT("reason why you are bailing");。
您可以收集许多其他关于测试状态的数据和统计信息;请参阅Test::Builder 的文档。
【讨论】:
这是我为了避免此答案底部显示的“无法定位对象方法”错误而提出的:
#! /usr/bin/perl
use strict;
use warnings;
use Test::More tests => 1;
ok(int rand 2, 'this test randomly passes or fails');
my $FAILcount = 0;
foreach my $detail (Test::Builder->details()) {
if (${%$detail}{ok}==0) { $FAILcount++; }
}
if ($FAILcount == 0) {
print "hooray!\n";
} else {
print "aw... :(\n";
}
在 Solaris 10 上,使用 Perl v5.8.4(带有 31 个注册补丁),我得到了以下内容
Can't locate object method "is_passing" via package "Test::Builder"
【讨论】: