# 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/) ![img.png](img.png) ### 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的子类,是继承关系 ![img_1.png](img_1.png)