Обрабатывать тесты, используя 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 });
    }
}
Другие вопросы по тегам