测试容器的初始化脚本无法正常工作

Posted

技术标签:

【中文标题】测试容器的初始化脚本无法正常工作【英文标题】:Init Script for Testcontainers doesn't work properly 【发布时间】:2021-09-05 08:42:53 【问题描述】:

正如我在标题中提到的,我在使用 Init Script for Testcontainers 时遇到了问题。

脚本内容:

CREATE SCHEMA IF NOT EXISTS dbo_core;

CREATE TABLE IF NOT EXISTS dbo_core.company (
    ID BIGINT generated by default as identity primary key,
    NAME VARCHAR(255) not null
);

INSERT INTO dbo_core.company (ID, NAME) VALUES (1, 'Company1');

通过命令查看docker内部后:

docker exec -it cranky_ramanujan psql -Utest

结果是:

test=# select * from dbo_core.company;
 id | name 
----+------
(0 rows)

有人知道我应该改进什么吗? 先感谢您。 :)

编辑。

CompanyDaoTest.java:

@RunWith(SpringRunner.class)
@Testcontainers
@SpringBootTest(classes = OutCaloriesCoreApplication.class)
public class CompanyDaoTest 

    @Container
    public static PostgreSQLContainer<OutCaloriesPostgresqlContainer> postgreSQLContainer = OutCaloriesPostgresqlContainer.getInstance().withInitScript("db-init-script.sql");

    @Autowired
    private CompanyDao companyDao;

    @BeforeAll
    static void init() 
        postgreSQLContainer.start();
    

    @Test
    @Transactional
    void findByIdShouldEndWithSuccess() 
        Company byId = companyDao.findById(1L);
        assertEquals(byId.getId(), 1L);
    

OutCaloriesPostgresqlContainer.java:

public class OutCaloriesPostgresqlContainer extends PostgreSQLContainer<OutCaloriesPostgresqlContainer> 
    private static final String IMAGE_VERSION = "postgres:11.1";

    private static OutCaloriesPostgresqlContainer container;

    private OutCaloriesPostgresqlContainer() 
        super(IMAGE_VERSION);
    

    public static OutCaloriesPostgresqlContainer getInstance() 
        if (container == null) 
            container = new OutCaloriesPostgresqlContainer();

        
        return container;
    

    @Override
    public void start() 
        super.start();
        System.setProperty("DB_URL", container.getJdbcUrl());
        System.setProperty("DB_USERNAME", container.getUsername());
        System.setProperty("DB_PASSWORD", container.getPassword());
    

    @Override
    public void stop() 
        //do nothing, JVM handles shut down
    

Testcontainers 版本为 1.15.3。

日志:https://pastebin.com/qgrPb3JL

【问题讨论】:

您能否添加您的测试类、Testcontainers 版本和测试的日志输出?此外,这份 [Testcontainers 初始化策略概述] 也可能有助于正确设置。 您将初始化脚本存储在哪个位置? src/test/resources?似乎我没有链接可能对这里有帮助的博文,这里又是overview of initialization strategies with Testcontainers的链接 我发现了问题。空表的原因是我将 spring.jpa.hibernate.ddl-auto 设置为 create-drop 并且它覆盖了由 init 脚本创建的表。现在它起作用了。谢谢。 :) 那是完美的。您可以在 Stack Overflow 上自行回答您的问题并将其标记为正确答案。 酷。好主意。谢谢。 :) 【参考方案1】:

空表的原因是在“create-drop”上设置了“spring.jpa.hibernate.ddl-auto”属性。 它使得由 init 脚本创建的表和值被 hibernate 生成的新表覆盖。 就我而言,最好的解决方案就是将此属性设置为“无”。

【讨论】:

以上是关于测试容器的初始化脚本无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Linux服务器初始化工作

脚本测试,注意记录并且恢复初始状态

docker容器启动Mysql执行初始化sql脚本实现

docker容器启动Mysql执行初始化sql脚本实现

docker容器启动Mysql执行初始化sql脚本实现

Erlang:守护进程“init.d”脚本无法启动