在每次测试之前触发 Flyway 迁移
Posted
技术标签:
【中文标题】在每次测试之前触发 Flyway 迁移【英文标题】:Triggering Flyway migration before each test 【发布时间】:2020-12-20 19:43:29 【问题描述】:我正在 Spring Boot 项目中实现集成测试套件。我的项目正在使用 Flyway 进行数据库迁移。
我的测试类看起来像这样:
@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 字段:
@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
【问题讨论】:
看看Flyway test extensions 注入 flyway 字段并运行 flyway.clean(),flyway.migrate() 应该可以工作。您是否检查过为什么找不到合格的 bean? @OnomeSotu,是的,你是对的。我为 Flyway 使用了错误的配置... 【参考方案1】:找到了一个使用 JUnit 和 Spring Boot 配置思考的解决方案。
No qualifying bean of type 'org.flywaydb.core.Flyway' available
的原因是我的错误配置:spring.flyway.enabled=false
。这也会禁用 Flyway 实例的创建,而不仅仅是初始迁移。
所以我从 application.properties
中删除了这个属性,并将这个代码添加到我的测试类中(正如 Onome Sotu 在他的评论中所建议的那样):
@Autowired
private lateinit var flyway: Flyway
@BeforeEach
fun setup()
flyway.clean()
flyway.migrate()
我还在测试类中添加了@TestInstance(TestInstance.Lifecycle.PER_CLASS)
:这样容器只创建并启动一次(现在我可以在每次测试之前清理它,因此无需从头开始重新创建数据库)。此外,这使得测试执行速度非常快。
注意:实际上,使用此设置,容器创建会执行两次:一次在上下文启动时,另一次在创建测试类时。同样,为每个测试用例 +1 执行数据库迁移(+1 发生在上下文启动时)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)...
【讨论】:
【参考方案2】:尝试像这样注释您的测试:
@Test
@FlywayTest
public void testFunction()..
来自 Flyway 文档:
用于数据库单元测试的注解 FlywayTest。使用 Flyway 功能。
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'
【讨论】:
以上是关于在每次测试之前触发 Flyway 迁移的主要内容,如果未能解决你的问题,请参考以下文章
Spring 和 Flyway - 在应用程序上下文启动之前迁移