【问题标题】:How do I test modules/scripts that output/modify files?如何测试输出/修改文件的模块/脚本?
【发布时间】:2011-03-24 13:16:24
【问题描述】:

我有几个模块(DZP::CatalystDZP::OurPkgVersion),它们的目的都涉及将文件写入磁盘。我不知道如何测试它们,有没有什么好的策略来测试写入磁盘的文件?有什么地方可以看的吗?

【问题讨论】:

    标签: perl testing file dist-zilla


    【解决方案1】:

    好吧,在这种特殊情况下(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。

    【讨论】:

      【解决方案2】:

      这在一定程度上取决于模块,但我的一般策略是:

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

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

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

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

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

        2. 要设置的预期文件名

        3. 预期的文件内容,以 tar-balled 预期文件的形式(具有要生成的确切预期内容和正确预期名称的确切文件)。

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

          您需要一个 tarball,以防您的文件生成逻辑生成 >1 个文件。

      • 然后,对您之前创建的测试数组中的每个测试运行一个循环:

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

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

        3. 运行文件打开方法(之前测试过)

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

        5. 运行文件关闭方法(之前测试过)

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

        7. 将“预期结果”压缩包从“expected_results”测试子目录复制到在最后一个要点中创建的“临时预期结果”临时目录

        8. 在“临时预期结果”临时目录中解压缩该压缩包并从那里删除压缩包。

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

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

      【讨论】:

      • 好的,忘了提这一点,但是如果有关使文件内容生成逻辑的部分仅适用于文件句柄对象或类属性,则此方法将大有裨益。有点不言自明,但可能是一种值得明确说明的技术。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2011-03-28
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多