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

Database SpringJPA:在CI环境中使用多个数据库测试DAO层,database,spring,testing,dao,Database,Spring,Testing,Dao,我们正在进行一个数据库需求不明确的项目。因此,我们正在构建一个与数据库无关的应用程序 请看我前面的问题: 现在我想用多个数据库测试我的Spring应用程序DAO。我已经使用TestNG和DBUnit编写了大量的测试用例 在CI环境中运行这些测试时,我希望它们针对所有配置的数据库测试应用程序。我已经在“测试服务器”上安装了数据库 e、 g.我想要这样的东西: for ( each database configured ) { run each dao test } 不确定这样做的最佳方式是什

我们正在进行一个数据库需求不明确的项目。因此,我们正在构建一个与数据库无关的应用程序

请看我前面的问题:

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

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

e、 g.我想要这样的东西:

for ( each database configured ) {
 run each dao test
}
不确定这样做的最佳方式是什么?欢迎帮助

谢谢,
Adi

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

换句话说,在您的例子中,我认为测试应该更多地关注于DAO检索您认为在设置数据之后它将检索的数据,内存中的数据库就可以了

总而言之,这两个数据库都有很好的与安装相关的文档。事实上,它们都有“向导”来完成这项工作。如果您仍然认为测试向数据库中添加数据并从物理、非内存数据库中检索数据是明智的,那么我建议设置一个“测试数据库”如果您正在使用Hudson或Jenkins for CI,则可以在构建完成后截断数据库表,以便下一轮测试可以从无到有地进行

编辑

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


希望这有帮助!

第4.9单元有一个新功能:

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

存在以下堆栈溢出问题: 这是一个稍微不同的问题,但解决方法应该是相同的技术

  • 如果你想独立于数据库,你必须测试每一个你想支持的数据库系统,有很多细微的差别是通过Hibernate泄露出来的

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

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

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


  • 我正在做所有这些。我的目标只是测试DAO检索和持久化数据。我已经有了针对Oracle的测试用例。我正在使用Unitils在测试运行之前清除所有数据,每次加载测试数据。现在我要搜索的是,如何在一个循环中运行所有测试,以便针对所有c配置的数据库?请参阅我的文章的更新…其想法是针对不同的数据源连续运行测试套件。这将取决于CI服务器。不能仅使用Spring来完成吗?好的,您可以更改测试套件以设置这两个数据源,并将它们存储在一个全局列表中,然后通过i循环在您的测试用例中,在每次迭代中重置sessionFactory…这就是您的意思吗?在回答另一个问题时,我就是这么想的。