Docker + selenium + jenkins 并行跑自动化测试

Stella981
• 阅读 721

背景

目标:使用docker做UI自动化测试并在Jenkins运行

调试环境:MocOS

运行环境:Linux ubuntu + docker

涉及工具:docker,selenium,unittest, jenkins

基本思路

找一个适合做自动化的docker镜像,使用selenium-grid 远程执行selenium。镜像采用 elgalu/selenium,已经集成了UI,chrome/firefox 等浏览器,包括webdriver驱动,十分方便。

镜像仓库地址:

https://github.com/elgalu/docker-selenium

接下来开工:

1. 在elgalu/selenium基础上简单编译

为了方便,脚本代码运行也设置在镜像里面。因此定制了我们自己的镜像文件:

FROM elgalu/selenium
RUN sudo apt-get update -y \
&& sudo pip install selenium \
&& mkdir /home/seluser/automation/myScript
ADD . /home/seluser/automation/myScript 
WORKDIR /home/seluser/automation/myScript  #定义工作目录

2. 用Python+selenium编写测试用例

if REMOTE:  # 定义一个开关变量方便本地和远程调试切换
    selenium_grid_url = "http://guest.docker:24444/wd/hub"
    capabilities = webdriver.DesiredCapabilities.CHROME.copy()
    d = webdriver.Remote(command_executor=selenium_grid_url, desired_capabilities=capabilities) #通过selenium启动docker里面chrome 
else:
    d = webdriver.Chrome()  #通过selenium启动本地chrome
    ##具体的UI测试代码

此处是启动selenium或者或者selenium -grid 部分主要代码,不能直接运行。如果需要调用远程的selenium_grid需要URL加端口号的形势http://guest.docker:24444/wd/hub,guest.docker是docker内网分配的IP,因为在docker里面的host文件没有发现容器名和IP的映射,因此从docker里面hosts文件选用guest.docker这个名字,等发现更好解决方案后再更新。

3. 执行和调试

本地调试不再多说,主要说一下怎么在docker调试和运行。先启动容器:

Docker + selenium + jenkins 并行跑自动化测试

执行命令 :

docker* run --rm -p 5904:25900 -p 4444:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container automation-test:latest

启动成功之后可以通过vnc工具查看容器的UI界面

Docker + selenium + jenkins 并行跑自动化测试

简单说明一下参数,5904是VNC需要用到的端口,可以通过本地VNC(127.0.0.1:5904)工具查看case运行效果。4444是selenium grid的映射端口。-v是把本地磁盘挂载到容器,方便代码调试, 因为采用$(pwd),表示当前路径,所以执行docker启动命令时候应该在自动化脚本所在位置。

现在本地调试case,注意这个时候selenium_grid_url值应该是**http://localhost:4444/wd/hub**

最后在容器里面执行case,可以通过docker exec名执行, 比如_docker_ exec -it container_name python /home/seluser/automation/myScript/example.py 确认没有没有问题后可以上Jenkins测试

需要注意的是如果case运行失败selenium grid是不会自动退出的,此处借助Python unit test的teardown方法结束selenium进程,比如:

def tearDown(self):
       print("start to teardown")
       time.sleep(10)
       self.d.close()
       self.d.quit()

运行脚本,可以再VNC看到运行效果:

Docker + selenium + jenkins 并行跑自动化测试

4. 在Jenkins 运行

跟本地容器执行步骤一直,同样的可以通过VNC监测执行过程。此处启动容器和关闭容器单独做成了两个job,方便处理环境问题。

Jenkins上面执行docker exec -it时候碰到一个"_The input device is not a TTY"_错误。减少一个T参数可以解决。

jenkins 并行运行多个容器

因为我们是通过容器化的方式启动的UI测试环境,同一个宿主机是可以启动多个容器的。假设我们的UI测试用例比较多的时候,我们可以同时运行多个容器来减少UI case的运行时间,配置方式比jenkins的分布式运行又更方便,怎么实现呢?启动多个容器我们只需要改变容器名字和映射的端口号即可,比如把前面启动容器命令简单更新一下

docker run --rm -p 5906:25900 -p 4466:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container-robot -d automation-test-robot

此处我们只更新了端口(5906,4466)和容器名字,就能启动多个UI环境并行运行case,是不是很爽哦?

执行完之后需要强制关闭容器,防止异常退出情况。启动容器和关闭容器单独做成了两个job,方便处理环境问题。

Docker + selenium + jenkins 并行跑自动化测试

到此处基本大功告成。

结语

 最后跟大家推荐一个测试学习群:747981058,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!

人生是一个逆水行舟的过程,不进则退,咱们一起加油吧!

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这