APP下载

软件自动化测试环境搭建中的Docker应用

2017-03-21胡湘菲

计算机时代 2017年3期
关键词:自动化测试虚拟机

胡湘菲

摘 要: 依托于计算机学科的巨大发展,软件自动化测试技术也有了长足进步。目前分布式软件自动化测试环境相对脆弱,维护较难。文章在对Selenium-Grid部署测试环境的传统方式进行分析的基础上,对比了Docker容器和虚拟机的优缺点,最后选择开源引擎Docker与Selenium-Grid结合,研究并实现对软件自动化测试环境的优化。实践证明,新的部署方式极大地提高了环境的稳定性,简化了配置的难度。

關键词: 自动化测试; Selenium-Grid; Docker; 虚拟机

中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2017)03-26-04

Abstract: Relying on the great development of computer science, software automation testing technology has made great progress. At present, the distributed software automatic test environment is relatively weak and hard to maintain. Based on the analysis of the traditional way to deploy test environment with Selenium-Grid, this paper indicates the differences between Docker container and the virtual machine. The optimization of software automatic test environment is studied and realized by using the combination of Docker and Selenium-Grid. Practice has proved that the new deployment greatly improves the stability of the test environment and simplifies the configuration.

Key words: automatic test; Selenium-Grid; Docker; virtual machine

0 引言

很多企业认识到了软件自动化测试的重要性,并将其纳入日常生产。自动化测试可以提高测试覆盖率,让测试人员免于重复劳动而有更多的时间投入到新迭代中。软件自动化测试在运行时,都需要分配真实的机器资源,并且配备相应环境。这些测试环境配置不易,伸缩机器节点效率不高。本文根据docker快速轻量构建环境的优点结合selenium grid,探讨一种更高效地搭建测试环境的方法。

1 Selenium Grid

1.1 Selenium Grid简介

Selenium Grid[1]支持在不同的物理机,不同的浏览器上同时运行测试。也就是说,Selenium Grid支持在分布式软件自动化测试环境中运行测试。

Selenium Grid对系统和浏览器的兼容性如下:

1.2 使用selenium grid的场景

⑴ 团队需要尽快得到测试结果。可将测试用例分发到多个机器上同时执行,参与执行的机器越多,团队得到测试结果的时间越短。

多浏览器类型、多浏览器版本验证。可在一台机器上运行单一浏览器,也可在一台机器上运行多个浏览器实例,以减少测试验证时间,尽快得到测试结果。

最小化维护grid的时间。你可以自定义“钩子”来控制软件自动化测试环境的部署。

1.3 selenium grid的启动与实现

selenium hub提供一个类似于服务器的节点,可以启动在linux机器或者windows机器上。所有测试机都需要注册到hub上。selenium grid作为一个子节点,hub负责将它们分发到正确的节点上。启动selenium grid很简单,首先将selenium提供的jar包下载到服务器。

⑴ 启动selenium hub

java -jar selenium-server-standalone-3.0.0.jar -hub

默认情况下,hub会以端口4444启动。如需更改默认端口,可在运行命令时添加port参数。通过http://localhost:4444/grid/console可以查看节点运行的状态。

⑵ 启动selenium grid

java -jar selenium-server-standalone-3.0.0.jar -role

node -hub http://localhost:4444/grid/register

如果没有提供role选项,并且不是hub节点,则默认端口是5555。

windows下注册ie、chrome、Firefox三种浏览器的方式如下。

① ie的注册方式:

java -jar selenium-server-standalone-3.0.0.jar

Dwebdriver.ie.driver="C:/ IEDriverServer.exe" -role

webdriver -hub http://localhost:4444/grid/register -port

6666 -browser browserName="internet explorer"

② chrome的注册方式:

java -jar selenium-server-standalone-3.0.0.jar

Dwebdriver.chrome.driver=" C:/ chromedriver.exe" -role

webdriver -hub http://localhost:4444/grid/register -port 7777 -browser browserName=chrome

③ firefox的注冊方式:

java -jar selenium-server-standalone-3.0.0.jar

Dwebdriver.chrome.bin="C:/Program Files (x86)/

Mozilla Firefox/firefox.exe" -role webdriver -hub

http://localhost:4444/grid/register -port 8888 -browser

browserName=firefox

ie和chrome自身无法启动,需要单独下载驱动才能运行。Selenium最早是为firefox做的,并有在firefox上录制的插件Selenium IDE,不需要单独的驱动。

2 Docker

2.1 Docker概述

