2010-03-30 117 views
2

我想测试一下我用Perl编写的脚本,并专门检查它写入文件的输出。我前一段时间写过,不想修改它以将其转换为模块,但希望在添加一些小的功能更改之前对其进行回归测试。从Perl测试文件中,如何检查文件的内容?

到目前为止,我有

use Test::Command tests => 10; 

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

但命令会产生一些文件,我要检查这些文件是相同的,因为我希望(相等或匹配一些正则表达式)。 任何建议

+0

@Alex - 变化是什么? – DVK 2010-03-30 17:29:57

回答

1

提到的方法没有什么神奇的有关试验。阅读文件,检查他们是否有正确的内容。 Bog简单。

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成,从那里运行程序,并检查该目录仅包含的文件,你期望。我将把它作为读者的练习。

2

好的,我会采用强力DIY方法(但可能已经有一些测试模块与文件检查API - 我从来没有碰到一个灵活/通用的我们需要和自己写从来没有觉得迫切需要更深入地搜索:)。

我将描述一个相当通用的测试设置,您可能只需要/只需要非常特定的文件测试方面。

我们确实在这种情况下,什么字面上就是你的功能规格以上的状态,作为整体的测试框架的一部分:

  • 有两种方法(等等)一个测试库 - test_file_identical()test_grep_file() 。如果您需要编写这两篇文章需要帮助,请发表评论,我会提供一些提示(我们使用不同的比较器,包括-e的组合,各种stat属性的比较,比较测试文件的内容字符串与通过File::Slurp获得的基准文件并对文件执行grep,一行一行或通过小文件的诽谤内容,包括将按摩grep结果与基准文件进行比较。

  • 将您的测试用例组织成子目录(或tarball)测试,每个测试包含2个目录 - 输入文件和预期输出文件。

  • 让测试引擎脚本循环测试c ases(对于我们来说,它们是由Perl数据结构或者更好的元描述的,这是一个XML文件,所以业务分析师可以根据需要摆弄它们)。

  • 如果测试用例指定测试需要匹配(完全或通过grep),测试引擎会找到适当的文件(硬编码名称或通过测试用例中指定的名称模式),应用这些文件测试在第一点