Testcontainers
简介
Testcontainers 是一个开源框架,用于提供数据库、消息总线、WEB 浏览器或任何可以在 Docker 容器中运行的东西的一次性轻量级实例。
目前,SpringBoot 支持了如下这些容器:
CassandraContainer
CouchbaseContainer
ElasticsearchContainer
GenericContainer
可以使用 redis
或 openzipkin/zipkin
JdbcDatabaseContainer
KafkaContainer
MongoDBContainer
MariaDBContainer
MSSQLServerContainer
MySQLContainer
Neo4jContainer
OracleContainer
PostgreSQLContainer
RabbitMQContainer
RedpandaContainer
使用方式
在项目创建的时候引入 Testcontainer
,在样例中以 MySQL 作为样例,依赖如下:
1 2 3 4 5 6 7 8 9
| dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'com.mysql:mysql-connector-j' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-testcontainers' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.testcontainers:mysql' }
|
单元测试样例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers;
@SpringBootTest @Testcontainers class DemoApplicationTests {
@Container @ServiceConnection static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:latest");
@Test void contextLoads() { }
}
|
注:除了单元测试之外,还可以直接使用容器作为开发环境。从 test 包中启动如下代码即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.MySQLContainer;
@TestConfiguration(proxyBeanMethods = false) public class TestDemoApplication {
@Bean @ServiceConnection MySQLContainer<?> mysqlContainer() { return new MySQLContainer<>("mysql:latest"); }
public static void main(String[] args ) { SpringApplication.from(xxxx::main).with(TestDemoApplication.class).run(args); } }
|
参考资料
官方网站
SpringBoot Testcontainers 文档
Improved Testcontainers Support in Spring Boot 3.1