自己在日常测试中,会搭建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 -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+robot framework+selenium并发web应用UI自动化测试实践相关推荐

  1. pythonwebui自动化_python+selenium实现web端UI自动化测试

    代码示例:css #!/usr/bin/python # -*- coding: UTF-8 -*- # coding:utf8 import sys import os from selenium ...

  2. Robot Framework Selenium UI自动化测试 --- 进阶篇

    回顾:          如果您对Robot Framework Selenium(以下简称RFS)没有基础概念和使用经验,请先阅读入门篇,入门篇对RFS有基础的介绍和使用教程. 展望:       ...

  3. Python+Selenium.webdriver实现WEB端UI自动化测试(实例脚本)

    本篇记录基于Python+Selenium.webdriver实现WEB端UI自动化测试,其中测试用例使用excel维护.为了在实际项目种的扩展应用,建议学习webdriver的元素定位方法,欢迎在评 ...

  4. Robot Framework + Selenium 框架,关键字封装,知识点记录

    目录 框架概述: 通用关键字: 等待类关键字: 通用组件 等待 元素: 通用组件 获取 元素居中滚动像素: 通用组件 页面滚动 : 通用组件 等待包含文字: 通用组件 自动切换frame : 通用组件 ...

  5. Robot Framework + Selenium library + IEDriver环境搭建

    转载:https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录: 1 安装文件准备 2 Robot框架结构 3 环境搭建   3.1 安装Pytho ...

  6. 关于Web端-UI自动化测试

    在手工测试阶段,针对项目输出了测试用例,如果这些测试用例需要在版本迭代的过程中,需要进行回归测试,通过手工重复地执行测试用例,将会耗费大量的人力. 为此应运而生就有了自动化测试,通过使用自动化工具,将 ...

  7. html5做ui自动化,案例赏析:某WEB系统UI自动化测试方案

    测试范围的确定原则: 1.稳定的需求点.变动较少的页面 2.比较频繁的回归测试 3.需要在多平台上运行的相同测试案例.组合遍历型的测试.大量的重复任务 1.主要功能模块及页面加载 2.页面中图表.数据 ...

  8. 微信小程序python自动化测试_微信小程序UI自动化测试实践:Minium+PageObject

    小程序架构上分为渲染层和逻辑层,尽管各平台的运行环境十分相似,但是还是有些许的区别(如下图),比如说JavaScript 语法和 API 支持不一致,WXSS 渲染表现也有不同,所以不论是手工测试,还 ...

  9. 微信小程序UI自动化测试实践:Minium+PageObject

    小程序架构上分为渲染层和逻辑层,尽管各平台的运行环境十分相似,但是还是有些许的区别(如下图),比如说JavaScript 语法和 API 支持不一致,WXSS 渲染表现也有不同,所以不论是手工测试,还 ...

最新文章

  1. python gui漂亮_python 漂亮的gui
  2. python 中的 and / or
  3. cka教程_2020年11月新版CKA考试心得
  4. JAVA代码实现按列表中元素的时间字段排序
  5. android是java_为什么大家都用JAVA写android程序
  6. c++查询当前文件夹下文件数目_python3自动化小工具--删除某个文件夹xx后缀文件...
  7. 复习--linux目录及文件操作
  8. 如何安装mysql5.7.25_Centos7 yum安装MySQL5.7.25
  9. 百度app不支持popstate_这一次谷歌很强硬,从现在起你的 App 再不支持,将拒绝上架!...
  10. power bi 雷达图_【深度解析】基于激光雷达技术的车型识别方法及系统实现
  11. 通过S2B2C供应链电商平台网站解决方案,实现大宗商品万亿产业数字化转型
  12. 粘性布局 以及粘性布局失效问题
  13. Oracle 大数据量查询优化
  14. 豆瓣高分JAVA书籍,值得收藏
  15. 扒一扒苹果的那些事儿—春节见闻随想
  16. Spring的init-method和destory-method
  17. umijs配置eslint,prettier,stylelint,commitlint
  18. 43.10. Google Authenticator - Android Apps on Google Play
  19. 04特性源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)
  20. 获取一个对象或数组的所有属性及值

热门文章

  1. html5批量修改本地文件名,文件名批量更名技巧;将文件夹名添加到文件名上-批量修改文件名...
  2. 简单典型二阶系统_MIT—微分方程与线性代数笔记2.1 二阶常微分方程
  3. git操作后的各种后悔情况解决
  4. c++内存管理:new与delete,深拷贝与浅拷贝
  5. java一系列图片加载_RxJava系列文章(一) - 网络图片加载水印一般写法
  6. Vue通过render渲染$Notice
  7. 字符串首尾空格去除问题
  8. 2022-2028年全球与中国插座行业市场深度调研及投资预测分析
  9. android9 apk自动安装功能,如何在Android7.0、8.0、9.0系统下通过Intent安装apk
  10. 怎样架设游戏服务器 怎样搭建一个属于自己的游戏服 5分钟学会游戏架设 3D手游搭建视频教程 自己做游戏GM