3

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

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

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

4

3 回答 3

5

从DBUnit开始

DbUnit 是针对数据库驱动项目的 JUnit 扩展(也可与 Ant 一起使用),其中包括在测试运行之间将您的数据库置于已知状态。这是避免当一个测试用例损坏数据库并导致后续测试失败或加剧损坏时可能发生的无数问题的极好方法。

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

于 2011-11-23T10:11:44.570 回答
4

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

于 2011-11-24T23:53:20.013 回答
2

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

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

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

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

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

于 2011-11-23T12:12:52.697 回答