编写将文件作为输入的代码的测试

时间:2012-11-21 18:14:19

标签: ruby xml testing tdd acceptance-testing

我现在正在编写一个解析epub文件的程序(基本上是带有一些xml元数据文件的zip)。该程序适用于我测试过的所有输入文件。

尽管如此,我还是想编写一些测试(单元测试或行为测试)以确保它与所有文件一起使用并拥有“更好的代码”。

完美地(至少在理论层面上)实现EPUB规范并为测试提供一些XML片段的唯一方法是什么?

我对测试很熟悉但是我从来没有对以文件为输入的东西进行测试,所以我也在寻找更多相关信息。 :)

2 个答案:

答案 0 :(得分:2)

单元测试方法是消除测试中的外部依赖性。这样,运行测试不需要您的环境执行除托管测试程序之外的任何操作。

在你的代码中,大多数情况下你不应该对“testfile.epub”感兴趣。这只是OpenEpubFile()例程的工作。相反,您有兴趣测试“这里是指向某些数据的指针,如何解压缩它?”的特定逻辑。或“我如何处理标题标签?”因此,您的单元测试将提供样本压缩数据以测试解压缩逻辑的工作方式,并提供样本标题标记以查看逻辑如何处理标题。你会传递它们很好,很长,很短,格式错误的标题,你会提供运行你需要在代码中测试的逻辑所需的各种数据。但是这些数据不必每次都来自一个文件,它可以来自测试工具。

如果您发现您的逻辑难以测试,那么可能是时候将其模块化了。您需要从读取数据的代码中分离出打开文件的代码。您需要将读取数据的代码与解压缩数据的代码分开。您需要将解压缩数据的代码与解析XML的代码分开。您需要将构建屏幕的代码与绘制屏幕的代码分开。 Extract Method重构过程在这里非常有用,以及重命名方法。而且你将严重依赖依赖倒置模式。

每次您可以将其分解为实现纯逻辑的无状态代码,您可以非常轻松地测试这些规则。更好的是,当您将其分解为所需的模块时,您会发现添加新模块来处理新案例变得更加容易,因为您可以重复现有模式。

是的,在某些时候,您将有一个测试可以确保您的open()语句可以实际打开文件。在单元测试代码通过所有测试后,就可以进行集成测试了。在那里,您可以为它提供一组真实的.epub文件,并根据需要查看输出。

答案 1 :(得分:0)

无需重新实现.epub仅用于测试。

创建一些微小的.epub文件以显示某些特征,并针对这些特征创建测试。