Захват и разделение вывода/результата TAP

я хочу поймать TAP-вывод моих скриптов, записать его с некоторой дополнительной информацией в документ openoffice для моих коллег и как обычный TAP-Output для меня в консоль. Это должно быть сделано внутри(!) моего скрипта.

Я предполагаю, что TAP::Parser - это путь, по которому я должен идти, верно? Я не знаю как, и я не могу найти простой пример. Если у меня есть скрипт вроде:

#!/usr/bin/perl

use strict;
use warnings;
use Test::More tests => 2;

is( 1 + 1, 2, "one plus one is two" );
#missing code to capture the result of the test above

is( 1 + 1, 11, "one plus one is more than two" );
#missing code to capture the result of the test above

Как я могу получить результаты каждого теста? Создать документ openoffice не проблема.

Является ли TAP::Parser правильным способом делать то, что я хочу?

Спасибо

роль


person roli    schedule 08.12.2012    source источник


Ответы (2)


Один простой способ зафиксировать выходные данные – использовать флажок --archive для подтверждения. Это позволит сохранить выходные данные набора тестов в tarball вместе со сводкой результатов. Вы также должны использовать флаг --merge, чтобы захватить STDERR.

$ prove --archive test_out.tgz --merge my_test.pl
my_test.pl .. ok   
All tests successful.
Files=1, Tests=3,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.01 cusr  0.00 csys =  0.02 CPU)
Result: PASS

TAP Archive created at /home/you/test_out.tgz

Получив это, вы можете прочитать его на досуге, повторно проанализировать его с помощью TAP::Parser и делать с ним все, что хотите.

use TAP::Parser;

my $tap_file = shift;
open my $tap_fh, $tap_file or die $!;

# Can't just pass in the .t file, it will try to execute it.
my $parser = TAP::Parser->new({
    source => $tap_fh
});

while ( my $result = $parser->next ) {
    # do whatever you like with the $result, like print it back out
    print $result->as_string, "\n";
}

Если по какой-то причине вы не можете/не хотите использовать доказательство, вы можете вставить код захвата в свой скрипт. Я бы НАСТОЯТЕЛЬНО РЕКОМЕНДОВАЛ ЭТОМУ ПРОТИВ, так как вы должны делать это для каждого тестового скрипта, он должен быть жестко запрограммирован в тесте, что делает их менее полезными для обычного тестирования (т.е. :: Harness (что доказывает, что это всего лишь оболочка)). Вы также должны проделать некоторые причудливые действия, чтобы убедиться, что вы захватили полный вывод теста, любые предупреждения, поступающие в STDERR или STDOUT, а не только вывод теста.

Итак, прежде чем я объясню это, поскольку вы запускаете тестовую программу вручную (чего делать не следует), вот как вы это делаете, используя оболочку bash.

perl my_test.pl > test.out 2>&1

Если это работает для вас, используйте это. Не стоит вдаваться в жесткое кодирование в скрипт.

Вам все еще нужно обработать test.out, используя что-то вроде сценария TAP::Harness выше, чтобы извлечь из него смысл, но это зафиксирует полный вывод программы. Вы можете сделать это за один шаг, опять же с перенаправлением оболочки.

perl my_test.pl 2>&1 | tap2oo

Где tap2oo — это ваша программа, которая переводит TAP в документ Open Office.

person Schwern    schedule 08.12.2012
comment
THX, я посмотрю, смогу ли я решить свою проблему с помощью этого совета. Я предполагаю, что нет (простого) способа захватить вывод TAP непосредственно внутри моего скрипта? Чтобы запустить тест, - person roli; 09.12.2012
comment
Под сценарием ты имеешь в виду сам тест? Да, вы можете изменить направление вывода теста с помощью методов вывода Test::Builder. Объект Test::Builder доступен через Test:: Подробнее-›строитель. Проблема в том, что A) это не будет фиксировать предупреждения и другие выходные данные, не относящиеся к тесту, и B) вы должны делать это в каждой тестовой программе, что громоздко. - person Schwern; 09.12.2012
comment
По сценарию должна быть замена #missing code для захвата результата теста выше, как я написал в примере моего первоначального постинга. Это может быть громоздко, но на самом деле я не вижу другого решения, поэтому я посмотрю, сможет ли Test::Builder помочь мне поймать TAP. - person roli; 10.12.2012
comment
@roli Мой ответ содержит другое решение, использующее prove --archive --merge для запуска тестов. Если есть причина, по которой вы не можете запустить тесты с помощью proof (это просто оболочка вокруг TAP::Parser), вы должны добавить ее в исходный пост, чтобы мы могли с ней работать. Вы действительно не хотите жестко кодировать это в каждом тесте. Поверьте мне, я знаю, о чем говорю. - person Schwern; 11.12.2012
comment
На самом деле я не понимаю, как я мог бы использовать доказательство, все должно происходить внутри скрипта .pl - person roli; 12.12.2012
comment
@roli Когда вы говорите сценарий .pl, вы имеете в виду сценарий .t? Или это какой-то другой сценарий, который вы не упомянули? - person Schwern; 12.12.2012
comment
@roli Я не уверен, что вы имеете в виду под содержит тесты, но вам нужно что-то использовать для запуска тестов, а затем анализа вывода TAP. доказать делает это. Используйте prove --archive ... для запуска тестов, и он зафиксирует выходные данные. - person Schwern; 13.12.2012
comment
код, который я разместил изначально (в качестве примера), сохраняется как my_test.pl. Я вызываю это withperl my_test.pl - person roli; 13.12.2012
comment
@roli Если вы запускаете тест вручную и читаете результат на глаз, вы упускаете важный элемент тестирования в Perl. Вы должны запустить тестовые файлы с другой программой, которая интерпретирует для вас вывод TAP. Вот что происходит, когда вы запускаете make test для модуля Perl. доказать — это такая штука, это версия командной строки Test::Harness. Запустите prove my_test.pl, чтобы понять. proof может запустить целый каталог, полный тестовых файлов, и интерпретировать вывод. Вот почему вам не нужно захватывать внутри скрипта. - person Schwern; 14.12.2012
comment
это причина моего первоначального вопроса о том, как зафиксировать результаты TAP. Я делаю веб-тесты с селеном. Я технарь в команде. Я хочу зафиксировать результаты TAP, чтобы включить их в документ odt, который создается во время теста для экспертов предметной области. Мой тестовый скрипт создает скриншоты... и я хочу написать результат TAP рядом с соответствующим скриншотом. Пример, который я предоставил, был довольно простым, но я подумал, что мне достаточно объяснить, как зафиксировать результат. - person roli; 14.12.2012
comment
@roli Если my_test.pl содержит тесты на селен, это не должно изменить ситуацию. Независимо от того, что делает тест, вы все равно можете запустить его с доказательством. В этом прелесть TAP, он делает тестовые программы универсальными. Вместо запуска perl my_test.pl запустите prove --archive test_out.tgz --merge my_test.pl. Тест будет запущен, ваши пользователи получат красивую сводку результатов теста (используйте -v, если они хотят увидеть необработанный TAP), ваши снимки экрана будут сохранены вместе с tar-архивом результатов TAP. Если вы хотите сделать его более удобным, напишите обертку вокруг доказательства, которая распаковывает архив. - person Schwern; 15.12.2012
comment
Приведенный выше код работает только с файлами .t, а не со сжатым архивом напрямую. - person Boris Däppen; 27.08.2013

Вы можете написать плагин для App::Prove. Хорошей отправной точкой является Test::Pretty.

person creaktive    schedule 08.12.2012