之前恒温告诉了我 selenium conf 2015 的消息,提到里面有个 docker 相关的 topic 。刚好我最近也在关注如何把 docker 应用到测试领域,所以去看了一下,收获不少。在此也把它记录成文字,以供大家了解。

我的博客上的地址:http://chjvps.com/blog/?p=997

视频地址:
youtube: https://www.youtube.com/watch?v=S4OkrnFb-YY&index=20&list=PLRdSclUtJDYXehIM7SyQyIghLDmE015Gc(需 ***)
youku: http://v.youku.com/v_show/id_XMTMzODY3MTI4MA==.html?f=26081500

Slide 地址:
https://speakerdeck.com/marekj/seconf2015-docker-selenium
国内网盘地址

演讲者:Marek Jastrzebaki (twitter: @rubytester)

主要内容(通过类别重新排序):

  1. 用虚拟机组建的 Selenium Grid 的痛处
  2. Github 上的 seleniumHQ/docker-selenium 项目
  3. docker 基本介绍
  4. 用 docker 代替虚拟机组建 Selenium Grid 的好处
  5. Marek 在 HomeAway 中的实践
  6. Demo

用虚拟机组建的 Selenium Grid 的痛处

我们通过 puppet 或者 chef 来管理虚拟机,从而能尽快地进行虚拟机的部署和管理。然而还是存在下面这些问题:

  1. 需要根据测试环境需要增加/配置/删除虚拟机,耗费大量时间
  2. 没有找到好的策略来管理 chrome 这种会自动升级的浏览器(理想情况下应该有不同版本并能自由切换)

Github 上的 seleniumHQ/docker-selenium 项目

地址:https://github.com/SeleniumHQ/docker-selenium

简要说明:

  1. 包含了所有你运行 Selenium standalone/grid 所需的一切
  2. 使用 Dockerfile 配置 java,selenium jar,浏览器,浏览器对应 webdriver 等镜像内环境。这意味着你可以通过修改 Dockerfile 构建定制化的镜像
  3. 有部分包含了 VNC Server 的镜像用于调试。通过 VNC Viewer 连接进去即可看到浏览器画面进行调试。

包含的镜像及说明:

同时也在 Docker Hub 上有对应的镜像库:

所有镜像使用 autobuild ,即 github 上的 Dockerfile 一旦更新,这个镜像库内的镜像也会自动更新。

Docker 基本介绍

关键字:Build, Ship, Run

这里 Marek 举了一个例子:

把能运行 docker 的机器比作船,container 比作船上的货物。

人们总是关注这艘船能装多少货物,并让它尽可能处于最大负载量,结果就是船不堪重负,很有可能就沉了。

而对于 selenium
,我们需要的不是这种容量大的大船,我们也不关注它最大容量有多大。我们需要的是能快速装卸货物的快速船。如果货物放上去后可以正常使用,那很好。如果不能,那就把它扔了换另一个。这同时也是
selenium grid 的思想。

也就是说,我们不关注你给我们多大的船,多少艘船,也不关注这个船本身的型号什么的。我们需要的只是使用船上装卸货物的能力,所以给我们能装卸货物的船即可。

用 docker 代替虚拟机组建 Selenium Grid 的好处

  1. 不再需要自己安装 java,浏览器等,只需要按照需要 run 这些 docker image 即可。
  2. 只需要有一台 OS 支持 Docker Engine 的虚拟机/物理机就可以跑了
  3. 在 Home away 的实践中,我们在内部云上根据自己需要开启和组建自己的 selenium grid ,大大缩短了以前增加和配置虚拟机所花的时间。同时由于组建 grid 成本低,因此不需要 grid 的时候直接关闭即可。

Marek 在 HomeAway 中的实践

HomeAway 内部使用了 puppet 。我对这个东西基本没什么了解,所以仅贴上 slides :




欢迎了解 puppet 的童鞋在后面跟帖解读这部分内容。

Demo

本地 standalone 的 Demo

使用的镜像:selenium/standalone-firefox-debug

视频地址:http://youtu.be/vMba9xlDoOs(需 ***)

为了让翻不了墙的同学了解这个 Demo ,简要步骤记录如下:

1. 下载并运行镜像:

2. 打开 VNC


此处的 192.168.99.100 是运行 docker 的虚拟机的 ip 地址。这条命令在 mac os x 上适用,其他系统不一定也适用。但也可以手动通过 VNC Viewer 程序连接到虚拟机。

3. 运行脚本


脚本打开了 container 中的 firefox 浏览器,打开 Homeaway 搜索页,输入搜索信息进行搜索,最后关闭 firefox 浏览器。

4. 关闭 container

关闭之前打开的 container ,释放资源。

本地 grid 的 Demo

视频地址:http://youtu.be/hG5AOf8Pm4c(需 ***)

使用的镜像:

为了让翻不了墙的同学了解这个 Demo ,简要步骤记录如下:

1. pull 所有需要用到的镜像

2. 运行这些镜像

--link 表示这个 container 新启动的 container 能通过内部网络与指定 container 进行连接,即 node 能与 hub 建立网络通讯。

运行成功后应该能通过 docker logs hub 看到 hub container 中接收到两个 node 的注册请求:

使用 docker ps 命令能看到 3 个 container:

并且用浏览器打开 hub 地址后看到两个节点:

3. 运行脚本

hub 上的浏览器状态会发生变化:

云主机上 grid 的 Demo

这个 demo 没视频

环境配置:

大致步骤:

1. 使用 docker-machine 命令(这个工具在 docker ToolBox 里)在这两台主机上初始化 docker

$ docker-machine create \
--driver digitalocean \
--digitalocean-access-token $TOKEN \
ocean1

...

$ docker-machine create \
--driver digitalocean \
--digitalocean-access-token $TOKEN \
ocean2

...

2. 在 ocean1 上启动 hub container

3. 在 ocean2 上启动 node container


4. 最终效果

总结

  1. 对于 selenium grid 环境,Docker 相比 VM 的优势在于快速启动和快速部署
  2. 对于变更频繁的测试环境,使用 docker 能减少很多部署的时间
  3. 对于测试领域,docker 的实践更多在于替代虚拟机,降低部署成本

最后

如果觉得这篇文章对你有帮助,也愿意给我打个赏的同学,可以点击下方打赏按钮,扫描二维码打赏给我。在此谢过!


↙↙↙阅读原文可查看相关链接,并与作者交流