我想测试我用 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),测试引擎会找到适当的文件(硬编码名称或通过测试用例中指定的名称模式),应用第一个中提到的文件测试方法要点

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top