在每次测试前触发 Flyway 迁移
Triggering Flyway migration before each test
我正在 Spring 引导项目中实施集成测试套件。我的项目正在使用Flyway进行数据库迁移。
我的测试 class 看起来与此类似:
@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers
internal class MyIntegrationTest {
@Container
private val postgres = postgresContainer
@Autowired
private lateinit var mockMvc: MockMvc
// ... several test cases
}
Spring Boot 在应用程序上下文启动时运行 Flyway 迁移。问题是 @SpringBootTest
仅启动应用程序上下文一次,因此我的数据库仅在 所有测试 之前初始化,而不是 在每个测试 之前初始化。
我还尝试在我的测试中注入一个 Flyway 字段 class:
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.migrate()
}
但是有 No qualifying bean of type 'org.flywaydb.core.Flyway' available
.
那么,在每次测试之前触发迁移的正确方法是什么?
注释:
- (PostgreSQL) 测试容器已为每个测试正确创建和启动。
- 我在 application.properties 中使用此配置:
spring.flyway.enabled=false
找到了一个考虑 JUnit 和 Spring 启动配置的解决方案。
No qualifying bean of type 'org.flywaydb.core.Flyway' available
的原因是我配置错误:spring.flyway.enabled=false
。这也禁用了 Flyway 实例的创建,而不仅仅是初始迁移。
所以我从 application.properties
中删除了此 属性,并将此代码添加到我的测试 class(同样由 Onome Sotu 建议在他的评论中):
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.clean()
flyway.migrate()
}
我还在测试中添加了@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class:这样容器只创建并启动一次(不需要从头开始重新创建数据库,因为我可以在每次测试前清理它).此外,这使得测试执行速度非常快。
注意:实际上,使用此设置,容器创建会执行两次:一次在上下文启动时,一次在测试 class 创建时。类似地,数据库迁移针对每个测试用例执行 +1(+1 发生在上下文启动时)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...
尝试像这样注释您的测试:
@Test
@FlywayTest
public void testFunction(){..}
来自 Flyway 文档:
Annotation FlywayTest for database unit testing. Use Flyway feature.
clean - execution of flyway task clean
init - execution of flyway task init
migrate - execution of flyway task migrate
https://github.com/flyway/flyway-test-extensions
此外,请确保包含以下依赖项:
testCompile 'org.flywaydb:flyway-core:6.4.1'
testCompile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:6.3.3'
我正在 Spring 引导项目中实施集成测试套件。我的项目正在使用Flyway进行数据库迁移。
我的测试 class 看起来与此类似:
@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers
internal class MyIntegrationTest {
@Container
private val postgres = postgresContainer
@Autowired
private lateinit var mockMvc: MockMvc
// ... several test cases
}
Spring Boot 在应用程序上下文启动时运行 Flyway 迁移。问题是 @SpringBootTest
仅启动应用程序上下文一次,因此我的数据库仅在 所有测试 之前初始化,而不是 在每个测试 之前初始化。
我还尝试在我的测试中注入一个 Flyway 字段 class:
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.migrate()
}
但是有 No qualifying bean of type 'org.flywaydb.core.Flyway' available
.
那么,在每次测试之前触发迁移的正确方法是什么?
注释:
- (PostgreSQL) 测试容器已为每个测试正确创建和启动。
- 我在 application.properties 中使用此配置:
spring.flyway.enabled=false
找到了一个考虑 JUnit 和 Spring 启动配置的解决方案。
No qualifying bean of type 'org.flywaydb.core.Flyway' available
的原因是我配置错误:spring.flyway.enabled=false
。这也禁用了 Flyway 实例的创建,而不仅仅是初始迁移。
所以我从 application.properties
中删除了此 属性,并将此代码添加到我的测试 class(同样由 Onome Sotu 建议在他的评论中):
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup() {
flyway.clean()
flyway.migrate()
}
我还在测试中添加了@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class:这样容器只创建并启动一次(不需要从头开始重新创建数据库,因为我可以在每次测试前清理它).此外,这使得测试执行速度非常快。
注意:实际上,使用此设置,容器创建会执行两次:一次在上下文启动时,一次在测试 class 创建时。类似地,数据库迁移针对每个测试用例执行 +1(+1 发生在上下文启动时)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...
尝试像这样注释您的测试:
@Test
@FlywayTest
public void testFunction(){..}
来自 Flyway 文档:
Annotation FlywayTest for database unit testing. Use Flyway feature.
clean - execution of flyway task clean init - execution of flyway task init migrate - execution of flyway task migrate
https://github.com/flyway/flyway-test-extensions
此外,请确保包含以下依赖项:
testCompile 'org.flywaydb:flyway-core:6.4.1'
testCompile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:6.3.3'