如何在Flyway中进行部分迁移进行测试?

问题描述 投票:0回答:3

我正在尝试编写一个测试来验证我的新迁移脚本(位于 src/main/resources/db/migration 中)是否能够在 Postgres DB 中的现有数据上正确执行。

我有 5 个迁移脚本,其中第二个脚本创建带有一些列的初始

Users
表,第五个脚本添加到现有
Users
表中,其中包含新列和该新列的默认值。

首先,我只想迁移到脚本,以便

Users
表的初始版本,然后我将正常填充它,最后,通过运行第5个脚本完成迁移,然后检查第5个脚本是否脚本实际上是否更新了现有数据。但是,我不明白如何仅迁移到某个版本,然后再迁移到其余版本......

这是我到目前为止所拥有的:

实际测试

@RunWith(SpringRunner.class)
@SpringBootTest
class MigrationTest extends ComponentTest {

  private static final String USER_ID = "1337";

  @Autowired
  private InitialUserRepository initialUserRepository;
  @Autowired
  private UserRepository userRepository;

  @Autowired
  private Flyway flyway;

  @Transactional
  @Test
  public void test() {

    flyway.baseline(); // default 1
    flyway.migrate(); // this will migrate to the final script/version where it will add the new column
    // replace the above line, flyway.migrate(), with a partial migration to version 2 ONLY, something like flyway.migrate(2)

    var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
    initialUserRepository.saveAndFlush(initialUserMappingEntity);

    var user = initialUserRepository.findById(USER_ID);
    assertTrue(user.isPresent());

    // complete the full migration here, something like flyway.migrate(5)

    var updatedUser = userRepository.findById(USER_ID);
    assertTrue(updatedUser.isPresent());
    assertNotNull(updatedUser.get().getNewColumn());
  }
}

空迁移策略配置

@Configuration
public class EmptyMigrationStrategyConfig {

  @Bean
  public FlywayMigrationStrategy flywayMigrationStrategy() {
    return flyway -> {
      // do nothing
    };
  }
}

应用程序测试.yaml

spring:
  flyway:
    locations: classpath:/db/migration
java spring testing flyway
3个回答
0
投票

您正在寻找

flyway.target
选项(API 中的
.target()
)。请参阅 https://flywaydb.org/documentation/commandline/migrate#target

此配置参数设置要迁移到的版本。因此,如果您有 3 次迁移

V1__, v2__, v3__
,请使用
flyway.target=2
仅迁移
V1__
v2__


0
投票

最后我更换了

var initialUserMappingEntity = new InitialUserMappingEntity(USER_ID, "some other data");
initialUserRepository.saveAndFlush(initialUserMappingEntity);

插入脚本位于:

/db/testdata/V2.1__insert_user_data.sql
然后只进行一次迁移直到最后。

因此,您基本上需要在要在

/db/migration
中测试的最终脚本之前添加一个插入脚本,然后修改
spring.flyway.locations
以获得这两个基本路径


0
投票

在 Spring boot 测试中,您可以添加属性

flyway.target

@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    properties = {"spring.flyway.clean-disabled=false", "spring.flyway.target=2"}
)
class MyTest {...}

出于本测试的目的,这将执行版本 2 之前的所有迁移(包括版本 2),忽略后续版本。

© www.soinside.com 2019 - 2024. All rights reserved.