代码之家  ›  专栏  ›  技术社区  ›  davioooh

每次测试前触发Flyway迁移

  •  0
  • davioooh  · 技术社区  · 4 年前

    我正在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
    0 回复  |  直到 4 年前
        1
  •  2
  •   davioooh    4 年前

    通过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执行DB迁移(+1发生在上下文启动时)。我想找到一种方法来禁用不必要的容器创建和数据库迁移)。。。

        2
  •  0
  •   TudorCovaci    4 年前

    尝试按如下方式注释测试:

    @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'