2012-01-20 60 views
3

我正在测试一个非常简单的Java应用程序使用JUnit 4.通过“简单”我的意思是没有春天,没有休眠。我需要测试数据访问层(JDBC,MySQL),我怀疑哪种方法更适合这种测试?在@Before上插入数据并在@After上删除或在@Before上创建交易并在@After上回滚?JUnit:测试DAO - 回滚或删除

谢谢!

+1

尝试使用一些内存数据库像HSQL DB? – Reddy

+0

@Reddy我想你应该写作为一个单独的答案,因为我认为这是最有效的一个。 – bezmax

+0

如@布赖恩在他回答说,我想肯定的是,SQL querys是正确的,他们在MySQL的X平台上工作。而且,在这种情况下,访问MySQL服务器不成问题。 – Morvader

回答

4

我不同意使用MySQL以外的数据库,因为您可能会暴露于测试中的平台差异,这些差异掩盖了您的代码与MySQL有关的问题。如果不进行大量的重构,某些代码/ SQL可能无法在另一个平台上工作。

但是,与其他人一致同意使用事务而不是删除或更新来恢复状态。一个告诫:如果你使用特效,函数等,那些可以在内部执行COMMIT,这可能会消除任何回滚JUnit更改的尝试。也许对你来说不是一个问题,但也许是别人需要记住的问题,特别是在处理那些从未考虑过单元测试的遗留数据库代码时。

4

交易的原因有两个:

  • 写/删除可能会更贵则回滚错误的
  • 余量较小(你的代码删除数据可能有一个bug)
2

我还会在内存数据库或MySQL中的临时表中使用volatile,这些表中的连接是特定的,并在连接关闭时自动删除。 我不会使用交易进行这种测试,因为您可能想要实际测试交易本身。

0

无论我在哪里工作,不同的开发人员喜欢不同的解决方案,这个问题都会一次又一次地出现。

首先,我真的不喜欢使用内存数据库,原因如下

  1. 代码似乎超过测试。我们发现了一个代码库,在内存中测试的表不存在于实际的数据库中。
  2. 数据库并不完全一样,如果你在内存中使用hsql,但你的主数据库是MySQL,那么在语法上存在差异,日期只是名字而已。我知道你可以使用ASCII Sql,但你正在测试的东西不是你要运行的东西。会有分歧。

我更喜欢事务回滚的删除,因为它们在事务开始之前将数据库保留在确切的状态,但如果您有成千上万的数据库,它会显着减慢测试速度。

我的确有时会质疑数据库测试的价值,并且赞成在新的数据库上运行集成测试的持续集成。这样我们覆盖了所有的数据访问。 在单元测试中,我们只是用Mockito或类似的模拟工具来模拟数据访问层。

1

事务回滚更安全,因为测试数据库保持不变,即使测试在测试方法和@After之前停止。

然而,提交和删除测试中表现更好,因为一些约束期间提交(递延外键等)对新的数据来检查,所以用回滚有一些事情你不会测试。

所以这是你的,但在大多数情况下,事务回滚是preferrable的choise(我喜欢它太)。