Обрабатывать тесты, используя TAP::Harness, как печатать вывод при выходе из теста
Я целый день пытаюсь найти ответ, но ничего не нашел. Я написал несколько тестов, используя test:: more (test1.t, test2.t, test3.t...). и я написал основной Perl-скрипт (main.pl), который обрабатывает все тесты, используя TAP::Harness, и печатает вывод в формате JUnit, используя formatter_class => 'TAP:: Formatter:: JUnit. В своих тестах я использую функцию BAIL_OUT. Проблема в том, что когда тест выдается, основной сценарий также завершается, и вывод вообще отсутствует. Если, например, test3.t bailed_out, мне нужно увидеть результаты для test1.t и test2.t. Как мне это сделать?
Я не могу использовать выход или умереть вместо BAIL_OUT, потому что я не хочу, чтобы другие тесты продолжались. (Если test3.t был BAIL_OUT, я не хочу, чтобы test4.t запускался.)
Может кто-нибудь, пожалуйста, помогите мне? Мне нужно увидеть результаты тестов, которые проводились до выписанного теста.
Благодарю.
2 ответа
Согласно Test::More
документы:
BAIL_OUT ($ причина);
Указывает на то, что дела идут так плохо, что все испытания должны быть прекращены.
Это включает в себя запуск любых дополнительных тестовых сценариев.
Так что это объясняет, почему ваш набор прерывается.
Вы можете рассмотреть die_on_fail
от Test::Most
, или же skip_all
в зависимости от причины BAIL_OUT.
РЕДАКТИРОВАТЬ: Похоже, Test::Builder не собирается распечатывать резюме, когда он выходит из "катастрофического сбоя" в соответствии с исходным кодом:
sub BAIL_OUT {
my( $self, $reason ) = @_;
$self->{Bailed_Out} = 1;
$self->_print("Bail out! $reason");
exit 255;
}
# Don't do an ending if we bailed out.
if( $self->{Bailed_Out} ) {
$self->is_passing(0);
return;
}
Однако это Bailed_Out
Флаг всегда используется только для вывода на печать сводной диагностики, и так как Test::More
выставляет основной Test::Builder
объект, вы можете просто настроить BAIL_OUT
подпрограмма и не установить этот флаг. Все непроверенные, конечно; YMMV.
Вместо того, чтобы передавать все тесты одному TAP::Harness, вам нужно проходить по одному тесту за раз в случае BAIL_OUT
Я не видел ваш код, так что вот пример того, что я имею в виду. Отрегулируйте, чтобы включить форматер и все, что вам нужно.
use TAP::Harness;
my $harness = TAP::Harness->new({ merge => 0 });
my $tests = ['t/test1.t', 't/test2.t'];
foreach my $test (@$tests) {
eval {
$harness->runtests([$test]);
}; if ($@) {
# create new harness object if the previous fails catastrophically.
$harness = TAP::Harness->new({ merge => 0 });
}
}