我必须在一个非常旧的环境中构建单元测试,使用的是早期版本的
由于实际原因,升级到较新的Test::More并不可行。而我试图避免使用
详细信息:
我的单元测试通常采用以下形式: use Test::More; my @test_set = ( [ "Test #1", $param1, $param2, ... ] ,[ "Test #1", $param1, $param2, ... ] # ,... );
foreach my $test (@test_set) { run_test($test); }
sub run_test { # $expected_tests += count_tests($test); ok(test1($test)) || diag("Test1 failed"); # ... }
标准方法
我的当前方法涉及使
Test::More
(perl5.8,其中$Test::More::VERSION为'0.80'
),它还没有添加done_testing()
。由于实际原因,升级到较新的Test::More并不可行。而我试图避免使用
no_tests
- 不捕获单元测试过早退出的情况通常是一个坏主意 - 比如由于某些逻辑未按预期执行时。
最惯用的运行可配置数量的测试的方法是什么,假设没有使用no_tests
或done_testing()
?详细信息:
我的单元测试通常采用以下形式: use Test::More; my @test_set = ( [ "Test #1", $param1, $param2, ... ] ,[ "Test #1", $param1, $param2, ... ] # ,... );
foreach my $test (@test_set) { run_test($test); }
sub run_test { # $expected_tests += count_tests($test); ok(test1($test)) || diag("Test1 failed"); # ... }
标准方法
use Test::More tests => 23;
或BEGIN {plan tests => 23}
无法正常工作,因为两者显然都在@tests
之前执行。我的当前方法涉及使
@tests
全局并在BEGIN {}
块中定义它,如下所示:
use Test::More;
BEGIN {
our @test_set = (); # Same set of tests as above
my $expected_tests = 0;
foreach my $test (@tests) {
my $expected_tests += count_tests($test);
}
plan tests => $expected_tests;
}
our @test_set; # Must do!!! Since first "our" was in BEGIN's scope :(
foreach my $test (@test_set) { run_test($test); } # Same
sub run_test {} # Same
我感觉这可以更加惯用,但不确定如何改进。其中最大的问题是重复的our @test_test
声明 - 在BEGIN{}
和其后面。另一种方法是通过调用Test::More->builder->plan(tests=>$total_tests_calculated)
来模拟done_testing()
。我不确定这在惯用性方面是否更好。
done_testing
,而只是使用no_plan
。你可能会花更多的时间在入侵上,调整计划次数,并引入更多的测试不稳定性,这比很少失败的no_plan错失更多的时间。当然,此时您必须将该黑客分解为模块以在多个位置使用它,此时最好拥有Test :: More的本地副本。这是您遇到的真正问题还是您一直在阅读反no_plan的宣传? - Schwern