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

How to use the actual database for integration testing?

针对问题 "How to test SQL statements in an application" -

提出了一些解决方案

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

我们使用Mybatis访问PostgreSQL

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

您可以为测试目的定义数据库配置,并连接到您的真实数据库库以执行测试。您应该在测试 类.

中访问测试数据库配置

例如,如果您使用 spring 和休眠连接到数据库,您可以定义一个测试休眠配置 xml 文件,它连接到测试数据库。然后在您的测试 类 中,按如下方式使用此配置文件:

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

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

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

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

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

  • 如何为测试准备数据库:手动模式设置和清理?

  • 如何在测试之间重置数据库:重新启动?总是回滚?预定义和单独定义的内容?某种反向操作?

  • 是否以及如何使这些测试更快?

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

  1. testcontainers会帮你提供 db.

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

    缺点:

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

    缺点:

    • 仅对小型项目免费
    • 非常年轻的项目

您也可以自己填补空白。一如既往,这是一种交易:时间 vs 金钱