Как проверить содержимое файла из тестового файла Perl? - PullRequest
2 голосов
/ 30 марта 2010

Я хочу протестировать скрипт, написанный на Perl, и, в частности, проверить, какой вывод он записывает в файл. Я написал это некоторое время назад и не хочу изменять его до степени превращения в модуль, но хотел бы провести регрессионное тестирование, прежде чем добавлять небольшие функциональные изменения.

Пока у меня есть

use Test::Command tests => 10;

exit_is_num($cmd, 0);
....

Но команда создает несколько файлов, и я хочу проверить, совпадают ли эти файлы с ожидаемыми (либо равны, либо соответствуют некоторому регулярному выражению). Любые предложения

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Ладно, я пойду с подходом "грубой силы" DIY (однако возможно, что уже есть какой-то тестовый модуль с API проверки файлов - я просто никогда не сталкивался с таким гибким / универсальным модулем, как то, что нам было нужно, писал сам и никогда не чувствовал неотложная необходимость искать глубже :).

Я опишу довольно общую настройку тестирования, вам могут понадобиться / нужны только очень специфические аспекты тестирования файлов.

То, что мы делаем в этом случае, - это буквально то, что указано выше в вашей функциональной спецификации, как часть общей среды тестирования:

  • Наличие библиотеки тестирования с двумя методами (среди прочих) - test_file_identical() и test_grep_file(). Если вам нужна помощь в написании этих двух, пожалуйста, оставьте комментарий, и я предложу несколько советов (мы используем разные компараторы, включая комбинацию -e, сравнения различных атрибутов stat, сравнение строк содержимого тестируемого файла с тестом производительности файл, полученный с помощью File::Slurp и выполняющий grep файла, построчно или через скрытое содержимое для небольших файлов, включая сравнение результатов массированного grep с файлом эталонного теста.

  • Организуйте свои тестовые случаи в подкаталогах (или архивах), по одному на тест, и каждый тест состоит из 2 каталогов - входных файлов и ожидаемых выходных файлов.

  • Пусть сценарий механизма тестирования зацикливает тестовые случаи (которые для нас мета-описываются либо структурой данных Perl, либо, что еще лучше, XML-файлом, чтобы бизнес-аналитики могли при необходимости возиться с ними).

  • Если в тестовом примере указано, что тест должен совпадать (точно или через grep), механизм тестирования находит соответствующие файлы (либо жестко заданные имена, либо с помощью шаблона имени, указанного в тестовом примере), примените этот файл методы испытаний, упомянутые в первом пункте маркированного списка

1 голос
/ 31 марта 2010

В тесте нет ничего волшебного. Прочитайте файлы, убедитесь, что они имеют правильное содержимое. Болото простое.

open my $fh, $file;
my $have = join '', <$fh>;

is $have, <<'WANT', "contents of $file";
The quick brown fox
jumped over the lazy grey dog.
WANT

Там нет ничего новаторского. Test :: File :: Contents предоставит вам некоторые служебные функции, так что вам не придется писать это снова и снова.

Если вы тестируете несколько файлов, вы можете настроить управление данными процесса.

my %file_tests;
$file_tests{"expected_filename"} = <<'WANT';
Expected content
WANT
... and so on ...

for my $file (keys %file_tests) {
    my $want = $file_tests{$file};

    file_contents_is($file, $want, "contents of $file");
}

Если содержимое большое, вы можете вставить ожидаемый результат в файлы и использовать files_contents_identical ().

Наконец, если вы хотите убедиться, что программа ТОЛЬКО создала ожидаемые вами файлы, и в них нет никаких заблуждений, создайте временный каталог, запустите в него chdir, запустите программу оттуда и убедитесь, что каталог содержит только те файлы, которые вы ожидаете , Я оставлю это как упражнение для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...