2013年在Pycon,Solomon Hykes公布了docker初始版本之后,docker的发展异常迅猛,整个社区生态相当繁荣。Docker[2]是一个可以把开发的应用程序自动地部署到容器的开源引擎。参考docker官方宣称的“BUILD, SHIP, RUN”,它借鉴了标准集装箱的概念,软件即“货物”。它不关心容器里到底塞了什么,所有容器都是依照相同的方式装载,它也不关心“货物”将运到哪里,用户可以在任何地方部署。这就为我们搭建自动化测试环境提供了很大的便利。

Docker对虚拟化、云计算甚至软件开发过程都有革命性影响。Docker并不是lxc的替代品。它带来内核特性的基础之外,还提供了多种更强大的功能[3]。

跨机器的便携式部署 Docker定义了一种格式,用于将应用程序及其所有依赖关系捆绑到单个对象中,该对象可以传输到任何启用docker的机器,并在那里执行,并保证暴露给应用程序的执行环境相同。Docker定义了这些机器的特定设置的抽象,使得完全相同的docker容器可以在许多不同的机器上以不同的配置运行。运维人员能够直接部署封装的软件镜像来进行测试和发布,大大节省了运维人员搭建环境,排查环境问题的时间。

持续版本控制 Docker拥有类似git的功能,可用于跟踪容器的连续版本,检查版本之间的差异,提交新版本,回滚等。历史记录可以回溯到上游开发者。出现问题可以快速回滚,docker镜像启动比虚拟机镜像要快速。

组件可复用 各个镜像可以通过不同的组合产生不同的镜像。例如,你准备好一个python的初始环境,可将其作为5个不同应用程序的基础。

高资源利用率 虚拟机是硬件层面的隔离,docker是与宿主机共享一个系统内核的,没有额外的系统开销。所以docker充分利用了系统资源,利用率要比虚拟机高很多。Docker还拥有一定的资源隔离与限制的能力,保证了各个应用之间不会相互影响。

多云平台支持 目前docker的云提供商有Amazon Web Services,Digital Ocean,Microsoft Azure,SoftLayer,Packet。代码提供商有GitHub,Bitbucket。使用docker,可以在多种云上部署,用户不会被单一云平台捆绑。未来也会有更多的云平台支持docker。

更好的移植性 就像JVM一样,一次构建,到处运行。docker可以在任意的服务器上运行,为持续集成提供高效可靠的运行环境。

简单轻量、易于理解 Docker原意为搬运集装箱的码头工人,标志就是驮着集装箱的鲸鱼。可以看出集装箱就是容器,开发者安装和部署docker就像装卸集装箱一样简单,可在短时间内快速入门。

共享 作为一款开源软件,docker继承了开源软件的理念。世界上所有用户都可以通过访问docker hub上传或下载到共享的镜像资源。目前官方托管的镜像从mysql,mongo,tomcat,nginx到redis等等应有尽有。国内比如阿里云也提供了来自云端的容器镜像服务,为开发者提供了便利。

当然,docker使用至今,也有一些问题。比如问题排查困难,docker作为较为底层的软件,出了问题之后,对使用软件的用户来说解决困难。安全性不足,容器确实会受到资源的隔离和控制。但其实还有一些内核资源未被隔离开,会产生安全上的漏洞。

2.2 docker与VM比较

Selenium官方宣称并发测试时可以使用VW或者单独的物理机来充当服务器。那我们来对比一下VM和docker。VM的虚拟化技术可以让一台物理服务器或者“主机”上运行多个操作系统和应用,简化IT架构,让服务器满负荷运行以提高服务器利用率,节约了物理成本。这种特性粗看和docker十分的相似。观察图1,与docker相比,VM在虚拟化技术之上还需要有一个操作系统才能运行应用。

⑴ VM模拟出了CPU、内存、IO设备等。Docker则不同,docker在docker引擎之上可以直接运行应用,省去了安装操作系统的步骤,更便捷更节约成本。但docker并不是虚拟机。虚拟机可以在底层模拟出各种硬件设备。Docker使用的是宿主机的内核,docker性能无限接近原生,那是因为docker用的就是系统本身的进程。

⑵ VM支持几乎所有操作系统,docker仅支持部分版本的系统。例如Windows要求64bit Windows 10 Pro build 10586以上版本,centOS版本要求是7.X。

⑶ 隔离性方面,VM有单独的操作系统、CPU等,隔离性较好。Docker通过namespace实现资源隔离,通过cgroups实现资源限制。但是它不能阻隔其他程序占用自己的资源。

⑷ 安全性方面,VM已有较为成熟的生态环境和安全解决方案。docker目前无法识别具体执行指令的用户,只要有一个用户持有执行docker的权限,那么该用户就可以对docker的容器进行所有的操作,不管该容器是否是由该用户创建。这会有误删的情况发生,存在一定的安全风险。

