【发布时间】:2011-03-24 13:16:24
【问题描述】:
我有几个模块(DZP::Catalyst 和DZP::OurPkgVersion),它们的目的都涉及将文件写入磁盘。我不知道如何测试它们,有没有什么好的策略来测试写入磁盘的文件?有什么地方可以看的吗?
【问题讨论】:
标签: perl testing file dist-zilla
我有几个模块(DZP::Catalyst 和DZP::OurPkgVersion),它们的目的都涉及将文件写入磁盘。我不知道如何测试它们,有没有什么好的策略来测试写入磁盘的文件?有什么地方可以看的吗?
【问题讨论】:
标签: perl testing file dist-zilla
好吧,在这种特殊情况下(Dist::Zilla 插件),您将要使用Dist::Zilla::Tester。它负责创建临时目录、用文件填充它以及之后清理的大部分繁重工作。例如,参见the tests from my DZP::CJM 或tests from Dist::Zilla itself,尤其是plugins directory。
更新: Dist::Zilla 4.200002 引入了Test::DZil 模块,该模块添加了一些对测试插件有用的实用功能。您可能希望使用它而不是直接使用 Dist::Zilla::Tester。
【讨论】:
这在一定程度上取决于模块,但我的一般策略是:
确保文件内容逻辑与文件机制(例如选择目录/打开文件/关闭文件/错误处理)100% 分开 - 就不同方法而言。
确保文件机制 100% 灵活,例如您可以从外部驱动程序中选择目录/文件名。
为文件机制编写测试,只需打开指定目录中的指定文件,关闭它,确保没有错误发生并且预期文件存在且大小为零
创建一个测试数据数组,数组的每个元素由 3 个部分组成
文件内容逻辑的输入数据,可能与测试配置相结合,指示文件内容逻辑中的哪些方法在必要时调用该数据。
要设置的预期文件名
预期的文件内容,以 tar-balled 预期文件的形式(具有要生成的确切预期内容和正确预期名称的确切文件)。
预期结果 tarball 应该位于一个单独的子目录中(比如测试脚本所在目录下的“expected_results”。
您需要一个 tarball,以防您的文件生成逻辑生成 >1 个文件。
然后,对您之前创建的测试数组中的每个测试运行一个循环:
创建一个新的“实际结果”临时目录(或清理之前测试中的目录)
将模块中的目录设置为临时目录;将模块的文件名设置为测试信息中的预期文件名。
运行文件打开方法(之前测试过)
使用测试的逻辑方向(如果适用)和测试的输入数据从模块运行内容生成逻辑。
运行文件关闭方法(之前测试过)
创建一个“临时预期结果”临时目录(或清理上次测试的目录)
将“预期结果”压缩包从“expected_results”测试子目录复制到在最后一个要点中创建的“临时预期结果”临时目录
在“临时预期结果”临时目录中解压缩该压缩包并从那里删除压缩包。
directory-diff “临时预期结果”临时目录与“实际结果”临时目录(例如,确保两者都有 100% 相同的文件列表,并且每个文件的内容都是 100% 相同,或者通过本机 Perl或通过system() 调用使用diff。
由于上述逻辑非常通用,我通常将其大部分抽象为“Test::FileGenerator”模块,供所有测试文件生成能力的单元和集成测试重用。
【讨论】: