[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",记录代码人生,行业思考,科技评论