Spring Boot,测试容器以测试发送到外部数据库的查询

Posted

技术标签:

【中文标题】Spring Boot,测试容器以测试发送到外部数据库的查询【英文标题】:SpringBoot, test containers to test queries sent to external DB 【发布时间】:2020-07-26 01:00:48 【问题描述】:

我的 Spring 应用程序有自己的持久性数据库。 同一个应用程序需要向外部数据库发送临时查询。 查询由用户提供。

App 接受用户提供的 SQL 查询 应用程序采用外部数据库类型(postgres/oracle/whatever jdbc) 应用在运行时向外部数据库提交即席查询 应用将结果以 json 格式返回给用户

有什么方法可以利用 spring 测试容器来测试这个功能? 我的目标是:

为每个受支持的数据库编写测试 每个测试都使用受支持的数据库启动测试容器(我想是其中的一些子集:https://www.testcontainers.org/modules/databases/) 每个测试都将样本数据上传到容器数据库 每个测试都会针对它运行一组“必须工作”的查询。

我看到了很多应用程序本身针对测试容器进行测试的示例,但我可以直接启动容器而不将其作为应用程序持久性数据库插入吗?

【问题讨论】:

【参考方案1】:

我可以直接启动容器而不将其作为应用持久性数据库插入吗?

是的,这是完全可能的。 测试容器本身与 Spring 或 Spring Boot 无关。

你会做的是:

选择你想使用的容器(不同的容器用于不同的数据库 实例化容器 启动它 从中构造一个DataSource 使用 DataSource 进行测试。

Spring Data JDBC 正是这样做来针对各种数据库运行测试。 最后添加the class doing that for mysql。 这是一个 Spring 应用程序上下文配置,但您可以将其放在 JUnit before 方法、JUnit 4 规则或 JUnit 5 扩展中,或者只是您在测试开始时调用的普通方法。

@Configuration
@Profile("mysql")
class MySqlDataSourceConfiguration extends DataSourceConfiguration 

    private static final MySQLContainer MYSQL_CONTAINER = new MySQLContainer().withConfigurationOverride("");

    static 
        MYSQL_CONTAINER.start();
    

    /*
     * (non-Javadoc)
     * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource()
     */
    @Override
    protected DataSource createDataSource() 

        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setUrl(MYSQL_CONTAINER.getJdbcUrl());
        dataSource.setUser(MYSQL_CONTAINER.getUsername());
        dataSource.setPassword(MYSQL_CONTAINER.getPassword());
        dataSource.setDatabaseName(MYSQL_CONTAINER.getDatabaseName());

        return dataSource;
    

    @PostConstruct
    public void initDatabase() throws SQLException, ScriptException 
        ScriptUtils.executeSqlScript(createDataSource().getConnection(), null, "DROP DATABASE test;CREATE DATABASE test;");
    

【讨论】:

以上是关于Spring Boot,测试容器以测试发送到外部数据库的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Spring Boot 测试套件

编辑并重新运行 Spring Boot 单元测试,无需重新加载上下文以加快测试速度

为啥 Spring Boot 使用单例容器方法生成 2 个测试容器?

Spring Boot 测试容器

如何使用 spring boot 和 spock 运行测试容器

测试容器在 Spring Boot 项目中启动两个容器而不是一个