基于Docker的UI自动化初探

达芬奇密码2018-08-22 11:10
前言

一直以来,项目迭代的时间都是比较紧张的,开发加班加点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

本文来自网易实践者社区,经作者黄芬授权发布。