Docker Docker selenium 记录——Selenium conf 2015

陈恒捷 · 2015年09月19日 · 最后由 叫我字母 回复于 2015年09月20日 · 351 次阅读

之前恒温告诉了我 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
    • 本地 standalone 的 Demo
    • 本地 grid 的 Demo
    • 云主机上 grid 的 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 连接进去即可看到浏览器画面进行调试。

包含的镜像及说明:

  • selenium/base: 包含 Java 运行组件及 Selenium jar 文件的基础镜像
  • selenium/hub: 运行 Selenium Grid Hub 的镜像
  • selenium/node-base: 包含虚拟桌面环境及 VNC 支持的 Selenium Grid Node 基础镜像
  • selenium/node-chrome: 包含 Chrome 的 Selenium node 镜像。需要连接 Selenium Grid Hub 使用。
  • selenium/node-firefox: 包含 firefox 的 Selenium node 镜像。需要连接 Selenium Grid Hub 使用。
  • selenium/standalone-chrome: 包含 Chrome 的 Selenium standalone 镜像(不需要连接 Selenium Grid Hub)
  • selenium/standalone-firefox: 包含 Firefox 的 Selenium standalone 镜像(不需要连接 Selenium Grid Hub)
  • selenium/standalone-chrome-debug: 包含 Chrome 和 VNC Server 的 Selenium standalone 镜像
  • selenium/standalone-firefox-debug: 包含 Firefox 和 VNC Server 的 Selenium standalone 镜像
  • selenium/node-chrome-debug: 包含 Chrome 和 VNC Server 的 Selenium Grid Node 镜像,需要连接 Selenium Grid Hub 使用
  • selenium/node-firefox-debug: 包含 Firefox 和 VNC Server 的 Selenium Grid Node 镜像,需要连接 Selenium Grid Hub 使用

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

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

Docker 基本介绍

关键字:Build, Ship, Run

  • Build

    • 把应用及其依赖环境全部打包到一个标准单元(及 docker image)。可以使用 Dockerfile 来建立 image 。
    • 这样你不用再关注你的环境配置是否正确,也不需要在一个 OS 中安装各个应用所需要的依赖库了。
  • Ship

    • push 到 registry
    • 公共 registry:Docker hub
    • 从 registry pull image 到任何兼容 docker 的机器。把配置机器简化到只需要 pull 镜像即可。
    • 采用 layer 存储 image 。layer 类似于 github 上的一次 commit ,每个 image 都是 layer 的叠加。pull image 只是 pull 你机器上没有的 layer ,已经有的不需要再获取。
  • Run

    • Container 相当于 image 的运行环境。它把 image 全部加载进来并转化成运行环境来运行应用。
    • Docker container 把一个应用及它运行所需要的一切封装在文件系统中。(Docker conatiners wrap up a piece of software in a complete filesystem that contains everything it needs to run.)
    • 无论它在哪里运行,它的实际运行都是完全一样的。
    • 由于不包含完整的 OS ,container 的启动和关闭都相当快速。

这里 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. 下载并运行镜像:

  • 第一条命令启动了 container -d 表示使用 daemon 形式运行,-name se 表示这个 container 名称为 se(便于以后控制),-p 5900:5900 -p 4444:4444 表示把 container 的 5900 和 4444 端口映射到宿主机的相同端口号,其中 5900 是 VNC Server 使用的端口,4444 是 standalone server 使用的端口
  • 第二条命令检查 container 是否成功启动了

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(需 ***)

使用的镜像:

  • selenium/hub
  • selenium/node-chrome
  • selenium/node-firefox

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

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

2. 运行这些镜像

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

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

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

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

3. 运行脚本

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

  • exit 前:

  • exit 后:

云主机上 grid 的 Demo

这个 demo 没视频

环境配置:

  • 两台 digital ocean 上具有独立 ip 地址的主机
    • ocean1:作为 hub 主机
    • ocean2:作为 node 主机

大致步骤:

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 的实践更多在于替代虚拟机,降低部署成本

最后

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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

已赏 80

#1 楼 @lihuazhang 肉牛满面!!! 😢 谢谢!

#2 楼 @chenhengjie123 已赏 20 凑成 100

#3 楼 @monkey 已收到,继续肉牛满面!谢老板打赏!

这是重大利好啊, 生产力的重大提升

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册