2009-09-03 42 views
0

我目前正在调试一些相当复杂的持久代码,并尝试在我进行测试时增加测试覆盖率。倾销单元测试的“真实世界”场景

我在生产代码中发现的一些错误需要大量且非常具体的对象图来重现。

尽管从技术上讲,我可以在测试中坐下来写出实例代码的存储桶以重现特定场景,但我想知道是否有工具可以为我做这件事?

我想具体我想能够转储出一个对象,因为它在我的调试器框架中(可能是xml),然后使用一些东西来加载XML并创建对象图来进行单元测试(例如,xStream等)。

任何人都可以推荐在这种情况下有用的工具或技术?

+1

是否真的没有简单的情况,可以重现错误的行为?如果不是的话,我会把它看作一个功能测试。有了这种数据来触发bug,我们有点超出了“单位”级别,恕我直言。 – Yishai 2009-09-03 22:52:31

+0

@易海 - 无论是单元测试还是功能测试都无关紧要吗?无论哪种情况,他都希望自动化测试用例。 – ChrisW 2009-09-03 22:55:53

+0

@ChrisW - 一旦你开始从功能测试的角度思考它,就会打开一套完整的工具,并开始思考问题。它可能不会改变最终答案,但它应该改变我们对这个问题的看法。 – Yishai 2009-09-03 23:38:17

回答

2

我已经使用ObjectOutputStream来完成这种事情,但是XML应该可以正常工作。你需要使用一个可序列化的树。您也可以尝试JAXB或xStream等。我认为这很简单。如果你在你的代码中有一个能够以适合你的测试的形式构建结构的地方,那么在其中注入序列化代码,并将所有内容写入文件。然后,删除注入的代码。然后,为了测试,加载XML。您可以将文件填入类路径的某处。我通常使用资源或配置目录,并使用Thread.currentThread()。getContextClassLoader()。getResourceAsStream(name)获取流。然后反序列化这些东西,而且你很好。

+0

使用ObjectOutputStream是一个很好的解决方案,除非您更改类,那么您将需要重新生成整个对象图并将其重新序列化。 – 2009-09-03 23:22:44

+0

对。我通常将注入的代码放在某个地方。关于将其保留在工作环境中而不是家庭项目上,我会更正式。 – 2009-09-04 01:08:42

+1

+1您可以补充:1)任何形式的对象序列化在面对影响表示的类的变化时都是脆弱的; 2)在ObjectOutputStream上使用XML的优势在于更容易“修复”引起的任何问题通过使用XML或文本编辑器的这种脆弱性。 – 2009-09-04 01:42:47

2

XStream在这里有用。它将允许你实际上将任何POJO转储到XML中,而不必实现接口/注释等。我遇到的唯一令人头疼的事情是内部类(因为它会尝试和序列化引用的外部类)。

0

我不知道Java,但如果你改变你的类的实现,那么你可能不再能够反序列化旧的单元测试(它是从旧版本的类中序列化的)。因此,如果您更改类定义,将来可能需要花费一些精力来迁移单元测试数据。

2

我想你所有的数据都是保存在数据库中的。您可以使用一些测试数据生成工具来使数据库充满测试数据,然后以SQL脚本的形式导出数据,然后在开始集成测试之前进行预加载。

您可以使用DBUnit在您的单元测试中预加载数据,在测试开始之前,它还有许多选项来验证数据库结构/数据。 http://www.dbunit.org/

对于数据库中的测试数据生成,您可以使用许多商业工具。我不知道任何好的免费工具,可以处理像预定义的数据列表,预定义分布的随机数据,从其他表中的外键使用等功能。

+0

如果不清楚,db:unit可以简单地将数据库的当前状态转换为它读取的任何格式。 – ndp 2009-09-07 04:41:23