我有几个模块(DZP::Catalyst和DZP::OurPkgVersion),它们的目的都涉及将文件写入磁盘。我不知道如何测试它们,有没有什么好的策略来测试写入磁盘的文件?我可以去任何地方阅读它吗?
2 回答
好吧,在这种特殊情况下(Dist::Zilla插件),您将要使用Dist::Zilla::Tester。它负责创建临时目录、用文件填充它以及之后清理的大部分繁重工作。例如,查看我的 DZP::CJM中的测试或Dist::Zilla 本身的测试,尤其是插件目录。
更新: 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 还是
diff
通过system()
调用。
由于上面的逻辑非常通用,我通常将其中的大部分抽象为一个“Test::FileGenerator”模块,供所有测试文件生成能力的单元和集成测试重用。