Docker在测试中的应用实践


对于测试同学来说,大家是否经常遇到下面这些问题?

**1.**和开发共用一套测试环境,测试时不能保证环境的稳定性,有可能在开发环境上稳定,但上线时会容易漏掉一些文件配置等。当然还经常会与开发就bug产生一些纠纷。

**2.**多个项目部署到同一台服务器,测试时会多了一些不相关的噪音,可能影响到测试的准确性。

**3.**重新部署一套测试环境,代码是开发写的,环境配置可能是运维搞得,如果测试任务多了,需要部署一套新的测试环境怎么办?我们需要费很大劲去折腾。

**4.**用selenium做ui自动化测试以及兼容性测试时,需要安装相应的浏览器及其适配版本的驱动,过程繁琐还需要亲自调试,麻烦的是有些浏览器版本和驱动对系统内核还有要求。

**5.**很多时候,我们测试服务器资源不是很多,我们想在这有限的资源上开发部署自己的web平台,又怕自己的环境影响到其他人,畏手畏脚,怎么办?

   归根结底就是我们需要一套属于自己的环境,这个环境能够随时随地拿起来就用,提升我们的测试效率以及测试准确性。其生命周期也需要受到我们控制,让我们彻底放飞自我,不再畏手畏脚。

   那么,有什么答案解决这种环境问题吗?有,docker就是这种答案。那么docker是什么东西,用来干什么了?且听我给大家慢慢道来。

   Docker 是一个开源的应用容器引擎,让开发测试可以打包他们的应用以及依赖包到一个可移植的容器中。套用docker官方的口号:Build, Ship, and Run Any App, Anywhere。意思就是在任何平台都可以构建、部署、运行任何应用。听起来很厉害的样子,不过docker轻量(占用内存资源少)、标准与持续化部署(开发、测试以及线上环境的一致性)、强大的移植能力(各种系统)、安全的特性使得其成为实现轻量级的操作系统虚拟化的优秀解决方案。

   到这,估计大家基本大致知道docker是个什么东西了,但是为了让大家更为直观的了解docker,并且解答docker是如何解决文章一开始提出的几个问题,这里通过docker在测试中的几个应用实践带领大家进入docker世界。

应用实践1:docker搭建业务测试环境

   事实上,公司提供了适配公司现有环境的容器化产品,主要是基于Docker和Kubernetes底层技术架构,这个也是主流的基础架构方案。但是为了大家更进一步了解docker,我就以自己基于javaweb搭建的一个自动化应用平台为例,展示下docker如何搭建测试环境。在这里不得不介绍两个最重要的基本概念,容器和镜像。可以用一句话概括:Docker就是将一个应用程序正常运行所需的一系列东西打包成一个镜像,用的时候,基于这个镜像启动一个容器实例,直接使用。而现在我们要做的就是要将我们javaweb应用需要的一系列东西通过Dockerfile的方式建立一个可复用的镜像。

文件内容如下:

    从图中不难看出,在Dockerfile中构建一个docker镜像的基本指令,包含FROM(基础镜像)、WORKDIR(建立文件夹)、COPY(宿主机文件复制)、RUN(linux常用命令操作)、ENV(环境变量设置)这几个指令。这几个指令的组合能够生成一套稳定的javaweb镜像。文件写完之后,只需要docker build一下,就能够生成我们需要的javaweb镜像。我们可以将镜像上传到镜像仓库上,然后我们就可以在任何我们想要部署业务测试环境的系统上(包括本地机器),下载该镜像,并使用docker run命令生成容器,即可快速部署一套我们自己的测试环境(当然前提是部署的机器上需要安装docker)。

应用实践2:Docker在selenium自动化中的应用

  Selenium Grid主要用于分布式自动化测试,就是一套Selenium 代码可在不同的环境上运行。Grid使用了hub-node(Master Slave)的概念,在这个概念中,测试只在一个机器上运行(hub),但是执行会在不同的机器(nodes)并行执行。刚好,Docker可快速的创建各种环境,从而使得selenium分布化测试变得更为快捷可靠。

那么,一套脚本如何同时跑多个浏览器,做兼容测试?

2.1>先后下载hub及node镜像

docker pull selenium/hub

docker pull selenium/node-chrome

2.2>启动hub容器

docker run -d –p 32768:4444 --name selenium-hub selenium/hub

注:Selenium/hub 容器的端口号为4444,对centos映射的端口为32768

2.3>启动分支node chrome 容器

docker run -d --link selenium-hub:hub selenium/node-chrome

注:–link 通过 link 关联 selenium-hub 容器,并为其设置了别名hub

2.4>可以在本地机器上执行脚本

应用实践3:Docker与CI/CD

   Docker可以让你非常容易和方便地以“容器化”的方式去部署应用,它就像集装箱一样,打包了所有依赖,再在其他服务器上部署很容易,不至于换服务器后发现各种配置文件散落一地,这样就解决了编译时依赖和运行时依赖的问题。Docker在CI/CD上的应用使得整个过程更进一步自动化,也使整个过程镜像化,达成一次构建,多次部署的愿景。

CI流程:1.开发者向gitlab上提交代码 2.gitlab通过webhook通知jenkins有更新 3.jenkins从gitlab上下拉最新代码 4.jenkins对代码进行编译、构建新的集成镜像、最后将镜像推送到docker镜像仓库上。

CD流程:1.在镜像仓库上拉取最新集成镜像 2.然后启动容器。

   最后总结一下,Docker不仅解决了测试中环境治理的问题,也能够利用社区强大的镜像资源快速搭建我们想要的环境,非常省时省力。当然,docker让整个测试和开发流程更加自动化,更有效率。

Q