本文来自网易云社区

前言

一直以来,项目迭代的时间都是比较紧张的,开发加班加点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自动化初探的更多相关文章

  1. 基于Docker+Jenkins实现自动化部署

    使用码云搭建Git代码存储仓库 https://gitee.com/login 使用码云创建私有私有git仓库 将本地springboot项目上传到git仓库中 基于Docker安装Jenkins环境 ...

  2. 《软件测试自动化之道》读书笔记 之 基于反射的UI测试

    <软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序  启动待测程序  设置窗体的属性  获取窗体的属性  设置控件的属性  ...

  3. 《软件测试自动化之道》读书笔记 之 基于Windows的UI测试

    <软件测试自动化之道>读书笔记 之 基于Windows的UI测试 2014-09-25 测试自动化程序的任务待测程序测试程序  启动待测程序  获得待测程序主窗体的句柄  获得有名字控件的 ...

  4. 软件测试自动化之- 基于反射的UI自动化测试框架 - UI Automation Test Framework

    测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操 ...

  5. 开发基于vue前端框架下的系统的UI自动化,记录总结踩的坑

    在使用了pytest完成了一个系统的UI自动化后,因为系统的前端框架,是 基于VUE写的,这就让我编写脚本的时候踩了些坑. 无法用JS 修改标签属性,从而进行的操作 比如上传图片,我们的上传是这样子的 ...

  6. 基于 Docker 和 GitLab 的前端自动化部署实践笔记

    基于 Docker 和 GitLab 的前端自动化部署 实践笔记 随着接触的项目越来越多,在部署测试流程上重复耗时工作也越来越多,所以对前端工作的CI/CD实现愈发迫在眉睫. 前端开发由于三大框架的崛 ...

  7. ATOMac - 基于Python的Mac应用Ui自动化库

    ATOMacTest 一.缘 起 近期工作需要对一款Mac端应用实现常用功能的自动化操作,同事推荐ATOMac这款工具,这几天简单研究了下,同时也发现现网介绍ATOMac的资料非常有限,故在此记录下A ...

  8. 基于Docker UI 配置ceph集群

    前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的 ...

  9. 基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍

    1. 启动浏览器 前边有详细介绍启动三种浏览器的方式(IE.Chrome.Firefox): private WebDriver driver = null; private String chrom ...

随机推荐

  1. boost::timer库使用

    boost::timer boost库定时器使用,需要在编译时加相关链接库 -lboost_timer -lboost_system boost::timer::cpu_timer 和boost::t ...

  2. VBS小脚本_ 玩坏键盘的指示灯

    代码简单,功能好玩,富有趣味 set ws=wscript.createobject("wscript.shell") do wscript.sleep ws.sendkeys&q ...

  3. Fiddler学习基础(一)

    Fiddler官方网站及下载地址:http://www.telerik.com/fiddler 1. Fiddler原理: 作为系统代理,所有的来自微软互联网服务(WinInet)的http请求再到达 ...

  4. VC++ MFC工程中中如何将一个工程的资源(如对话框)复制到另外一个工程

    问题的提出:在工程1中用到的资源,在工程2中已有现成的.即工程1中要用到的对话框和工程2的完全相同,而工程2中对该对话框的布局已设计好.控件变量都绑定好了.但由于该对话框的控件特别多,如果在工程1中再 ...

  5. Jmeter-常用函数之__CSVRead使用

    可参照:http://www.cnblogs.com/liu-ke/p/4324157.html 压测中有些参数是固定范围内的取值,或者成对出现(如登录帐号和密码),以大量用户同时登录网站为例: 1. ...

  6. Matplotlib——初级

    matplotlib是一个专门用来绘图的库,在分析数据的时候,使用它可以将数据进行可视化,更直观的呈现.下面是几个通过matplot绘制的图. 通过图形的绘制,我们可以很清晰地看到数据直接的关系,并对 ...

  7. 解决vue变量未渲染前代码显示问题

    在网络加载缓慢或者刷新的时候总会有那么一瞬间出现vue的模板代码,实在很影响美观,对于我这种有强迫症的人来说实在是忍无可忍,后来经过查找资料,终于发现了解决方法,可以使用vue现成的指令来解决这个问题 ...

  8. chromium之message_pump_win之三

    上一篇分析MessagePumpForUI,参考chromium之message_pump_win之二 MessagePumpForIO,同MessagePumpForUI,也是要实现三个函数 // ...

  9. js之广告

    涉及到offset等有关获取各种尺寸问题下 <!doctype html> <html lang="en"> <head> <meta c ...

  10. 前端js转换时间戳为时间类型显示

    //时间戳转换 function add0(m){return m<10?'0'+m:m } function formatDate(timestamp) { //timestamp是整数,否则 ...