如何测试输出/修改文件的模块/脚本?

时间:2010-08-03 05:17:05

标签: perl testing file dist-zilla

我有几个模块(DZP::CatalystDZP::OurPkgVersion)这两个模块的目的都是将文件写入磁盘。我不确定如何测试它们,是否有任何好的策略来测试写入磁盘的文件?我可以去读它的任何地方吗?

2 个答案:

答案 0 :(得分:3)

好吧,在这种特殊情况下(Dist::Zilla插件),您将要使用Dist::Zilla::Tester。它负责创建临时目录,填充文件以及事后清理的大量繁琐工作。例如,请参阅the tests from my DZP::CJMtests from Dist::Zilla itself,尤其是plugins directory

更新: Dist :: Zilla 4.200002引入了Test::DZil模块,该模块添加了一些用于测试插件的实用功能。您可能希望使用它而不是直接使用Dist :: Zilla :: Tester。

答案 1 :(得分:3)

这取决于模块,但我的总体策略是:

  • 确保文件内容逻辑100%独立 - 就不同方法而言 - 与文件机制(例如选择目录/打开文件/关闭文件/错误处理)。

  • 确保文件功能100%灵活,例如您可以从外部驱动程序中选择目录/文件名。

  • 编写文件机制的测试,只需打开指定目录中的指定文件,关闭它,确保没有错误发生且预期文件存在且大小为零

  • 创建一个测试数据数组,该数组的每个元素由3部分组成

    1. 输入文件内容逻辑的数据,可能与测试配置相结合,指示文件内容逻辑中的哪些方法可以在保证的情况下调用该数据。

    2. 要设置的预期文件名

    3. 预期的文件内容,采用tar-balled预期文件的形式(具有确切预期内容的确切文件以及正确的预期名称)。

      预期结果tarball应位于单独的子目录中(例如,测试脚本所在目录下的“expected_results”。

      如果文件生成逻辑生成> 1文件,则需要tarball。

  • 然后,在先前创建的测试数组中的每个测试上运行一个循环:

    1. 创建一个新的“实际结果”临时目录(或清理之前测试中的目录)

    2. 将模块中的目录设置为临时目录;将模块的文件名设置为测试信息中的预期文件名。

    3. 运行文件开启方法(先前已测试)

    4. 使用测试的逻辑方向(如果适用)和测试的输入数据从模块运行内容生成逻辑。

    5. 运行文件关闭方法(先前已测试)

    6. 创建“临时预期结果”临时目录(或清理上次测试中的目录)

    7. 将“预期结果”tarball从“expected_results”测试子目录复制到上一个项目符号点中创建的“temp expected results”临时目录

    8. 在“temp expected results”临时目录中解压缩tarball并从那里删除tarball。

    9. 目录 - 将“临时预期结果”临时目录与“实际结果”临时目录区分开(例如,确保两者具有100%相同的文件列表,并且每个文件的内容都是100%相同,可以通过本机Perl或通过diff来电使用system()

由于上面的逻辑是非常通用的,我通常将其中的大部分抽象为一个“Test :: FileGenerator”模块,该模块被测试文件生成能力的所有单元和集成测试重用。