[TOC]
需要背景
团队有集成测试的需要,集成测试须要依赖一些中间件,比方 mysql,rabbitmq。每个研发人员有对本人开发的那局部代码进行测试编写和运行检测的需要。
为了不相互影响,能够抉择在研发本地搭建本人的依赖环境,咱们心愿这些环境搭建要容易、疾速,且不便清理。
应用 docker 进行环境搭建
而 docker,则能很好实现上述诉求。
但仅仅这样还不够,咱们还面临着以下一些问题
- 本地环境搭建的繁琐。每个研发,都要在本地装置 docker 环境,这会导致在应用上的一些门槛和不便,以我司为例,因为有严格的网络管控,咱们都是内网进行开发,无奈联网。特地 windows 在装置 docker 时,须要联网。尽管能够想方法解决,但每个新来小伙伴都要经验一些本地环境装置调试过程,实属繁琐
- 测试运行速度无奈保障。当一个我的项目依赖中间件较多时,基于本地的 docker 也会占用大量的资源影响测试速度
- 多环境集成测试麻烦。因为集成测试依赖本地 docker,那么这份代码在不同的环境,比方在 Jenkins 上打包运行时,须要在对应的环境也装置 docker
总结来看,应用 docker 能够帮忙咱们疾速的搭建我的项目依赖环境,然而本地化的 docker 依赖,仍然让咱们的代码在测试时,不够纯正,对其各个运行环境,都有有本地 docker 装置的要求。
以中心化的 docker server 改良集成测试
而实际上,docker 自身提供了近程链接模式,则使得咱们能够中心化的部署 docker,而后集成测试代码以 tcp 链接的形式,应用 docker server,进行依赖中间件搭建,测试。
Docker Server 近程链接配置
以 centos 为例 7.6 为例,解说如何将一个 docker 配置成能够近程链接。
-
在
/etc/docker/daemon.json
中开启近程链接端口{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}
-
增加文件
/etc/systemd/system/docker.service.d/override.conf
,留神上述门路不存在则手动创立[Service] ExecStart= ExecStart=/usr/bin/dockerd
- 重载守护过程
systemctl daemon-reload
- 重启 docker 容器
systemctl restart docker.service
Testcontainers 框架
在部署好近程 docker 后,随之而来的问题是
- 如何在代码中连贯和应用近程 docker 环境
- 两个研发同时跑测试用例时,怎么保障他们各自启动的 container 在端口上不抵触
- 应用完后的 container,怎么清理
侥幸的是,Testcontainers 框架,帮咱们很好的解决了上述问题。
- 它能于 junit 4 ,junit 5 集成,帮忙咱们启停容器
- 每一次运行测试,都会启动全新的容器,裸露不一样的端口,使得两个研发同时跑测试用例时,环境互不烦扰
- 它应用 testcontainers/ryuk 在指定提早后,清理不再应用的 container
- 上述这所有对使用者都是通明的
Testcontainers 同 spring boot 集成
更进一步的,游戏公司 Playtika 提供了 Testcontainers 同 spring boot 整合的测试框架https://github.com/Playtika/testcontainers-spring-boot
,使得 Spring Boot 或 Spring cloud 生态的利用在编写集成测试时,更不便
环境变量依赖
应用 Testcontainers 或 playtika 的 testcontainers-spring-boot 进行近程 docker 链接时,都不须要在本地装置 docker 客户端。但须要进行相干环境变量配置,使得代码能够晓得近程 docker 的地址。该地址的配置有如下几种形式
- 形式 1,零碎环境变量配置,在以后系统配置环境变量
DOCKER_HOST=tcp://remote_docker_server_ip:2375
- 形式 2,间接在 java 测试代码中,容器结构前,通过代码
System.setProperty("DOCKER_HOST","tcp://remote_docker_server_ip:2375")
指定环境变量 - 形式 3,如果集成测试应用 maven failsafe 插件,则在插件上配置环境变量
以 command line 近程应用和治理 docker
上述测试代码不须要装置 docker 客户端。但假使咱们须要以命令行的形式,治理 docker,则能够装置一些 docker 客户端,来跟近程 docker 通信。当然上述的 Testcontainers 相当于客户端的一种。
不同操作系统的客户端程序装置形式见: https://gist.github.com/kekru…
参考资料
https://www.testcontainers.org/
https://gist.github.com/stybl…
https://github.com/Playtika/t…
https://gist.github.com/kekru…
欢送关注我的集体公众号 ” 东南偏北 UP”,记录代码人生,行业思考,科技评论