测试方法 - DB,Junit

时间:2010-02-09 13:50:48

标签: database junit

我想问一下与数据库中的数据相关的写入测试。在我看来,最好的方法是使用不同的数据库模式,只有正确的数据用于单元测试。在测试代​​码中,我可以在ID的基础上加载对象。

第二种可能性是在单元测试期间将数据放入数据库。我不喜欢它。

你怎么看?你是怎么做到的?

亲切的问候 塞巴斯蒂安

3 个答案:

答案 0 :(得分:2)

如果您真的想编写与数据库交互的测试 - 集成测试 - 那么您必须在每次测试执行之前将数据库置于已知状态。

执行此操作的一种方法是在每次测试之前加载自定义数据集,例如使用DbUnit。在这里,每个测试都由他自己的数据负责,不需要清理,你可以在测试失败后查询数据库以了解问题。

另一种方法是使用“实时”数据库并在事务中运行测试并在测试结束时回滚更改。 Spring和Unitils对此有所支持。这也很有效,但在使用这种方法时诊断失败的测试并不总是那么容易。

请注意,第二种方法并不真正排除第一种方法,您可以在事务中使用自定义数据集。另请注意,您可以使用包含“参考数据”的数据库(即国家等只读数据),并仅在使用第一种方法时加载“动态数据”以加快速度。

就个人而言,我并没有真正看到前一种方法有什么问题(除非测试速度稍慢),像DbUnit这样的工具使它变得非常简单。正如我所说,我发现使用DbUnit的测试更容易诊断。但后来的方法肯定也有效。

在这两种情况下,您当然应该使用专用模式 1

1 实际上,每个开发人员使用一个模式肯定是best practice

答案 1 :(得分:0)

对于单元测试,您应该模拟或存根数据库的功能。由于您正在测试调用数据库而不是数据库本身的对象,因此无需使用真实数据库。 EasyMock或JMock是很好的模拟库。

答案 2 :(得分:0)

三条评论:

  1. 单元测试通常是小规模,快速测试,以涵盖一小段代码。使用DB的测试实际上不是单元测试(即使您可以在例如JUnit中运行它们),而是系统/集成测试。两者都有用,用于不同的目的。

  2. 即使你的对象图很大,我也不明白为什么你需要在单元测试中一次测试它。您使用必要的模拟对象测试一个DAO,并声明对象图的相关部分已正确处理。然后为下一个DAO等编写更多测试。

  3. IMO DAO通常不应该做非常复杂的事情(除非部分业务逻辑被放在那里,但这是糟糕的设计 - 应该重构而不是试图用扭曲的单元测试覆盖它。)