Как вручную создать 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
отображается в разных строках для разных тестов. Вот скриншот:
Я написал тестовые сценарии, которые использует 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 для вывода крана. Каждый из них является основным модулем. Это, по-видимому, то, что делает большинство тестовых модулей.