⑸ 启动耗时上,由于docker是直接使用宿主机的内核,通常只需要几毫秒就能启动应用。虚拟机的启动需要几秒,甚至好几分钟。

⑹ 运行性能同上,docker减少了额外的资源消耗。VM需要更多的系统开销。

⑺ 部署难度上,docker构建环境快速轻量,在部署运维上的优势有目共睹,VM比之不如。

⑻ 镜像大小上,VM安装操作系统,通常需要百兆至千兆,而docker只需要几兆。

⑼ 系统支持量上,VM单机部署几十个已经是极限,docker可以支持上千个。

3 软件自动化测试环境利用docker部署

配合自动化测试任务的展开,测试计划的执行需要选择测试环境并且注册节点。这些测试环境往往是手工配置的。如果使用docker就可以免去手工配置的过程,使用脚本自动拉取docker镜像,一键配置测试环境。2015年在selenium conf[4],Marek Jastrzebaki演示了利用docker构建selenium grid的例子。

4 软件自动化测试环境搭建中应用docker的分析与实现

如果用VM部署selenium grid测试环境,则需要安装操作系统,安装某个版本的浏览器和java环境等等。针对测试计划要求的操作系统版本和浏览器版本部署更多的VM上。这样很耗费成本,配置效率也不高。如果用docker部署环境就可以改善这些问题。首先开发人员进行统一的配置,确保各个环境部署镜像的一致性。其次可以将需要安装的组件打包成一个镜像,方便管理和维护。然后鏡像提交新版本或者回滚也在一处维护,出问题可以快速排查和重启。资源利用率会有很大提升。一个服务器上可以负荷更多的有效进程,而不用负荷额外的操作系统。以下是具体的安装过程。

Docker版本要求[5]MAC下需要在OS X El Capitan 10.11以上,windows下需要64bit W indows 10 Pro 10586以上,centOS需要在7以上。安装Docker Toolbox可以简化安装步骤。

⑴ 安装docker。

⑵ 安装docker compose。

⑶ 拉取selenium hub节点。

docker pull selenium/hub

⑷ 拉取chrome节点。

docker pull selenium/node-chrome

⑸ 拉取firefox节点。

docker pull selenium/node-firefox

⑹ 编写selenium启动脚本docker-compose.yml。包括启动hub,注册firefox节点和chrome节点的功能。测试用例可以调用已注册节点。

⑺ 启动脚本。

docker-compose up -d

⑻ 伸缩节点数量。

docker-compose scale chrome=5 firefox=5

⑼ 观察启动日志。

docker logs hub

⑽ 前台查看节点启动情况。

http://localhost:4444/grid/consol

5 结束语

软件自动化测试技术的发展得益于计算机科学的总体发展。本文引入开源引擎docker,介绍了一种软件自动化测试环境的部署优化。Docker提供了“一次构建,到处运行”的特性,极大地简化了selenium grid的部署,实践证明新的部署方式切实减少了服务器资源的消耗和配置服务的时间,值得在业界推广。

鉴于自动化测试较为脆弱的环境,后期可以对该环境增加功能,以提高系统的可度量性和自维护性。例如:监控环境功能,监视自动化测试环境部署的健康状况,测试人员可以随时查看环境是否启动成功,或者超时等。智能重启功能,对启动失败或者超时的环境,制定智能重启的策略,并提供手动重启的入口。

参考文献(References):

[1] Selenium-Grid[EB/OL].http://docs.seleniumhq.org/docs/07_selenium_grid.jsp,2017.

[2] JamesTurnbull,特恩布尔,李兆海等.第一本Docker书[M].人民邮电出版社,2015.

[3] 浙江大学SEL实验室.Docker容器与容器云[M]. 人民邮电出版社,2015.

[4] How do I build a better selenium grid with docker?[EB/OL].https://speakerdeck.com/marekj/seconf2015-docker-selenium,2015.

[5] Docker Documentation[EB/OL].https://docs.docker.com/,2017.

猜你喜欢

自动化测试虚拟机
Hadoop性能测试自动化研究
数据驱动和关键字驱动的研究与应用
浅谈空调控制器自动化测试
虚拟机技术在计算机组装课堂中的应用
基于多总线结构的电路板测试系统设计研究
虚拟机服务器在教学实践中的探索研究
浅谈计算机系统虚拟化网络设置方案
航空航天与国防电子新形势下自动化测试系统的应用
任务驱动教学法在《网络应用服务管理》教学中的应用
虚拟机局域网组建技术应用初探