基于testcontainers的集成测试方案
Testcontainers是一个Java库,支持JUnit测试,它提供常见数据库,Selenium Web浏览器或可以在Docker容器中运行的任何其他东西的轻量级,一次性的实例。
testcontainers官网为https://www.testcontainers.org/
基础工程
- docker环境
- springBoot工程
docker环境
https://download.docker.com/win/stable/Docker Desktop Installer.exe
下载Docker Desktop Installer.exe进行安装Docker
- 查看Docker版本
- Docker 服务启动/关闭命令
# 启动docker服务
Net start com.docker.service
# 停止docker服务
Net stop com.docker.service
springBoot应用
redis
- RedisTestContainersTest.java
@Testcontainers
public class RedisTestContainersTest {
private RedisCommands<String,String> redisCommands;
/**
* 初始化redis 容器
*/
@Container
public GenericContainer redis = new GenericContainer("redis:5.0.3-alpine")
.withExposedPorts(6379);
@BeforeEach
public void setUp() {
String address = redis.getHost();
Integer port = redis.getFirstMappedPort();
//初始化redis客户端
redisCommands = RedisClient.create(String.format("redis://%s:%d/0", address, port)).connect().sync();
}
@Test
public void testSimplePutAndGet() {
redisCommands.set("test", "example");
String retrieved = redisCommands.get("test");
System.out.println("retrieved : " + retrieved);
assertEquals("example", retrieved);
}
}
mysql
- MysqlTestContainersTest
/**
* mysql 容器测试
*/
@SpringBootTest(
classes = MysqlTestConfiguration.class,
properties = {
"spring.profiles.active=test",
"embedded.mysql.install.enabled=true",
"embedded.mysql.init-script-path=initScript.sql"
})
public class MysqlTestContainersTest {
@Autowired
ConfigurableEnvironment environment;
/**
* jdbcTemplate
*/
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void propertiesAreAvailable() {
assertThat(environment.getProperty("embedded.mysql.port")).isNotEmpty();
assertThat(environment.getProperty("embedded.mysql.host")).isNotEmpty();
assertThat(environment.getProperty("embedded.mysql.schema")).isNotEmpty();
assertThat(environment.getProperty("embedded.mysql.user")).isNotEmpty();
assertThat(environment.getProperty("embedded.mysql.password")).isNotEmpty();
assertThat(environment.getProperty("embedded.mysql.init-script-path")).isNotEmpty();
}
@Test
public void shouldInitDBForMySQL() throws Exception {
assertThat(jdbcTemplate.queryForObject("select count(first_name) from users where first_name = 'Sam' ", Integer.class)).isEqualTo(1);
}
}
kafka
参考资料
testcontainers官网
testcontainers项目地址
testcontainers-spring-boot