在每次测试之前触发 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 迁移的主要内容,如果未能解决你的问题,请参考以下文章

迁移前的 Flyway 回调

Spring 和 Flyway - 在应用程序上下文启动之前迁移

Flyway 可重复迁移 - 在版本化迁移之前执行?

Flyway 迁移在 MS SQL Server 中成功,但在 H2 数据库中失败

flyway:即使 SQL 语句失败也强制迁移

如何在 SpringBoot 应用程序迁移之前运行 flyway:clean?