Как проверить содержимое файла из тестового файла Perl?
Вопрос
Я хочу протестировать сценарий, который я написал на Perl, и конкретно проверить, какие выходные данные он записывает в файл.Я написал его некоторое время назад и не хочу модифицировать его до степени превращения в модуль, но хотел бы провести регрессионное тестирование, прежде чем добавлять небольшие функциональные изменения.
До сих пор у меня есть
use Test::Command tests => 10;
exit_is_num($cmd, 0);
....
Но команда создает несколько файлов, и я хочу убедиться, что эти файлы такие же, как я ожидаю (либо равны, либо соответствуют некоторому регулярному выражению).Какие-либо предложения
Решение
В тесте нет ничего волшебного.Прочтите файлы, проверьте, что они имеют правильное содержимое.Болото простое.
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
Ничего новаторского там нет. Тест::Файл::Содержимое предоставит вам некоторые служебные функции, поэтому вам не придется писать это снова и снова.
Если вы тестируете кучу файлов, вы можете управлять данными процесса.
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, запустите программу оттуда и проверьте, что каталог содержит только те файлы, которые вы ожидаете.Я оставлю это в качестве упражнения для читателя.
Другие советы
Хорошо, я воспользуюсь подходом «сделай сам» методом грубой силы (однако возможно, что уже есть какой-то тестовый модуль с API проверки файлов — я просто никогда не сталкивался с таким гибким/универсальным, как то, что нам нужно, и написал сам, и никогда не чувствовал острой необходимости в этом). ищите глубже :).
Я опишу довольно общую настройку тестирования, вам могут понадобиться только очень конкретные аспекты тестирования файлов.
В этом случае мы делаем буквально то, что указано в приведенной выше функциональной спецификации, как часть общей среды тестирования:
Имейте библиотеку тестирования с двумя методами (среди прочего) –
test_file_identical()
иtest_grep_file()
.Если вам нужна помощь в написании этих двух, оставьте комментарий, и я дам несколько советов (мы используем разные компараторы, включая комбинацию-e
, сравнение различныхstat
атрибуты, сравнение строк содержимого тестируемого файла и файла.бенчмарк-файл, полученный черезFile::Slurp
и делаюgrep
файла, построчно или через содержимое для небольших файлов, включая сравнение результатов обработки grep с эталонным файлом.Организуйте свои тестовые примеры в подкаталоги (или архивы), по одному на каждый тест, и каждый тест состоит из двух каталогов — входных файлов и ожидаемых выходных файлов.
Пусть сценарий тестового механизма циклически обрабатывает тестовые примеры (которые для нас метаописаны либо структурой данных Perl, либо, что еще лучше, XML-файлом, чтобы бизнес-аналитики могли при необходимости возиться с ними).
Если в тестовом примере указано, что тест должен совпадать (точно или с помощью grep), механизм тестирования находит соответствующие файлы (либо жестко запрограммированные имена, либо через шаблон имени, указанный в тестовом примере), примените методы тестирования файлов, упомянутые в первом примере. пункт списка