# test-containers-collections
**Repository Path**: JavaCrazy/test-containers-collections
## Basic Information
- **Project Name**: test-containers-collections
- **Description**: 集成test-containers
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-12
- **Last Updated**: 2022-01-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Docker, test-containers, testcontainers
## README
# 测试用例中test-containers集成
test-containers集成示例,[官方说明文档](https://www.testcontainers.org/)
**使用前提:**
test-containers依赖docker容器,所以必须先安装docker,并下载对应容器的镜像。
比如示例中用的是mysql8.0,所以执行`docker pull mysql:8.0`拉取镜像
## 1.项目test-containers-single
test-containers-single1和2都是 :junit单库集成test-containers
区别是single2是固定mysql端口来实现的,这样服务数据源配置就以前配置就一模一样了。
test-containers相关依赖引入
```xml
org.testcontainers
testcontainers
1.16.2
org.testcontainers
mysql
1.16.2
test
```
## 2.项目test-containers-sharding
junit分库分表场景中集成test-containers
分库分表组件是sharding-jdbc
## 3.项目testng
testng单库集成test-containers
## 4.相关问题
### 1.test-containers只能初始化单个sql脚本,想要初始化多个怎么办?
test-containers提供了一个初始化脚本的静态类
`org.testcontainers.ext.ScriptUtils.runInitScript`
sql脚本初始化注意点:
* sql脚本中不能指定数据库,如xx.table_1
* 多库场景,将不库的SQL脚本放在不同文件夹,然后扫描执行
* 主要脚本的顺序
### 2.在spring的testng测试组件中,集成test-containers不能初始化?
可以手动启动容器。不能自动初始化,是因为网上博客中用到的@ClassRule和@Rule注解都是junit的。
见服务`testng`
```java
public static MySQLContainer mysql = new MySQLContainer<>("mysql:8.0")
.withInitScript("db/init.sql");
// @BeforeClass// junit注解
@BeforeSuite// testng注解
public static void init(){
mysql.start();
}
```
test-containers对junit系列测试组件和spock有良好的支持,但是其他测试组件无说明。见[官方文档](https://www.testcontainers.org/quickstart/junit_4_quickstart/)

### 3.如何在容器启动时就固定对外暴露的端口,这样可以直接在配置文件中配置数据源,而不需要通过System.property来设置?
可以再初始化容器时,采用方法withCreateContainerCmdModifier指定端口号。
见服务`test-containers-single2`
`com.testng.test.FixedPortContainersTest`
```java
new GenericContainer(...).withCreateContainerCmdModifier(
cmd -> {
//对主机端口和docker中的端口进行绑定,前面的是主机端口,后面的是docker中的端口
cmd.withPortBindings(new PortBinding(Ports.Binding.bindPort(8000), new ExposedPort(6379)));
})
```
### 4.Junit和testng继承spring异同?
两者集成方式差不多,都可以继承指定两个类来实现。但Junit额外提供了注解方式来集成Spring。
可以使用注解@RunWith和SpringRunner.class或SpringJUnit4ClassRunner来实现
SpringRunner是SpringJUnit4ClassRunner的子类,是继承关系
