Как вручную создать TAP output

существует большой модуль Perl Test:: More что все используют для модульное тестирование. Вот очень простой скрипт t/sample_1.t:

use Test::More tests => 1;

fail('This test fails');

Я хотел написать скрипт, который делает то же самое, но без Test:: More.

Я прочитал несколько документов о TAP (test anything protocol), чтобы узнать, как написать сценарий. Я читал:

к сожалению, документации не достаточно. Мне пришлось изучить вывод скрипта, который использует Test:: More, чтобы узнать, что мне нужно вывести диагностику в STDERR (в документах об этом ничего не было).

Итак, я написал сценарий, который делает то же самое, что и сценарий с Test::More script. Вот список t/sample_2.t:

$| = 1;

print "1..1n";
print "not ok 1 - This test failsn";
print STDERR "#   Failed test 'This test fails'n";
print STDERR "#   at t/sample_1.t line 3.n";
print STDERR "# Looks like you failed 1 test of 1.n";

exit 1;

но при использовании prove эти 2 скрипта вывода разных вещи. Строка "# Failed test 'This test fails' " в prove отображается в разных строках для разных тестов. Вот скриншот:

Perl prove output for 2 sample unit tests

Я написал тестовые сценарии, которые использует Capture:: Tiny чтобы проверить, что stderr, STDOUT и код выхода для обоих сценариев идентичны. И сценарий показывает, что оба сценария выводят одно и то же.

Я сохранил все тестовые файлы и тестовый скрипт в GitHub РЕПО.

мой вопрос. Как написать модульный тест Perl без Test:: More, чтобы иметь тот же результат, что и с Test::More.

PS Если вам интересно, почему мне это нужно. Мне нужно это решить вопрос моего модуля Perl Test:: Пробелы.

2 ответов


наконец-то я узнал, что происходит.

Хоббс и посоветовал мне использовать Test:: Builder. Я создал тестовый скрипт с Test:: Builder что работал exaclty как скрипт с Test:: More (здесь это).

затем я начал examinig исходный код Test:: Builder чтобы выяснить, почему источник такого поведения. Вот часть lib/TB2/форматер/кран / база.pm файл:

# Emit old style comment failure diagnostics
sub _comment_diagnostics {
    my($self, $result) = @_;

    ...

    # Start on a new line if we're being output by Test::Harness.
    # Makes it easier to read
    $self->$out_method("\n") if ($out_method eq 'err') and $ENV{HARNESS_ACTIVE};
    $self->$diag_method($msg);

    return;
}

Итак, это ответ. prove настройка специальной переменной среды HARNESS_ACTIVE и тест:: больше и друзья кладут дополнительный символ разрыва строки "\n " перед любой диагностикой, которая печатается в STDERR.

наконец я создал тестовый скрипт, который выводит точно так же, как сценарий написано с тестом:: More. исходный код скрипта.

мне не нравится это решение. Это забрало меня и ее. peopler много времени выяснить, что происходит. Я уверен, что задача pretty output должна быть решается в парсерах крана, а не в производителях крана.

=(


хотя у меня нет абсолютно никакой идеи, что происходит, я могу получить выходы, чтобы соответствовать (визуально, по крайней мере), включив следующее Перед любым другим выходом в STDERR:

print STDERR "\r";

это делает их соответствовать визуально при запуске через prove или просто perl. Однако, это не какой тест::больше делает.

кран, который вы выводите, соответствует спецификации; если prove хочет рассматривать его иначе, чем TAP Test:: More выводит, я бы поспорил это ошибка (или, по крайней мере, странность) в prove. Лично когда я писал тестовые модули, я всегда использовал Test::Builder или wrapped Test::More для вывода крана. Каждый из них является основным модулем. Это, по-видимому, то, что делает большинство тестовых модулей.