【问题标题】:Running JUnit tests against more type of databases针对更多类型的数据库运行 JUnit 测试
【发布时间】:2012-01-04 14:58:06
【问题描述】:

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

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

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

【问题讨论】:

  • 您今天如何管理数据库?
  • 目前我们只是针对一个数据库进行测试,由于查询很简单,我们尝试编写标准的SQL查询;我们处于早期阶段,所以我们只是手动更改了数据库连接的配置,以便在 H2 以外的其他数据库上进行测试。

标签: java database testing junit spock


【解决方案1】:

DBUnit开头

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

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

【讨论】:

  • 你好,我暂时没有使用这个框架,现在我快速检查了一下。但我真的不明白你是什么意思。所以我应该为每个数据库创建一个 JdbcDatabaseTester,但是如何在一个测试中使用它们,因此它将如何执行我的测试用例 3 次(对于我所有的数据库连接?!)。
  • 您必须创建一个新的顶级驱动程序,该驱动程序将使用每个 JdbcDatabaseTester 运行每个套件
  • 是的,这就是我使用 JUnit 的初衷,您认为使用 DbUnit 更容易吗?什么是基础顶级驱动程序类?
  • @Mark : DBunit 应用程序的任何示例 github 代码?
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我们想做这样的集成测试,所以两者兼而有之。
  • 我不确定 jUnit 是否也适合集成测试。绝对不是。我会在这种情况下放置类似 jMeter 或 SoapUI 的东西
【解决方案3】:

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

【讨论】:

  • 应该是答案。
  • 哦,是的,对不起,但这很明显,Mark 也指出了这一点;(JUnit runner)也可以,例如使用 maven 可以更改测试的运行。但我认为这些解决方案比“优雅”的解决方案要棘手......但是谢谢......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多