TL;DR 如何配置我的 JUnit 测试套件在 5 个线程上运行,每个线程使用不同的数据源?
我正在尝试加快 SpringBoot/JUnit 5 集成测试的速度,该测试目前需要 40 多分钟。我们正在考虑将它们并行化以节省时间。问题是某些测试会影响数据库,如果同时运行,这可能会扰乱其他测试。
我们的计划是使用 5 个 MySQL 容器并在 5 个线程上运行测试,每个线程连接到不同的容器。这样,测试就不会互相干扰。
您可以帮助我将 JUnit 测试套件配置为在 5 个线程上运行,每个线程使用不同的数据源吗?
您可以按照“JUnit 的并行测试执行”
目录中添加/完成
src/test/resources
文件,在 JUnit 中启用并行执行:
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
junit.jupiter.execution.parallel.config.strategy = fixed
junit.jupiter.execution.parallel.config.fixed.parallelism = 5
(Junit 本身使用类似的测试)
然后配置 Spring Boot 为每个测试创建不同的
DataSource
对象。使用 Spring 配置文件 或根据当前线程动态选择数据源。
使用 Spring 配置文件,为
application.properties
或 application.yml
中的每个配置文件定义数据源属性:
spring:
profiles: datasource1
datasource:
url: jdbc:mysql://localhost:3306/db1
username: user
password: pass
--- # Repeat for each datasource configuration
(您可能需要使用环境变量 -
password: ${DB_PASSWORD}
- 或其他外部化配置来存储密码等敏感信息。至少使用具有有限权限的测试帐户。)
配置一个
DataSource
bean,根据活动配置文件选择适当的配置:
@Configuration
public class DataSourceConfig {
@Bean
@Profile("datasource1")
public DataSource dataSource1() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/db1")
.username("user")
.password("pass")
.build();
}
// Repeat for other datasources
}
@ActiveProfiles
注释注释每个测试类或方法,以指定应使用哪个数据源:
@SpringBootTest
@ActiveProfiles("datasource1")
public class MyTest {
// Test methods
}
通过 IDE 或使用 Maven 或 Gradle 等构建工具运行测试。每个用特定配置文件注释的测试都将使用相应的数据源。