java liquibase.异常.迁移失败异常:更改集迁移失败-所有集成测试的数据库初始化期间出错

myzjeezk  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(160)

我有很多集成测试,我已经设置了liquibase,这样数据库就可以初始化了。但是每个测试类都初始化一个新的初始化。在这种情况下,重复数据错误是不可避免的。我找到了一些避免这种情况的建议,但是遇到了一个问题。

  • changelog-1.xml
<databaseChangeLog
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

  <changeSet author="n" context="test" id="1" runOnChange="false">
    <sqlFile encoding="utf8" endDelimiter="\nGO" path="classpath:dump.sql" relativeToChangelogFile="false"/>
  </changeSet>
</databaseChangeLog>
  • 主控
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

    <include file="xml/changelog-1.xml" relativeToChangelogFile="true"/>

</databaseChangeLog>

我还编写了一个配置类。
Package 中:

  • liquibase.ext
public class CleanUpDatabaseTestExecutionListener extends AbstractTestExecutionListener {

    @Autowired
    SpringLiquibase liquibase;

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

    @Override
    public void afterTestClass(TestContext testContext) throws Exception {
        testContext.getApplicationContext()
                .getAutowireCapableBeanFactory()
                .autowireBean(this);
        liquibase.afterPropertiesSet();
    }
}
  • 上下文
@Slf4j
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@TestExecutionListeners(listeners = {
        DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        CleanUpDatabaseTestExecutionListener.class,
})
public abstract class AbstractTestcontainers extends ContainerConfig {

我收到一个错误:liquibase.异常.迁移失败异常:迁移更改集数据库/更改日志/测试/liquibase-initdb失败。xml::1::n:原因:liquibase.异常.数据库异常:错误:类型"calc_types"已存在[失败的SQL:(0)----PostgreSQL数据库转储

spring. liquibase. drop-first = true-它不工作。
也许谁知道我该怎么改正呢?

0mkxixxg

0mkxixxg1#

当时,我这么做

@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class AbstractTestcontainers extends ContainerConfig{

    @DynamicPropertySource
    private static void dynamicProperties(DynamicPropertyRegistry registry) {
        
        registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl);
        registry.add("spring.datasource.username", postgreSQLContainer::getUsername);
        registry.add("spring.datasource.password", postgreSQLContainer::getPassword);
    }
}

我不得不给予:
@脏上下文(类模式=类模式.在类之前)

public abstract class ContainerConfig {

    protected static final PostgreSQLContainer postgreSQLContainer;

    static {

        DockerImageName postgres = DockerImageName.parse("postgres:11.7");

        postgreSQLContainer = (PostgreSQLContainer) new PostgreSQLContainer(postgres)
                .withDatabaseName("test")
                .withPassword("root")
                .withUsername("root")
                .withReuse(true);

        postgreSQLContainer.start();
    }

}

我不得不翘掉一些课

@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:createUsers.sql")
public class SomeClassRestTest extends AbstractTestcontainers {

清除表格并填入新数据。

Liquibase配置运行了一次,至少我没有看到任何冲突。因为我们已经创建了一个类来引发上下文,并且所有其他集成测试都是使用此上下文执行的。当然,测试类本身是错误创建的,因此有必要使用**@AfterClass@AfterMethod**注解从数据库中清除数据。但是,现在,大约300个测试的执行已经减少了大约4倍。

如果这个问题还有其他解决办法,请来信。

相关问题