题
我想测试我用 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成,要从那里运行的程序,并检查该目录仅包含你所期望的文件。我会离开,作为一个练习留给读者。
其他提示
好的,我会采用蛮力 DIY 方法(但是可能已经有一些带有文件检查 API 的测试模块 - 我只是从来没有遇到过像我们需要的那样灵活/通用的模块,我们自己编写了,并且从未感到迫切需要更深入地搜索:)。
我将描述一个相当通用的测试设置,您可能只需要/需要它的非常具体的文件测试方面。
在这种情况下,我们所做的实际上就是您上面的功能规范所规定的,作为整体测试框架的一部分:
拥有一个具有两种方法(除其他外)的测试库 -
test_file_identical()
和test_grep_file()
. 。如果您需要帮助编写这两个,请发表评论,我将提供一些提示(我们使用不同的比较器,包括组合-e
, 各种比较stat
属性,比较测试文件与实际文件的内容字符串基准文件通过获得File::Slurp
和做grep
文件的逐行或通过小文件的内容进行分析,包括将经过修改的 grep 结果与基准文件进行比较。将您的测试用例组织到子目录(或 tarball)中,每个测试一个,每个测试由 2 个目录组成 - 输入文件和预期输出文件。
让测试引擎脚本循环遍历测试用例(对我们来说,这些测试用例是通过 Perl 数据结构或更好的 XML 文件进行元描述,以便业务分析师可以在需要时摆弄它们)。
如果测试用例指定测试需要匹配(完全匹配或通过 grep),测试引擎会找到适当的文件(硬编码名称或通过测试用例中指定的名称模式),应用第一个中提到的文件测试方法要点