Как проверить содержимое файла из тестового файла Perl?

StackOverflow https://stackoverflow.com/questions/2543325

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top