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

Java 对更多类型的数据库运行JUnit测试,java,database,testing,junit,spock,Java,Database,Testing,Junit,Spock,我有一个通过JDBCAPI(实际上是SpringJDBC模板)使用数据库的应用程序。我们希望针对更多类型的数据库(MS SQL、Oracle、Postgre)运行单元测试; 因此,要运行一个测试(例如使用maven),该测试将为每个指定的数据库运行3次单元测试 如何优雅地解决这个问题 (我在考虑自己的JUnit runner实现,但我们也有Spock测试)从 DbUnit是一个JUnit扩展(也可用于Ant),其目标是数据库驱动的项目,这些项目在测试运行之间将数据库置于已知状态。这是一个很好的方

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

如何优雅地解决这个问题

(我在考虑自己的JUnit runner实现,但我们也有Spock测试)

DbUnit是一个JUnit扩展(也可用于Ant),其目标是数据库驱动的项目,这些项目在测试运行之间将数据库置于已知状态。这是一个很好的方法,可以避免在一个测试用例损坏数据库并导致后续测试失败或加剧损坏时可能出现的大量问题


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

您到底在测试什么?运行JDBC的java代码?您的sql语句是否针对数据库架构?根据答案,有两种策略:

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

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

分离这两个关注点将为每一层提供更简单、更健壮的测试


PS:还考虑使用某种形式的ORM类JPA

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

您现在如何管理数据库?目前我们仅针对一个数据库进行测试,因为查询非常简单,我们尝试编写标准SQL查询;我们处于早期阶段,所以我们只是手动更改了数据库连接的配置,以便在H2以外的其他数据库上进行测试。我们希望这样做集成测试,所以两者都是。我不确定jUnit是否也适合进行集成测试。当然不是。我想在这个上下文中放一些东西,比如jMeter或SoapUI。我现在没有使用这个框架,现在我很快就检查了它。但我真的不明白你是什么意思。因此,我应该为每个数据库包装一个JdbcDatabaseTester,但是如何在一个测试中使用它们,从而如何执行我的测试用例3次(对于所有数据库连接?!)。您必须创建一个新的顶级驱动程序,用每个JdbcDatabaseTesterYeah运行每个套件,这是我对JUnit的第一个意图,你认为使用DbUnit更容易吗?什么是最基本的顶级驱动程序类?@Mark:有没有关于DbUnit应用程序的github代码示例?这应该是一个答案。哦,是的,对不起,但这很明显,Mark也指出了这一点;(JUnit runner)也是的,例如,对于maven,可以更改测试的运行。但我认为,这些解决方案比“优雅”的解决方案更棘手……但thx。。。