我正在尝试编写一个测试来验证我的新迁移脚本(位于 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
您正在寻找
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
以获得这两个基本路径
在 Spring boot 测试中,您可以添加属性
flyway.target
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
properties = {"spring.flyway.clean-disabled=false", "spring.flyway.target=2"}
)
class MyTest {...}
出于本测试的目的,这将执行版本 2 之前的所有迁移(包括版本 2),忽略后续版本。