基于Docker的UI自动化初探
本文来自网易云社区
前言
一直以来,项目迭代的时间都是比较紧张的,开发加班加点coding,测试加班加点提bug。都说“时间像海绵里的水,挤挤总会有的”(当然这里的“挤挤”就是加班喽,哈哈~) 然而,就算再怎么挤,一天就那么24个小时,除了睡觉吃饭,挤出来的时间完成平常的功能测试已经算不错了,很难抽出时间做一些兼容性测试之类的东东。但是,“混吃等死”显然不是我司员工的一派作风,解决问题才是缓解现状、拯救自我的最佳方式。然而,一提到兼容性,就不可避免地要考虑如何让自动化用例在不同的浏览器中同时跑起来的问题。考虑到docker环境隔离的特点,我决定先来尝试一下如何在Docker下进行web UI自动化~~~
Docker是什么?

Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。
Docker内部有三个主要的部件,即镜像、容器和仓库:
Docker镜像:用于创建Docker容器的只读模板,是一个独立的文件系统,包括运行容器所需要的数据,可以用来创建容器。
Docker容器:由Docker镜像创建的运行实例,容器中包含应用的代码和所需要的依赖文件,可以运行对应的应用。
Docker仓库:代码控制中的代码仓库,用来保存镜像。
容器是以镜像为模板创建的,以一个镜像为基础可以创建多个容器,容器之间相互隔离,可以同时运行同一个应用,互不影响。
Docker安装
以mac为例,安装docker-toolbox,访问链接https://www.docker.com/products/docker-toolbox,下载mac版本的安装包。下载完毕后, 按照指引点下一步就可以了,安装完成后,会生成三个图标

点第一个图标打开终端,第一次进入时,它会自动帮你创建一个docker machine,然后进入如下界面:

后面再打开终端时,就不会再自动创建machine了,直接进入上述页面。在这个页面可以通过命令进行各种docker相关的操作,比如创建镜像,创建容器,启动容器,停止容器,删除容器,删除镜像等等。可以通过docker --help来查看都有哪些命令。如果想要了解docker的某一个命令的使用方法,如运行容器,可以用docker run --help来查看了解,其他以此类推。这里列几个这次比较常用的命令:
创建镜像: docker build [OPTIONS] PATH | URL | -
查看镜像:docker images
删除镜像: docker rmi [OPTIONS] IMAGE [IMAGE...]
创建运行容器: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
查看所有容器:docker ps -a
停止容器:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
删除容器:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
创建镜像
1)Dockerfile
在创建镜像之前,不得不提一个叫Dockerfile的脚本,该脚本是一种被Docker程序解释的脚本,由一条条指令组成。Dockerfile用来创建一个自定义的镜像,包含用户指定的软件依赖等。Dockerfile示例如下:

其中,
FROM markadams/chromium-xvfb-py2表示以markadams/chromium-xvfb-py2为基础镜像,markadams/chromium-xvfb-py2集成了Chromium和Xvfb,可以满足在Docker容器中通过Selenium进行无界面的操作 。
RUN xxx表示运行一些Linux命令
ADD aaa bbb 表示将aaa目录下的内容拷贝到容器中的bbb目录下
2)requirements.txt
从Dockerfile中可以看到有一个叫requirements.txt的文件,这个文件是用来记录所有依赖包及其精确的版本号的,以便应用能正常部署运行。该文件可以通过“
pip freeze >requirements.txt"命令进行生成,然后通过"
pip install -r requirements.txt
"安装这些依赖包。生成的文件内容大体如下:

但是生成的这些依赖,通常情况下,有很多用不到,创建镜像的时候,又要耗时下载。为了减少创建镜像时间,可以在 requirements.txt中只包含需要的依赖即可,可以通过命令"pip install pipreqs" "
pipreqs 项目路径/项目",该命令只会包含项目imports的包,而不是所有包,这样就减少了不必要包的安装。
Dockerfile中还有一个叫input.sh的脚本文件,后面会说明其作用。
3)创建自己的镜像
介绍了Dockerfile之后,接下来就开始根据Dockerfile和项目工程,创建自己的镜像了。把项目、Dockerfile、requirements.txt以及input.sh放在一个文件夹内,然后在docker命令窗口中,进入Dockerfile所在文件夹,执行命令" ocker build -t nicole_image6 .",执行成功后如下图所示:

这样,我们就创建了一个自己项目的镜像,查看创建的镜像:

这就是我们刚刚创建的镜像。
创建容器
创建了自己的镜像后,就可以在这个镜像上创建自己的容器,来运行我们的项目。执行命令" docker run --name nicole_container6_1 -it nicole_image6 /bin/bash",执行该命令后,创建一个名为nicole_container6的容器,并进入容器内,如下图所示:

由图可知,已经进入创建的容器内,且宿主机的文件夹内容也已经拷贝到容器内。
运行项目
既然项目已经部署在容器内,那接下来就是愉快地执行我们的demo代码啦。进入项目文件夹内,执行"python main.py",等待一会儿,即可执行完毕:

