针对更多类型的数据库运行JUnit测试

时间:2011-11-23 09:51:23

标签: java database testing junit spock

我有一个通过jdbc API使用数据库的应用程序(实际上是spring jdbc模板)。我们希望针对更多类型的数据库(MS SQL,Oracle,Postgre)运行我们的单元测试; 因此,为每个指定的数据库运行一个测试(例如使用maven),该测试将运行一个单元测试3次。

如何优雅地解决这个问题?

(我在想自己的JUnit运行器实现,但我们也有Spock测试)

3 个答案:

答案 0 :(得分:5)

DBUnit

开始
  

DbUnit是一个针对数据库驱动项目的JUnit扩展(也可用于Ant),除其他外,它将数据库置于测试运行之间的已知状态。这是避免在一个测试用例破坏数据库并导致后续测试失败或加剧损坏时可能发生的无数问题的绝佳方法。

为每个数据库使用单独的JdbcDatabaseTester - 单元测试等应编码为IDatabaseTester,因此可以与所有数据库一起运行。

答案 1 :(得分:4)

基本问题是如何使用不同的数据库设置多次运行相同的测试。您可以在测试框架级别(例如,使用自定义JUnit运行器或作为DBUnit / Unitils扩展)或在构建工具级别(如果您的构建工具足够灵活)实现此功能。在这两种情况下,应该可以有一个适用于JUnit和Spock的实现。 (顺便说一句,Spock提供开箱即用的Unitils集成。)

答案 2 :(得分:2)

你究竟在测试什么?你的java代码运行JDBC?你对数据库模式的sql语句?根据答案,有两种策略:

如果是您正在测试的java代码,只需使用您选择的模拟框架模拟JDBC连接(我建议使用jMockit)并查看您的代码是否正确 sql语句

如果它是数据库模式,您可以通过最方便的方式准备SQL语句并将它们发送到您选择的DB(DBUnit也可以用于此目的,或者SoapUI, 或其他数据库管理工具)

分离这两个问题将为每个层提供更简单,更强大的测试。

PS:还考虑使用某种形式的ORM - 比如JPA