本文来自网易云社区

前言

一直以来,项目迭代的时间都是比较紧张的,开发加班加点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. 关于PHP中的 serialize () 和 unserialize () 的使用(即关于PHP中的值与已存储的表示的相互转换)

    有时,我们会碰到这样的数据(字符串) a:3:{i:0;s:44:"/Uploads/images/2017-07-21/5971a9a08ad57.png";i:1;s:44:& ...

  2. .net打印

    <input type="button" onclick="javascript:printit()"></input>//打印整个ht ...

  3. Hibernate之openSession与getCurrentSession的区别

    openSession 与 getCurrentSession的区别(1)openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定 ...

  4. 如何解决使用JMeter时遇到的问题

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

  5. iOS | 解决中文乱码

    在iOS开发中,多多少少的朋友在开发的过程中,测试数据的时候可能会碰到后台打印的时候不能正确的打印出正常的汉字,打印出一些影响判断的字符,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接 ...

  6. c#(IronPython)调用Python方法

    直接一段代码演示 public void StartTCP() { ScriptEngine engine = Python.CreateEngine(); var paths = engine.Ge ...

  7. C++分享笔记:5X5单词字谜游戏设计

    笔者在大学二年级刚学完C++程序设计后,做过一次课程设计,题目是:5X5单词字谜游戏设计.为了设计算法并编写程序,笔者在当时颇费了一番心力,最后还是成功地完成了.设计中不乏有精妙之处.该程序设计完全是 ...

  8. (八)netty的SSL renegotiation攻击漏洞

    为了满足安全规范,从http改造成https(见(四)启用HTTPS),然而启用https后就可以高枕无忧了吗?绿盟告诉你:当然不,TLS Client-initiated 重协商攻击(CVE-201 ...

  9. Postgresql 入门笔记

    引言     最近整理了一些PostgreSQL的 常用命令,仅供参考   1. 入门命令 # 重启数据库 $ service postgresql-9.5 restart # 登陆: $ psql ...

  10. tp5.1路由报错No input file specified.

    问题: 按照官方教安装了框架,打开首页没问题,可是安装教程路由规则打开 "http://127.0.0.1/hello/2" 时, 却报错误  "No input fil ...