Spring JPA:在 CI 环境中使用多个数据库测试 DAO 层

Posted

技术标签:

【中文标题】Spring JPA:在 CI 环境中使用多个数据库测试 DAO 层【英文标题】:Spring JPA: Testing DAO layer with multiple databases in a CI environment 【发布时间】:2012-03-11 18:31:23 【问题描述】:

我们正在处理一个数据库要求不明确的项目。所以我们正在构建一个与数据库无关的应用程序。

在这里查看我之前的问题:Database Agnostic Application

现在我想用多个数据库测试我的 Spring 应用程序 DAO。我已经使用 TestNG 和 DBUnit 编写了许多测试用例。

当我在 CI 环境中运行这些测试时,我希望他们针对所有已配置的数据库测试应用程序。我已经在“测试服务器”上安装了数据库。

例如我想要这样的东西:

for ( each database configured ) 
 run each dao test

不确定执行此操作的最佳方法是什么?欢迎提供帮助。

谢谢, 阿迪

【问题讨论】:

【参考方案1】:

    如果您想要独立于数据库,您必须针对您想要支持的每个数据库系统进行测试。通过 Hibernate 泄漏有非常细微的差异。

    我过去所做的是让测试通过一些系统属性检索他们的数据库配置。通常使用 hibernate_.property 而不是默认的 hibernate.property。然后设置 CI 作业,它将属性设置为不同的值,并为每个数据库提供一个 hibernate_xxx.property 进行测试。我使用 JUnit 规则来做到这一点,将逻辑放在一个地方。不知道适合TestNG的工具

    我不喜欢您所暗示的循环结构,因为它可能会使针对单个特定数据库运行测试套件变得困难。

    我也不喜欢 dbunit,因为它似乎让维护测试数据变得相当痛苦。在大多数情况下,我更喜欢手工制作的 DSL。看看我写的一些关于它的文章:

http://blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/

http://blog.schauderhaft.de/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/

http://blog.schauderhaft.de/2011/03/27/testing-databases-with-junit-and-hibernate-part-3-cleaning-up-and-further-ideas/

【讨论】:

【参考方案2】:

如果您正在构建一个与数据库无关的应用程序并且不使用特定数据库供应商的任何固有功能,那么您的测试用例的范围应该是通过 DAO 测试数据的设置、操作和访问对象和更少的实际数据库后端的测试。 Hibernate 3.5 具有可用于 Oracle 11g 和 DB2 的方言,因此,如果您正在编写测试用例来测试与数据库无关的应用程序与特定数据库供应商的集成,那么您实际上要做的是测试 hibernate 方言是否按照他们所说的那样做他们会这样做(我敢肯定,hibernate 项目中的测试用例已经涵盖了这一点)。

换句话说,在您的情况下,我认为测试应该更多地关注 DAO 检索您认为在您设置数据后它将检索的数据,并且内存数据库可以满足此要求.

现在说了这么多,DB2 和 Oracle 都有很好的设置相关文档。事实上,他们俩都有“向导”来做到这一点。如果您仍然认为测试将数据添加到数据库并从物理的非内存数据库中检索数据是谨慎的做法,那么我建议您设置一个“测试数据库”环境并在持续集成期间将您的数据源指向该环境测试。如果您使用 Hudson 或 Jenkins 进行 CI,您可以在构建完成后 set it up to run a script 截断数据库表,以便下一轮测试从空白开始。

编辑

我刚刚看到您针对您的问题发布的更新,所以让我来解决它们。由于您已经设置和配置了数据库,那么您真正想要做的是动态选择数据库应该是什么。一种方法是使用可以从属性文件继承的系统属性设置数据源,并在“DB2-test”环境和“Oracle-test”环境中运行测试。使用此方法,您必须设置datasource programmatically 并让它读取系统环境变量以确定它连接到哪个数据库。这实际上需要您更改 CI 脚本以首先运行 DB2-test 环境,然后是 Oracle-test 环境——您的测试套件将运行两次。

希望这会有所帮助!

【讨论】:

我正在做这一切。我的目标只是测试 DAO 检索和持久化数据。我已经有了针对 Oracle 的测试用例。我正在使用 Unitils 在测试运行之前清除所有数据,每次加载测试数据。现在我正在寻找的是,如何循环运行所有测试,以便针对所有配置的数据库测试 DAO? 查看我的帖子的更新...这个想法是您针对不同的数据源连续运行测试套件。 这将变得依赖于 CI 服务器。不能只用Spring就完成吗? 好吧,您可以更改您的测试套件以设置两个数据源并将它们存储在您在测试用例中循环遍历的全局列表中,并在每次迭代时重置 sessionFactory...这就是您什么意思? 我在回答另一个问题时是这样想的。【参考方案3】:

4.9 单元有一个新功能:TestRule

您应该能够编写规则,对不同的数据库重复测试。

有这个堆栈溢出问题:How to Re-run failed JUnit tests immediately? 这是一个稍微不同的问题,但解决方案应该是相同的技术。

【讨论】:

以上是关于Spring JPA:在 CI 环境中使用多个数据库测试 DAO 层的主要内容,如果未能解决你的问题,请参考以下文章

使用多个where子句在spring数据jpa中删除

如何使用 Spring 和 JPA 设置多个数据源

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

使用 Spring Data JPA 的多个数据库

多个数据库的 Spring Data JPA 配置

spring-data-jpa 如何使用多个数据源? [复制]