执行完毕后,会生成一个报告。把报告从容器中拷贝出来,查看执行结果。执行命令" docker cp 26aeeb16268b:/usr/src/app/pagepmodemo/report/page_demo_Report.html /Users/nicole_hf",即可将容器中的报告拷贝到宿主机的指定目录下。报告如下:

实践过程中遇到的坑
当我把项目部署到容器内运行的时候,一直提示运行失败。当时以为是环境没部署好,或者是该加载的包没有加载进来,然后一直陷入这个问题中不能自拔,花费了很长时间纠结这个问题。后来把报告拷贝出来一看才发现,每次运行到输入内容时,就走不下去了,原来是不支持执行带有键盘的操作,经过查阅资料发现,只需要在启动容器时执行Xcfb,申请一块Screen,在Dockerfile中加入启动脚本即可。脚本内容如下:

加入脚本后,再部署到容器中运行后,果然不报错了!!
以上是我对docker的一点点小尝试,如有什么不对的地方,欢迎大家批评指正。或者如果有什么意见或者建议,也欢迎提出讨论,撒花~~~
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易云社区,经作者黄芬授权发布。
基于Docker的UI自动化初探的更多相关文章
- 基于Docker+Jenkins实现自动化部署
使用码云搭建Git代码存储仓库 https://gitee.com/login 使用码云创建私有私有git仓库 将本地springboot项目上传到git仓库中 基于Docker安装Jenkins环境 ...
- 《软件测试自动化之道》读书笔记 之 基于反射的UI测试
<软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序 启动待测程序 设置窗体的属性 获取窗体的属性 设置控件的属性 ...
- 《软件测试自动化之道》读书笔记 之 基于Windows的UI测试
<软件测试自动化之道>读书笔记 之 基于Windows的UI测试 2014-09-25 测试自动化程序的任务待测程序测试程序 启动待测程序 获得待测程序主窗体的句柄 获得有名字控件的 ...
- 软件测试自动化之- 基于反射的UI自动化测试框架 - UI Automation Test Framework
测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操 ...
- 开发基于vue前端框架下的系统的UI自动化,记录总结踩的坑
在使用了pytest完成了一个系统的UI自动化后,因为系统的前端框架,是 基于VUE写的,这就让我编写脚本的时候踩了些坑. 无法用JS 修改标签属性,从而进行的操作 比如上传图片,我们的上传是这样子的 ...
- 基于 Docker 和 GitLab 的前端自动化部署实践笔记
基于 Docker 和 GitLab 的前端自动化部署 实践笔记 随着接触的项目越来越多,在部署测试流程上重复耗时工作也越来越多,所以对前端工作的CI/CD实现愈发迫在眉睫. 前端开发由于三大框架的崛 ...
- ATOMac - 基于Python的Mac应用Ui自动化库
ATOMacTest 一.缘 起 近期工作需要对一款Mac端应用实现常用功能的自动化操作,同事推荐ATOMac这款工具,这几天简单研究了下,同时也发现现网介绍ATOMac的资料非常有限,故在此记录下A ...
- 基于Docker UI 配置ceph集群
前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的 ...
- 基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍
1. 启动浏览器 前边有详细介绍启动三种浏览器的方式(IE.Chrome.Firefox): private WebDriver driver = null; private String chrom ...
随机推荐
- SQL 关联两个表的视图总结
视图就是一条select查询语句,是一张虚拟表. table a , table b 以表a基表(a LEFT JOIN b) 1.1 当update view时 更新view中表b字段并且表b ...
- Linux学习总结(六)-su命令 sudo 命令 限制root远程登录
root 用户拥有至高无上的权利,那么我们运维人员是不是直接在root用户下处理所有问题呢? 答案是否定的,权力越大,责任越大,人是会犯错的,因此我们要在不影响我们的工作情况下,尽量限制我们的权力,以 ...
- MyBatis(3)开发dao方法
本次全部学习内容:MyBatisLearning SqlSession SqlSession是一个面向用户(程序员)的接口. SqlSession中提供了很 ...
- EasyPoi导入Excel
EasyPoi的导出Excel功能和导入功能同样简单.我之前强调过,EasyPoi的原理本质就是Poi,正如MyBatis Plus的本质原理就是MyBatis. POI导入功能可以参考如下地址:ht ...
- Spring data JPA先排序再分页。
//工具类,增删改查等等package com.yunqing.service.impl; import java.util.Map; import org.springframework.beans ...
- Spring时间(Date)类型转换+自定义
第一种方法:利用内置的 CustomDateEditor(不推荐,每个类都需要定义) 首先,在我们的 Controller 的 InitBinder 里面,注册 CustomEditor //首先初始 ...
- oracle带输入输出参数存储过程(包括sql分页功能)
记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...
- string::size_type类型
string::size_type类型 对于string中的size函数,size函数返回的是string对象的字符个数(长度),我们知道,对size()来说,返回一个int或者是一个unsigned ...
- double工具类
package com.zq.utils; /** * * 经度数字操作类 * * Created by MyEclipse. Author: ChenBin E-mail: chenbin_2008 ...
- sql查询关于时间的一些汇总
今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * from 表名 where ...