Spring Boot,测试容器以测试发送到外部数据库的查询
SpringBoot, test containers to test queries sent to external DB
我的 Spring 应用程序有自己的持久性数据库。
同一个应用程序需要向外部数据库发送临时查询。
查询由用户提供。
- 应用采用 SQL 用户提供的查询
- 应用采用外部数据库类型(postgres/oracle/任何jdbc)
- 应用程序在运行时向外部数据库提交即席查询
- 应用程序 returns 结果为 json 给用户
有什么方法可以利用 spring 测试容器来测试这个功能吗?
我的目标是:
- 为每个支持的数据库编写测试
- 每个测试都使用支持的数据库启动测试容器(我想是其中的一些子集:https://www.testcontainers.org/modules/databases/)
- 每次测试都会将样本数据上传到容器DB
- 每个测试都会针对它运行一组 "must work" 个查询。
我看到很多例子,其中应用程序本身是针对测试容器进行测试的,但是我可以启动容器 w/o 将其作为应用程序持久性数据库插入吗?
can I just start container w/o plugging it as App persistence DB?
是的,这完全有可能。
Testcontainers 本身与 Spring 或 Spring Boot.
无关
你会做的是:
- 选择您要使用的容器(不同数据库使用不同容器
- 实例化容器
- 启动它
- 从中构造一个
DataSource
- 使用那个
DataSource
进行测试。
Spring 数据 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 应用程序有自己的持久性数据库。 同一个应用程序需要向外部数据库发送临时查询。 查询由用户提供。
- 应用采用 SQL 用户提供的查询
- 应用采用外部数据库类型(postgres/oracle/任何jdbc)
- 应用程序在运行时向外部数据库提交即席查询
- 应用程序 returns 结果为 json 给用户
有什么方法可以利用 spring 测试容器来测试这个功能吗? 我的目标是:
- 为每个支持的数据库编写测试
- 每个测试都使用支持的数据库启动测试容器(我想是其中的一些子集:https://www.testcontainers.org/modules/databases/)
- 每次测试都会将样本数据上传到容器DB
- 每个测试都会针对它运行一组 "must work" 个查询。
我看到很多例子,其中应用程序本身是针对测试容器进行测试的,但是我可以启动容器 w/o 将其作为应用程序持久性数据库插入吗?
can I just start container w/o plugging it as App persistence DB?
是的,这完全有可能。 Testcontainers 本身与 Spring 或 Spring Boot.
无关你会做的是:
- 选择您要使用的容器(不同数据库使用不同容器
- 实例化容器
- 启动它
- 从中构造一个
DataSource
- 使用那个
DataSource
进行测试。
Spring 数据 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;");
}
}