Мне нужно создать модульные тесты для среды с очень старой версией Test::More
(perl5.8 с $Test::More::VERSION being '0.80'
), которая предшествует добавлению done_testing()
.
Обновление до новой версии Test :: Больше не обсуждается по практическим соображениям. И я стараюсь избегать использования 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{}
и после него.
Другой подход - эмулировать done_testing()
, вызывая Test::More->builder->plan(tests=>$total_tests_calculated)
. Я не уверен, что идиоматически лучше.