如何使用实际数据库进行集成测试?

时间:2017-04-24 10:51:31

标签: java postgresql integration-testing

有一些问题的建议解决方案"如何在应用程序中测试SQL语句" -

  • 使用RAM内存 - 我无法更改测试发生的分段环境的配置。
  • 使用H2 - 即使在PostgreSQL模式下也不太兼容
  • 使用相同的数据库来运行测试。
  • 使用内存模式 - PostgreSQL没有。

第三个是可行的,我调查了Test Containers,这实际上是一个美丽的解决方案,但是相对较新的解决方案。因此,我们公司对采用它持怀疑态度。

我们使用Mybatis来访问PostgreSQL

另一种方法是在测试之前重新创建整个模式并填充所需的表。这是问题,我可以创建和删除具有相同名称的表的模式。为了避免名称冲突,我必须更改模式的名称,因此,甚至应该重命名查询,这些查询根本不是首选。有没有办法在不更改查询的情况下执行此操作,而是将它们指向虚拟架构。

2 个答案:

答案 0 :(得分:1)

您可以定义用于测试目的的数据库配置,并连接到您的真实数据库基础以进行执行测试。您应该访问测试类中的测试数据库配置。

例如,如果使用spring和hibernate连接数据库,则可以定义测试hibernate配置xml文件,并将其连接到测试数据库。然后在测试类中,使用以下配置文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguratiion({testHibernate.xml, testSpring.xml , .... })
@TestExecutionListeners({...})
public class TestClass {
....
   @Test
   public void test1(){ 
     ...
   }
}

因此,您可以访问测试hibernate会话工厂来执行查询。

答案 1 :(得分:1)

您不应该更改您的查询。在测试中,您应该只更改应用程序将使用的连接URL。问题是,如何让网址正常工作。

要获得完整的测试覆盖率,您需要相同的数据库(如您所见,h2和其他内存数据库不兼容)。 postgres没有内存模式,因此您必须自己管理生命周期。你必须做出一些决定。其中一些:

  • 您将从哪里获取数据库:要求所有开发人员提供postgres(安装/ docker / vagrant)或自动设置?

  • 如何为测试准备db:手动架构设置和清理?

  • 如何在测试之间重置db:restart?总是回滚?预定义和单独定义的内容?某种逆向操作?

  • 是否以及如何快速进行这些测试?

有一些工具可以帮助您解决一些问题:

  1. testcontainers会帮助您提供 分贝。

  2. dbunit - 将帮助您准备测试数据。

    缺点:

    • 创建和维护架构和数据需要做很多工作。特别是当您的项目处于密集开发阶段时。
    • 它是另一个抽象层,所以如果突然想要使用这个工具不支持的某个数据库功能,可能很难测试它
  3. testegration - 旨在为您提供完整,随时可用且可扩展的生命周期(披露:我是创作者)。

    缺点:

    • 仅适用于小型项目
    • 非常年轻的项目
  4. 你也可以自己填补空白。一如既往,它是一种交易:时间与金钱