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

How to do partial migration in Flyway for testing?

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

我有 5 个迁移脚本,其中第 2 个创建带有一些列的初始 Users table,第 5 个添加到现有的 Users table 中新列和该新列的默认值。

首先,我想只迁移到脚本,以便 Users table 的初始版本,然后我将正常填充它,最后,通过 运行 第 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());
  }
}

EmptyMigrationStrategyConfig

@Configuration
public class EmptyMigrationStrategyConfig {

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

应用-test.yaml

spring:
  flyway:
    locations: classpath:/db/migration

您正在寻找 flyway.target 选项(api 中的 .target())。参见 https://flywaydb.org/documentation/commandline/migrate#target

此配置参数设置要迁移到的版本。因此,如果您有 3 次迁移 V1__, v2__, v3__ 使用 flyway.target=2 仅迁移 V1__v2__.

最后我更换了

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 以具有这两个基本路径