使用Docker进行集成testing后还原数据库状态?

我们正在使用PostgreSQL以及部署到JBoss的EAR。 在构build过程中,我们有一个开发数据库转储,然后在集成testing中使用:部署特殊工件,testing使用http客户端与应用程序进行通信。

目前,在testing运行期间数据库状态发生变化,所以我们没有办法,只能为每个修改它的testing添加额外的内容,所以没有testing会互相依赖。 这需要非常多的时间和耐心,因为这样的testing甚至取决于logging的顺序。

有没有办法让数据库的快照,以便每次testing运行后恢复它与合理的资源量? Docker可以帮忙吗? 或者任何其他方式?

H2不是这样,因为我们使用了一些PostgreSQL特有的function。 testing可能跨越多个事务,所以我想回滚也无济于事。

Docker的一个简单的方法是将数据库快照作为您重置的卷,然后安装到您的testing运行的开始。

你可以在运行testing之前对这些数据进行处理(或者对你的整个初始数据库configuration进行一次tar或者其他处理),然后启动你的PostgreSQLtesting数据库,将testing数据作为一个卷装载,并且你的PostgreSQL指向这个数据库testing。

一种select是在每次集成testing完成后重新数据化数据。 Spring通过SqlScriptsTestExecutionListener和@Sql注释提供了这样的function。 我知道你提到了EARJBoss ,所以如果Spring没有被使用,我相信Arquillian可能会提供类似的东西。

如果重新接种数据库由于用于集成testing的数据量变得很昂贵,另一个select是使用带有数据库的Docker图像,并且已经包括种子数据。 在每个集成testing执行之前,您需要DB with data容器启动DB with data并在完成后停止,换句话说,您需要在集成testing期间pipe理容器生命周期。 我在几个月前写了一篇关于如何完成这个任务的文章: 使用Spring Boot,Postgres和Docker进行集成testing ,使用Spring Boot ,但是这些想法可以与其他框架一起使用。 它包括用导入的数据创buildDocker镜像,从现有模式生成JPA实体,在每个testing执行之前和之后添加对集成testing的启动/停止容器的支持,并且可以很容易地扩展到每个testing启动多个容器或者由于Docker容器映射到主机随机端口而同时执行它们。

在这一点上,这是一个妥协,从一个知道状态(恕我直言,正确的方法)开始每个testing,或者重新播种数据或开始/停止容器为每个单独的testing或按特定的顺序运行testing,只是重新在testing套件执行之前,请检查数据。

您可以通过克隆初始数据库并在testing之后删除新创build的testing数据库来完成此操作。 当使用原始数据库作为“TEMPLATE”时,这可能只需要几毫秒。

// FIXTURES // Create "initial_database" before all tests are run and load fixtures etc.

// TEST SETUP BEFORE EACH TEST CREATE DATABASE some_test_database_name TEMPLATE "initial_database";

// TEST TEARDOWN AFTER EACH TEST DROP DATABASE some_test_database_name;