docker+robot framework+selenium并

作者: Ivanlfli | 来源:发表于2017-09-03 23:35 被阅读2633次

            自己在日常测试中,会搭建UI自动化测试框架来进行web应用的回归测试,在这过程中遇到了许多问题,如测试脚本和执行机不分离,串行测试效率低下,环境搭建麻烦等问题。在这个过程中,自己也在网上看一些前辈的搭建教程,学习他们的经验,一点点清晰了一个较为完善的UI自动化测试框架的搭建,尤其是最近学习了利用docker来搭建UI自动化测试环境,简直为自己打开了新世界的大门,所以也在这里分享下,供刚踏入测试行业的童鞋们借鉴。

    需求背景

           日常测试中会遇到对web应用进行UI自动化的测试场景,一般常用的工具是使用Selenium,一套简单的UI自动化架构如下:

    简单的UI自动化架构

           上图即为简单搭建的一套UI自动化测试架构,但存在如下缺点:

           (1)串行执行测试用例:即同一时刻只启动一个进程去启动一个浏览器进行测试,有时工作中需要进行浏览器的兼容性测试,这样的话只能等一个进程结束后,再开启另一个进程开始另一个浏览器的测试,效率很低。

           (2) 一台机器只能安装一个版本的浏览器:有时兼容性测试不仅要测试不同浏览器的情况,还要测试同一浏览器不同版本的情况,通常一台机器只能安装1个版本的chrome或firefox,这样就没办法测试不同版本的兼容性情况了。

           (3)测试脚本与浏览器部署在同一台机器,试想,一台机器既跑测试脚本,又开启进程启动浏览器进行测试,严重消耗机器硬件资源。

           为了解决(1)的问题,可以考虑用多线程并发的方式执行测试用例,如下图

    并发测试框架

            为了解决(2)和(3)的问题,可以在并发框架的基础上,采用SeleniumGrid这一分布式测试工具,实现测试脚本和测试执行节点的分离,即用远程机作为SeleniumNode,在其上安装不同版本的不同浏览器,这样在本机运行测试脚本后,测试脚本会向SeleniumGrid发起测试请求,SeleniumGrid会寻找当前处于空闲状态的节点,并在其上执行测试。整体架构如下:

    并发分布式测试框架

           至此,这种并发分布式测试框架基本上就可以满足我们的日常测试需求了,但仍然存在缺点:

          (1) 执行节点机配置麻烦:通常常用的方式就是为每个执行节点配一台虚拟机,然后在每台执行节点机上都要重新配置一遍测试环境,比如要安装浏览器、selenium驱动浏览器的驱动文件,selenium-server jar包。最重要的一点是,测试资源很紧张,没有那么多虚拟机供我们使用。

           为了解决(1)的问题,网上有前辈们提出了用docker容器来制作执行节点,有关docker的具体作用,大家可以自己去搜,简单来说就是以前我们需要一台测试执行节点,需要搭建一台虚拟机,然后在其上进行环境配置,如果再需要一台测试执行节点,又要重复上述的过程。一是搭建一台虚拟机周期较长,虚拟机启动时间较长,且虚拟机资源依赖于硬件配置,二是每台虚拟机都要重新配置。而利用docker可以解决上述问题,其具有以下优点:

          (1)docker镜像不并包含linux内核,多个docker镜像共用宿主机的linux内核,即相当于我们只要有一个linux内核虚拟机就可以了,可以减少对硬件资源的依赖。

          (2)一个docker镜像可以运行很多docker容器,每个docker容器之间都是物理隔离的。通俗易懂的说,我们配置好了一套虚拟机环境,称之为容器,然后就可以用这个容器““复制”出N个相同的环境出来,不需要你再重新配置了,很方便。

            具体来说,以前我们需要10个chrome浏览器同时进行web测试,按照以前的方法,我们会搭建10台虚拟机,然后分别在每台虚拟机上安装chrome浏览器,再进行selenium的相关配置。但现在利用docker,我们可以制作一个镜像,这个镜像里运行linux环境,安装有chrome浏览器和selenium的相关配置,然后我们利用这个镜像“复制”出10个容器就可以了,这10个容器就是以前的10台虚拟机,并不需要你再重复安装重复配置了,很节省人力和时间。

           (3)docker镜像仓库里会有其他人已经制作好的相关镜像,不需要我们自己制作,或者我们把其他人的镜像拿来,改下某些配置变为我们自己想要的镜像就ok了,像selniumhub,和已经安装好chrome或者firefox的selenium-node的镜像,都已经有人制作好了,我们只需要拿来用,或者稍微改下参数就可以了。

            至此,我们可以利用docker的容器来作为UI自动化测试的执行节点,取代之前的虚拟机。

    框架搭建

            基于以上介绍,整体的测试框架如下:

    基于docker的多线程并发UI自动化测试框架

           框架分为3个部分,多线程并发测试框架采用Python编写,调用robot framework执行测试用例,并将测试请求发送给docker容器中运行的SeleniumHub,SeleniumHub寻找处于空闲状态的SeleniumNode执行节点进行web测试,测试结束后,在部署测试脚本的主机上生成各线程运行后的测试报告,再调用robot framework的rebot命令合并测试报告,生成最后的汇总测试报告发布。

          本人在自己的工作电脑(win7 64bit)上搭建了上述框架,下面详细介绍搭建步骤。

    测试环境搭建

          1、安装docker

           (1) win7用户,进入Docker Toolbox的下载网页,选择windows版本下载。win10用户进入docker官网下载Docker For Windows安装。 

            整个安装过程非常简单,安装完成后,可以在桌面得到如下的三个图标:

    win7安装docker toolbox

          (2) 设置环境变量

            安装完成后,建议先配置一个环境变量MACHINE_STORAGE_PATH,来自定义虚拟机保存的位置,因为之后下载的镜像越来越多,都是放在虚拟机的虚拟磁盘文件中,虚拟磁盘文件会越来越大,放在默认的C盘用户目录下可能会在以后造成一些麻烦,参考下图:

    设置环境变量

           (3) 开始使用

            点击Docker Quickstart Terminal图标,从而打开一个Docker Toolbox terminal,若报如下图信息,则去https://github.com/boot2docker/boot2docker/releases下载对应版本的boot2docker.iso放到MACHINE_STORAGE_PATH/cache下,再重新打开Docker Quickstart Terminal。

    下载相应的boot2docker.iso到MACHINE_STORAGE_PATH/cache下

            再次打开terminal后,terminal会自动进行一些设置,需要点时间,全部完成后,出现如下结果表示docker安装ok了:

    docker启动ok

           另外,我们可以记下docker宿主机的IP 192.168.99.100,可以用xshell来ssh登录docker宿主机方便操作,账号和密码是docker/tcuser:

    xshell连接docker宿主机

    2、下载或制作相关镜像

            docker pull selenium/hub,它会自动从镜像源中下载别人制作好的最新的selenium/hub镜像,可以通过docker images看到下载好的selenium/hub镜像

    selenium/hub镜像

            对于seleniumnode镜像,兼容性测试时,需要我们覆盖更多版本的浏览器,所以,可以选择自己制作Dockerfile来生成自己想要的浏览器版本的镜像。在当前目录下新建Dockerfile文件,输入以下内容:

    #一般建议直接用debug版,以firefox为例

    FROM selenium/node-firefox-debug

    #指定新构建firefox版本

    ARG FIREFOX_VERSION=54.0.1

    #删除已存在firefox浏览器

    RUN a=$(find /opt/  -name"firefox"|cut -d/ -f 3)&&sudo rm -rf /opt/$a&&sudo rm -rf /usr/bin/firefox

    #下载指定版本的浏览器

    RUN sudo apt-get update -qqy \

    && sudo rm -rf /var/lib/apt/lists/* /var/cache/apt/* \

    && sudo wget --no-verbose -O /tmp/firefox.tar.bz2 http://ftp.mozilla.org/pub/firefox/releases/$FIREFOX_VERSION/linux-x86_64/en-US/firefox-$FIREFOX_VERSION.tar.bz2 \

    && sudo tar -C /opt -xjf /tmp/firefox.tar.bz2 \

    && sudo rm /tmp/firefox.tar.bz2 \

    && sudo mv /opt/firefox /opt/firefox-$FIREFOX_VERSION \

    && sudo ln -fs /opt/firefox-$FIREFOX_VERSION/firefox /usr/bin/firefox

    # 改变node的启动参数

    ENV NODE_MAX_INSTANCES 10

    ENV NODE_MAX_SESSION 10

    # 配置中文

    RUN sudo locale-gen zh_CN.UTF-8 &&\

    sudo DEBIAN_FRONTEND=noninteractive dpkg-reconfigure locales

    RUN sudo locale-gen zh_CN.UTF-8

    ENV LANG zh_CN.UTF-8

    ENV LANGUAGE zh_CN:zh

    ENV LC_ALL zh_CN.UTF-8

    #更新软件包索引

    RUN sudo apt-get update -qqy

    #安装基本字体

    RUN sudo apt-get -qqy --no-install-recommends install \

    fonts-ipafont-gothic \

    xfonts-100dpi \

    xfonts-75dpi \

    xfonts-cyrillic \

    xfonts-scalable

    #安装文泉驿微米黑字体

    RUN sudo apt-get -qqy install ttf-wqy-microhei \

    && sudo ln /etc/fonts/conf.d/65-wqy-microhei.conf /etc/fonts/conf.d/69-language-selector-zh-cn.conf

          然后通过如下命令来构建镜像,其中selenium/vnc-node-firefox-debug是自己起的镜像名,后面的.表示Dockerfile所在的目录为当前目录:

            docker build -t selenium/vnc-node-firefox-debug .

          用同样的方法可以生成chrome浏览器的镜像,生成后的镜像如下图:

    selenium-node-chrome/firefox镜像

    3、启动容器

            (1)启动selenium/hub容器

            docker run -p 5555:4444 -d --name 'selenium_hub'  selenium/hub

            run:通过镜像启动一个容器

            -p:端口映射,5555是容器宿主机(运行docker的主机)的端口,4444是我们容器(运行selenium_hub虚拟机)的端口。我们把容器的4444端口映射给docker主机的5555端口,就可以通过docker主机的5555端口来访问selenium_hub容器了。

            (2)启动selenium/node容器

            docker run -P -d --link selenium_hub:hub  selenium/vnc-node-firefox-debug

            docker run -P -d --link selenium_hub:hub  selenium/vnc-node-chrome-debug

            -P:随机生成映射端口号,上文中的-p是指定特定的端口号,这里node并不需要知道容器内部的端口号,所以随机映射即可。

            --link:指定selenium-node容器依赖容器selenium_hub。

            容器启动完后,可通过docker ps查看启动的容器:

    启动的容器

            在浏览器中查看selenium容器是否正常启动,http://192.168.99.100:5555/grid/console

    selenium容器启动成功

    多线程并发测试框架搭建

            采用Python编写多线程并发程序,robot framework执行测试用例。

          (1)测试用例

            在robot framework中,将测试用例打上标签tag,来区分要测试的不同版本的不同浏览器,remote_url为selenium_hub容器的地址,已将该容器的4444端口映射到docker宿主机的5555端口,所以这里直接通过宿主机的5555端口访问hub容器。

    测试用例

           (2)多线程并发框架

             多线程并发框架采用Python编写,程序目录如下:

            各文件代码如下:

            utils.py:

    utils.py utils.py

    multiThreadings.py

    multiThreadings.py

    callRobot.py

    callRobot.py callRobot.py

    run.py

    run.py

            脚本run.py接收两个参数,第1个参数为要执行的robot测试套件,第2个参数为要执行的robot用例的标签,各标签之间以逗号分隔,有多少个标签,就启动多少个线程来调用robot的pybot命令执行打上相应标签的测试用例。

    运行

          这里开启2个node节点,一个chrome,一个firefox。cmd下执行脚本,robot测试套件名为TestSuite.txt,执行标签为chromeNode1,firefoxNode1的测试用例:

           python run.py TestSuite.txt selenium_node=chromeNode1,firefoxNode1

           docker宿主机下,执行docker logs -f selenium_hub,可以查看hub容器的执行日志:

    selenium_hub容器日志

           通过vnc viwer可视化查看node容器内浏览器的运行情况:

    node容器内浏览器运行情况

          最终用rebot命令合并各线程生成的测试报告,合并后的报告如下:

    合并报告

          至此,基于docker的selenium并发web应用UI自动化测试框架搭建完成。之后,自己会再探究将docker容器的创建,启动和停止自动化,实现测试环境的自动化搭建。

    相关文章

      网友评论

      • 撒贝龙:大牛你好, 目前在使用docker Chrome容器遇到【[ WARN ] Keyword 'Capture Page Screenshot】问题,更换了driver版本对应正确的Chrome版本还是不行,用的镜像是【wywincl/node-chrome-debug-zh】,想请教下大牛的 Chrome镜像Dockerfile如何构建的?Firefox在文中有展示,Chrome有什么特殊要注意的地方吗?
        撒贝龙:@Ivanli1990 :+1: 谢谢啊
        Ivanlfli:@撒贝龙 看官方镜像的github,上面有chrome是咋做的,跟firefox是一样的,只不过装的是chrome和chrome的driver而已
      • devinj:你好楼主,请教一下vnc viewer可视化查看容器的具体步骤,需要在容器里安装 vnc server嘛,主机上需要安装vnc viewer for windows还是 vnc viewer for chrome
        Ivanlfli:@devinj 官方仓库里的debug版的镜像里已经装vnc了,直接就可以用。主机的话,看你是什么操作系统,安装响应系统的vnv viewer
      • VB过得VB:楼主你好,这是是在一台机器上面跑的吧?如何后面想做成分布式,可行吗,有没有什么实现思路?
        Ivanlfli:@大叔你好嫩 分布式就是多台机器上跑docker容器,与一台机器上的hub容器通信就可以了
      • VB过得VB:公司的项目全是ie浏览器上跑的,这套方案可以嘛?
        Ivanlfli:@大叔你好嫩 ie的没试过,因为docker是基于linux的,所以win的镜像制作,需要调研下
      • dancingking:说实话,这样测兼容实际收益大吗?
        Ivanlfli:@dancingking 看测试痛点了,如果兼容性测试回归量大,测试环境构造麻烦,这种方案可以提供一个解决思路
      • 337bd1650409:楼主我想请教一个问题,docker它实际上是只能模拟Linux环境?不能模拟windows环境的浏览器,但是用户环境的话,绝大多数都是在windows环境,如果要测试浏览器兼容性的话,应该是要模拟windows环境不同版本的各种浏览器。我看你测试的实际上也是模拟的Linux环境,如果不能模拟在Windows下环境,恐怕浏览器兼容性测试意义不大。有没有办法能模拟windows环境?
        Ivanlfli:@暗夜杀手_ef7f 我在网上搜了下,好像没有搜到操作系统不同导致同一版本的同类浏览器出现页面渲染不同的问题。你发的文章链接我也看了,他里面也没有给出同一版本同一种浏览器在各操作系统下出现异常。只是给出了各操作系统下浏览器渲染异常的比例,并没有同一性比较。欢迎继续深入挖掘,我也会继续搜下相关问题。
        337bd1650409:@Ivanli1990 楼主我在网上找到这个 https://www.xzbu.com/8/view-3995265.htm,我在群里问,也不是很确定。我觉得应该就如这篇文章所说的,遵循通用的标准的话,应该是不会出现,否则的话就会出现跟操作系统相关。
        Ivanlfli:@暗夜杀手_ef7f 浏览器在win和linux下是一样的,页面渲染只跟浏览器有关系,跟系统没关系
      • 王小二u:hi lvanli
        有几个问题请教下
        1、 robot framework是用来执行测试用例 即本文中的 testsuit.txt的产生 是在RF编写好之后,再移到resultDir目录下吗 这样就感觉很不自动化呀 能否把RF移到docker来
        2、从这个getParaFromJenkins函数中,看出作者又结合jenkins,可否分享下Jenkins的配置
        Ivanlfli:@王小二u
        第1个问题:我好想明白你为什么会糊涂了。rf是安装在脚本执行机服务器上的。感觉你把rf和selenium搞混了。rf只是一个测试框架用来管理和调度用例,跟selenium没有任何关系。真正执行ui测试的是selenium。所以,suite和case当然是用rf编写完后,跟rf一起放在脚本执行机上。至于ui测试操作,是rf下的测试脚本,将自己的测试数据发送请求给selenium hub,hub再把测试数据转发给selenium node去执行,即真正的ui测试执行是在selenium node所在的服务上进行的,跟rf所在的服务器是没有关系的。不知我讲明白了没有,你可以再看下文中的《并发分布式测试框架》那张图,那张图就画明了rf所在服务器和selenium所在服务器的关系。
        第2个问题:传入这2个参数是我自己自定义的,这个看个人。接收参数的问题是这样的:run.py中有调用execRobot类下的execPybot方法,该方法内去调Common.getTags,它的参数是Common.getParaFromJenkins,这个方法里有调用sys.argv来获取命令行传入的参数。所以参数是这么传进来的。
        王小二u:@Ivanli1990 谢谢解答的这么详细
        可能第一个问题我表述的不清楚,其实我是想问RF工具安装在哪个服务器上(脚本执行机?),还有testsuite.txt的编写是在RF工具编写完了之后,再移到脚本执行上最后使用Jenkins job构建运行run.py吗
        那测试case,suite是怎么管理的呢

        第二个问题明白了
        再请问下 在run.py代码中没看到有定义接收两个参数,没搞清楚问什么运行run.py时传入两个参数
        Ivanlfli:hi,谈不上请教。
        第1个问题:不知你理解的不自动化是什么意思。rf的code是可以放到docker镜像中的。本文中的rf code没有放到docker中,而是放在脚本执行机上,脚本执行机发请求给hub容器,所以我理解放与不放是没有区别的。另,resultDir目录是用来存放测试报告的。
        第2个问题:看代码python run.py TestSuite.txt selenium_node=chromeNode1,firefoxNode1就知道jenkins配置很简单了。配置一个string的参数,参数名为selenium_node,job中调run.py脚本。run.py脚本有2个参数,一个是TestSuite.txt,另一个是selenium_node=$selenium_node,$selenium_node的值为各tag以“,”分隔的字符串。
      • sunshine打老虎:# 因为要通过vnc viewer看容器,但是容器的vnc密码不知道,这里改vnc密码为8个8
        RUN x11vnc -storepasswd 88888888 /home/seluser/.vnc/passwd
        到这一步 我的出现以下错误
        storepasswd: No such file or directory
        -storepasswd failed for file: /home/seluser/.vnc/passwd
        还有就是如何通过vnc连接Firefox-node和Chrome-node,这两个浏览器所在容器的IP怎么看
        Ivanlfli:@sunshine打老虎 多线程,线程里的selenium指定浏览器版本
        sunshine打老虎:@Ivanli1990 解决了 非常感谢:+1:
        还有个问题 就是如何并发执行多个不同版本的chrome
        Ivanlfli:你是下载的debug版镜像吗?debug版中都是有vnc的。或者你不改密码,默认密码是secret。
        查看节点ip有2种方法,一种是打开seleniumGrid的html网页:http://宿主机ip:seleniumGrid映射到宿主机的端口/grid/console,里面会列出node的内容,包括ip,我的文章里也有截图,你可以看到。
        还有一种方法就是docker ps,可以直接看到节点映射到宿主机上的port,然后在vnc中填入宿主机的ip和映射到宿主机的port,就ok了。
      • heliping_peter:楼主求交往。
      • along_1736:6666666, 先照着实践下

      本文标题:docker+robot framework+selenium并

      本文链接:https://www.haomeiwen.com/subject/qctrjxtx.html