Testcontainers

Testcontainers

简介

Testcontainers 是一个开源框架,用于提供数据库、消息总线、WEB 浏览器或任何可以在 Docker 容器中运行的东西的一次性轻量级实例。

目前,SpringBoot 支持了如下这些容器:

  • CassandraContainer
  • CouchbaseContainer
  • ElasticsearchContainer
  • GenericContainer 可以使用 redisopenzipkin/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


Testcontainers
https://wangqian0306.github.io/2023/test-containers/
作者
WangQian
发布于
2023年6月28日
许可协议