如何准备在内存替换中使用PostgreSQL的集成测试?

Tar*_*nti 5 testing postgresql integration-testing in-memory-database spring-boot

我了解到,在集成测试中使用实际的数据库会大大降低它们的速度。因此,我必须使用内存数据库,这可能会大大提高集成测试的速度。

我正在使用Springboot进行应用程序开发。如何配置PostgreSQL以进行测试?内存数据库中是否有任何与PostgreSQL语法高度兼容的数据库?

如果没有,我应该如何执行集成测试。

Ynv*_*Ynv 5

实际上,您可以让真正的 Postgres 在测试环境中安静地运行。

我还建议您使用 dockerized 数据库,但使用 tmpfs 来内存映射数据文件夹:

docker run --name postgres95 -p 5432:5432 --tmpfs /var/lib/postgresql/data:rw -e POSTGRES_PASSWORD=admin -d postgres:9.5.6
Run Code Online (Sandbox Code Playgroud)

这与您使用真实的东西所能得到的最接近“内存中”。

我认为集成测试缓慢的主要问题之一不是数据库本身的性能,而是为每个测试设置数据库所需的时间。

我编写了一个小库来帮助您快速将数据库恢复到“干净”状态。这样您只需运行一次昂贵的数据库迁移,然后就可以快速恢复每次测试的数据库。

我们在生产系统中使用它,使我们的集成测试速度提高了 4 倍:

https://github.com/ayedo/postgres-db-restore


pio*_*rek 3

我在真正的 postgres 上进行的一些数据库测试每次需要 10 毫秒。我在每个测试中进行多次提交。所以:

要覆盖 postgres-native 功能,您需要相同的数据库(正如您所注意到的,h2 和其他内存数据库不太兼容)。postgres 没有内存模式。对于功能测试,真实数据库本身并不比任何内存数据库慢多少。差异通常在于启动时间(对于 postgres 9.6,约为 4 秒)。但是,如果您的测试生命周期很聪明,并且您可以将数据库启动数量降低到 1 或 0(通过让开发数据库始终准备就绪),那么问题就不再明显。

因此,获取真正的 postgres 并正确设置其生命周期。有一些工具可以帮助您解决一些问题:

  1. testcontainers将帮助您提供真实的数据库。

  2. dbunit - 将帮助您清理测试之间的数据

    缺点:

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

    缺点:

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

另一个步骤是将数据库移至操作系统级别的内存。同样,第一次启动时间将相似,因为所有内容都需要加载。这里这里的一些起点

缺点:

  • 团队中的每个开发人员都必须修改他的本地环境
  • 无法在操作系统之间移植(如果您的团队有异构环境)