2011-05-19 90 views
2

我是新来测试开发,并试图打破我的非tdd习惯。JUnit - 如何为文件解析方法编写测试?

我的应用程序中的大部分功能可测试代码都与数据库I/O或文件读/写有关。 Android为处理数据库测试提供了一些扩展,但是我失去了如何编写用于阅读示例文件的测试。

下面是我的应用程序中的一个示例:XML导入。

方法parseXML()以相当简单的模式读取文件,并直接将其内容写入数据库。有几种子方法可以解析不同节点的内容(即parseNote()parseList())。

我必须提供样本文件吗?如果是这样如何?我应该如何开始测试这样的代码?

编辑 示例文件:

<lists> 
<list title="Sample List"> 
<note title="Note 1" details="Details 1"/> 
<note title="Note 2" details="Details 2"/> 
<note title="Note 3" details="Details 3"/> 
</list> 
</lists> 
+0

示例文件将很方便。 – Woot4Moo 2011-05-19 14:03:35

+0

@ Woot4Moo示例文件已添加。 – CodeFusionMobile 2011-05-19 14:36:16

回答

0

是你将要测试的东西如下:

  1. 格式良好的XML文件
  2. 畸形XML文件
  3. XML文件即> 2GB
  4. XM不存在保存为txt文件
  5. XML文件l文件(这真的只能说明你不是靠扩展名)
+0

感谢您的建议,但有没有一种特定的方式,我应该添加一个测试文件到JUnit套件? – CodeFusionMobile 2011-05-19 14:37:28

+2

@CodeFusionMobile为了使该方法更灵活,更容易单元测试,parseXML()应该接受比File对象更抽象的东西。如果您使用'Reader'对象,则这允许您将XML字符串('StringReader')或XML文件('FileReader')传递给方法。能够将字符串传递给方法使得编写单元测试更容易一些。 – Michael 2011-05-19 14:41:29

2

很难单元测试保存信息到数据库的一部分因为这样做需要你有一个数据库启动并运行。通过单元测试,你想避免像鼠疫这样的依赖。

相反,您应该做的是测试解组过程 - 也就是说,您的代码是否能够正确地从XML文档中提取数据。创建一个类,其唯一目的是保存解析的XML数据(一个只有属性和getters/setter的POJO/bean类)。让您的parseXML()方法将所有数据放入此类并返回它(它不应该将任何内容保存到数据库中)。然后,你所有的单元测试所要做的就是检查以确保对象的属性具有正确的值。

Like @ Woot4Moo表示,您还应该测试该方法如何处理意外错误,如不存在的文件或非XML文件。另外,如果您的XML遵守架构,您可能需要签出JAX-B。这是一个框架,如果XML文档符合架构,它将自动从XML文档创建一个Java bean对象。你不必自己编写任何解析代码。

0

我会模拟出数据库,并测试解析器在提供XML片段时正确地与其交互。或者,如果您不熟悉模拟框架,则可以将XML解析为中间“值”类(所有最终字段)并执行相等声明。

您可以使用XML构建器类创建这些片段。对于基本解析和构建XML文件,使用预先存在的DOM库将比自己编写一个DOM库容易得多。