将“真实世界”场景倾倒出来进行单元测试

时间:2009-09-03 22:23:53

标签: java unit-testing

我正在调试一些相当复杂的持久性代码,并尝试在我使用时增加测试覆盖率。

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

XStream在这里有用。它允许你几乎将任何POJO转储到XML或从XML转储而不必实现接口/注释等。我唯一的头痛是内部类(因为它会尝试并序列化引用的外部类)。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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