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

标签 java postgresql integration-testing

针对“如何在应用程序中测试 SQL 语句”这一问题提出了一些建议的解决方案 -

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

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

我们使用Mybatis来访问PostgreSQL

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

最佳答案

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

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

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

  • 如何准备数据库进行测试:手动架构设置和清理?

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

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

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

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

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

    缺点:

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

    缺点:

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

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

关于java - 如何使用实际数据库进行集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43586169/

相关文章:

java - 用户输入try&catch

postgresql - 使用 find_or_create_by 解决竞争条件

api - 不同语言的相同测试

Maven 故障安全插件不运行 testNG XML 套件

java - 序列未重置模拟 HSQL 数据库并导致 JBehave 测试之间的约束冲突

java - 使用 Java 访问方法和参数历史记录

java - 在 Java 中是否有解析 Json 的通用方法?

java - 如何用位运算替换这个字符串运算?

postgresql - 结合 SUM 和 CAST - 不起作用?

sql - 两个 SQL LEFT JOINS 产生不正确的结果