`
January 23, 2018 本文阅读量

docker+selenium+python构建前端自动化分布式测试环境

docker + selenium + python 构建前端自动化分布式测试环境。利用seleninum-grid分布式框架,python编写测试代码,docker部署来进行前端自动化测试。

docker + selenium + python 构建前端自动化分布式测试环境。利用seleninum-grid分布式框架,python编写测试代码,docker部署来进行前端自动化测试

2018-2-1 更新 使用docker-compose编排

分布式部署的优点

自动化的优缺点就不再重复了,主要分析下docke部署和分布式的优势

  • 提高自动化的测试效率(分布式)
  • 方便打包和持续集成(docker)
  • 解决多人coding,却因为路径不一致导致无法运行的问题(当然也可以通过其他方式来解决~)

这里还有一个问题就是:使用docker部署方式运行测试代码,是看不见本地浏览器启动的,因此在调试测试代码的时候,需要一定的工具来协助,譬如VNC viewer

开篇-selenium

大家都知道 Selenium 是支持多种浏览器多个编程语言的一个自动化测试工具。而 Selenium Grid 是一种可以让用户在不同的环境和不同的浏览器上并行运行 web 测试用例的框架。换而言之,使用 Selenium Grid 可以让我们在分布式测试环境下执行测试,例如 Windows,Linux,Mac OS,Andoid/iOS 等等,这样可以大大减少重复的工作量,提高我们的工作效率。

selenium分布式结构如图: selunium-grid

搭建分布式环境

在Dockerhub已经具有了相应的selenium的镜像,我们直接使用就行了

拉取镜像

docker pull selenium/hub
docker pull selenium/node-chorme-debug

关于node-chrome-debugnode-chrome的区别: 暂未研究

运行容器

docker run -d -p 4444:4444 --name sel-hub selunium/hub # 运行hub服务
docker run -d -p 5900:5900 --link sel-hub:hub selunium/node-chrome-debug # 运行slenium chrome 节点
# more node could append like node-chrome-debug

查看节点信息

在浏览器中打开http://127.0.0.1:4444/grid/console 这里需要注意的是,如果是在本地运行的容器,并映射4444端口,因此得到127.0.0.1:4444,如果是在虚拟机中运行,ip和端口应该根据网络来获取相应的IP和PORT

查看容器

可以使用docker ps -a来查看容器的状态,确保hub服务和node节点已经成功运行了

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
f2559a691250        selenium/node-chrome-debug   "/opt/bin/entry_poin…"   24 minutes ago      Up 24 minutes       0.0.0.0:5900->5900/tcp   vibrant_bardeen
69c8bf2544b8        selenium/hub                 "/opt/bin/entry_poin…"   25 minutes ago      Up 25 minutes       0.0.0.0:4444->4444/tcp   selenium-hub

编写简单测试代码

关于python-selenium的使用方法,参见http://selenium-python.readthedocs.io/index.html

OS python selenium
MacOS 3.6.5 3.8.0

测试代码使用python编写,在运行过程中遇到了报错,通过升级python-selenium版本到3.8.0解决

from selenium import webdriver as wd
from from selenium.webdriver.common.desired_capabilities import DesiredCapabilities as DC

hub_remote_url = "http://127.0.0.1:4444/wd/hub"
driver = wd.Remote(
	command_executor=hub_remote_url,
  	desired_capabilities=DC.CHROME)

test_url = "http://www.baidu.com"

def test_baidu_screenshot():
	driver.get(test_url)
	driver.save_screenshot("baidu.png")
	print("save baidu screenshot done")

test_baidu_screenshot()
driver.quit()

扩展-测试代码制作镜像

使用了pytest测试框架 测试代码的目录结构如下:

docker-test
 |---lib //python虚拟环境相关
 |---bin //python虚拟环境相关
 |---include //python虚拟环境相关
 |---src
 |    `-测试代码...
 |---requirements.txt //依赖清单
 `---Dockerfile //用于说明如何构建一个docker镜像

编写Dockerfile

FROM python:alpine3.6

WORKDIR /usr/src/test

COPY requirements.txt ./
COPY src/ ./src

RUN pip install --no-cache-dir -r requirements.txt \
	&& find ./src -name "__pycache__" | xargs rm -fr
# 注:删除__pycache__文件夹是避免把调试环境的差异构建到镜像中(该差异会导致无法正确执行)

使用docker-compose编排

基本上就是单个容器的执行转换成docker-compose配置文件格式就行了

version: "2"

networks:
  private:
    driver: bridge

services:
  hub:
    image: selenium/hub
    ports:
      - 4444:4444
    networks:
      - private
  chrome:
    image: selenium/node-chrome
    ports:
      - 5900:5900
    links:
      - hub
    depends_on:
      - hub
    # 注意这一点,如果不配置这些环境变量会导致node无法找到hub服务
    environment:
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
    networks:
      - private

构建镜像截图

构建镜像截图

运行容器截图

这里选择的是,交互方式执行测试代码docker run --rm -it dcoker-test /bin/sh, 也可以直接执行pytest测试docker run --rm docker-test pytest -v,只是这种方式在输出方式上没有第一种美观(~^~) 运行容器截图

总结

  • 使用docker极大屏蔽了部署selenium会遇到的系统差异问题,步骤简洁,易于配置。
  • 分布式部署selenium又能提升前端自动化测试的效率,能够同时运行在不同的系统和浏览器,高效又便捷。
  • docker打包测试代码,方便协同coding和运行在不同系统环境,简化配置方案
  • 目前遇到的不足,selenium-grid框架在执行测试代码的时候,调试不是很方便,需要依赖其他的工具(VNC,连接在上方)
  • 在docker中运行测试,会遇到中文字符乱码的情况,可以通过改写Dockerfile重新打包镜像来解决该问题