Tar*_*nti 5 testing postgresql integration-testing in-memory-database spring-boot
我了解到,在集成测试中使用实际的数据库会大大降低它们的速度。因此,我必须使用内存数据库,这可能会大大提高集成测试的速度。
我正在使用Springboot进行应用程序开发。如何配置PostgreSQL以进行测试?内存数据库中是否有任何与PostgreSQL语法高度兼容的数据库?
如果没有,我应该如何执行集成测试。
实际上,您可以让真正的 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
我在真正的 postgres 上进行的一些数据库测试每次需要 10 毫秒。我在每个测试中进行多次提交。所以:
要覆盖 postgres-native 功能,您需要相同的数据库(正如您所注意到的,h2 和其他内存数据库不太兼容)。postgres 没有内存模式。对于功能测试,真实数据库本身并不比任何内存数据库慢多少。差异通常在于启动时间(对于 postgres 9.6,约为 4 秒)。但是,如果您的测试生命周期很聪明,并且您可以将数据库启动数量降低到 1 或 0(通过让开发数据库始终准备就绪),那么问题就不再明显。
因此,获取真正的 postgres 并正确设置其生命周期。有一些工具可以帮助您解决一些问题:
testcontainers将帮助您提供真实的数据库。
dbunit - 将帮助您清理测试之间的数据
缺点:
testegration - 旨在为您提供完整、随时可用且可扩展的生命周期(披露:我是创建者)。
缺点:
另一个步骤是将数据库移至操作系统级别的内存。同样,第一次启动时间将相似,因为所有内容都需要加载。这里和这里的一些起点
缺点:
| 归档时间: |
|
| 查看次数: |
2182 次 |
| 最近记录: |