在更短的时间内提供完整、全面的测试,以确保质量。
敏捷模式被广泛使用,测试尤为重要。 由于需要频繁发布新版本,我们需要更频繁地执行测试用例,以确保不会在发布中引入新的错误。
一个完整的测试过程所需的时间和资源不容忽视,包括测试结果的分析。 如何在更短的时间内提供完整、全面的测试,保证质量,是我们急切解决的问题,也是保证敏捷开发能够顺利进行的关键。
Jenkins 实现了一个无人值守的测试过程,一旦开发完成,下游测试任务就会在测试环境中部署后立即执行。
Jenkins 应用程序在一定程度上节省了人力资源,而 Docker 技术可以实现容器的快速扩展,从而节省了大量的设备资源和时间,并快速完成测试。 这是 Jenkins 管道中非常重要的一部分,如图 1 所示
图1 jenkins pipeline
本文介绍如何使用 Docker Swarm 集群特性和 Selenium Grid 脚本分发功能构建可动态扩容的 Selenium 自动化脚本执行环境。 相较于使用真机作为Selenium自动化脚本执行环境,使用此环境可以大大减少执行环境的维护,例如管理各种浏览器类型和版本。 还可以大大减少脚本执行环境的物力投入,节省各种资源。
Swarm 是 Docker 提供的用于管理 Docker 集群的集群管理工具,它将多个 Docker 主机抽象成一个整体,并通过单个门户管理这些 Docker 主机上的各种 Docker 资源。
Swarm 只是一个调度器和路由器,Swarm 本身并不运行容器,它只是接受来自 docker 客户端的请求,并调度合适的节点来运行容器,这意味着即使 Swarm 因为某种原因宕机,集群中的节点也会照常运行,当 Swarm 恢复运行时,它会收集信息来重建集群。
Swarm 类似于 Kubernetes,但比 Kubernetes 更轻,功能更少。
为了设置 docker swarm 集群环境,我在示例中准备了两台机器。 一个充当管理器节点和工作节点,另一个仅充当工作节点。
假设我们的两台机器 IP 信息如下:
m1:m2:
v1 的 Docker 引擎12.从版本 0 开始,docker swarm 原生集成,所以只要每台机器上都安装了 docker,就可以直接使用 docker swarm。 这里就不详细描述docker的安装了,请按照官方的docker swarm文档进行安装。 安装完成后,在每台计算机上启动 docker 服务。 提示:
注意:最好关闭计算机上的防火墙,否则您的集群可能会遇到网络连接问题。
关闭防火墙的命令:systemctl stop firewalld.service
禁用防火墙启动启动命令:systemctl disable firewalld.service
1. 创建管理节点。
我们使用机器 m1 作为管理器节点,并在这台机器上执行命令来初始化集群环境。 命令如下:
sudo docker swarm init --advertise-addr 10.13.181.1
执行此命令时,将返回一个令牌以加入集群,以便其他工作线程可以加入集群。
清单 1用于加入集群的令牌示例。
docker swarm join --token swmtkn-1-5p3kzxhsvlqonst5wr02hdo185kcpdajcu9omy4z5dpmlsyrzj-3phtv1qkfdly2kchzxh0h1xft 10.13.181.1:2377
2. 如果要再次获取加入集群的命令,可以运行以下命令:sudo docker swarm join-token worker
3. 将计算机 m1 作为工作节点添加到集群中。 在管理器节点机器上运行清单 1 命令,将机器 m1 作为工作线程添加到 swarm 集群中。
4. 将另一台计算机 M2 作为工作节点添加到集群中。 在机器 M2 上执行上面清单 1 中的命令,实现 M2 加入集群的功能。
5. 运行以下命令以创建集群网络:
sudo docker network create -d overlay seleniumnet
在本例中,SeleniumNet 是我们创建的集群网络的名称。
6. 在新创建的集群网络上创建 Selenium Grid 服务。
a.创建 Selenium Grid Hub 服务。 基于集群网络 SeleniumNet,端口 4444 映射到集群的端口 4444。 将超时时间设置为 120 秒以增加或减少超时时间。 如清单 2 所示:
清单 2创建 Selenium Grid Hub 服务。
sudo docker service create --name selenium-hub --network seleniumnet -p 4444:4444 -egrid_timeout=120 selenium/hub
b.创建 Selenium Grid Firefox 节点服务并连接到您刚刚创建的 Hub 服务。 如清单 3 所示:
清单 3创建 Selenium Grid Firefox 节点服务
sudo docker service create \ name node-firefox \ replicas 5 \ p 7900:5900 \ network seleniumnet \ e hub_port_4444_tcp_addr=selenium-hub \ e hub_port_4444_tcp_port=4444 \selenium/node-firefox-debug bash -c 'se_opts="-host $hostname" /opt/bin/entry_point.sh'
参数说明:-p: 7900:5900
Docker 的内部VNC5900暴露在主机的 7900 端口,以便用户可以通过 VNC 从外部监控 Docker 的内部执行。
c.创建 Selenium Grid Chrome 节点服务并连接到您刚刚创建的 Hub 服务。 如清单 4 所示:
清单 4创建节点服务
sudo docker service create \ name node-chrome \ replicas 3 \ p 7901:5900 \ network seleniumnet \ e hub_port_4444_tcp_addr=selenium-hub \ e hub_port_4444_tcp_port=4444 \selenium/node-chrome-debug bash -c 'se_opts="-host $hostname"/opt/bin/entry_point.sh'
参数说明:-p: 7901:5900
Docker 的内部VNC5900暴露在主机的 7901 端口,以便用户可以通过 VNC 从外部监控 Docker 的内部执行情况。
7. 检查环境是否搭建成功。 在计算机 m1 上执行以下命令,查看每个服务是否成功启动:
sudo docker service ls
您可以看到 Selenium Hub 和 Firefox 节点以及 Chrome 节点都已成功启动。 Firefox 有 5 个节点副本,Chrome 有 3 个节点副本。 如图2所示
图2Docker 服务清单。
然后我们通过任意机器的 IP 和端口 4444 打开 Selenium Hub URL,检查启动的 Firefox 和 Chrome 节点是否已成功挂载到 Hub 节点。 如图3所示
hub url: 10.13.181.1:4444
图3Selenium Hub 的界面图。
如图 3 所示,5 个 Firefox 节点和 3 个 Chrome 节点已成功挂载到 hub 节点。 请注意,Docker Swarm 环境中提供了 5 个 Firefox 节点和 3 个 Chrome 节点来执行 Selenium 自动测试脚本。
例如,我们需要 10 个可以运行 Firefox 浏览器的容器,对应的命令如下:
sudo docker service scale node-firefox=10
在 Docker Swarm 中运行 Jenkins 作业时,不需要在 Jenkins 中做冗余配置,而是需要在对应的自动化脚本中调用 Selenium Hub,以便远程调用 WebDriver。 这使得在 docker 容器中运行 Selenium 脚本成为可能。
以本文中的场景为例,你只需要在自动化脚本中调用远程 Selenium Hub,如下图所示:
Selenium Grid 用于分布式自动化测试,这意味着一组 Selenium ** 可以在不同的环境中运行,这使得在 Docker 提供的不同容器中运行应用程序变得容易。
Selenium Grid 有两个概念:
Hub:主节点,可以将其视为主调度中心。 node:一个分支节点,您可以将其视为实际执行任务的工作线程。 也就是说,Selenium Grid 中只能有一个主节点,但可以在本地或远程设置 n 个分支节点,测试脚本指向主集线器,主集线器分配给本地远程节点运行测试用例。
要在 Selenium Grid 中运行自动化脚本,我们首先需要创建一个 Remote Driver 对象,该对象可以从图 4 中的源代码实现,截图中的输入参数 Selhub 是 Selenium Hub 的 URL
图4自动化脚本的屏幕截图。
通过调用上述驱动程序,可以在 docker 容器中运行自动化脚本。
在持续集成测试中,将测试部署到 Docker Swarm 上,并通过 Selenium Grid 自动分配节点执行测试,可以提高测试效率,扩大测试范围,在快速迭代中更好地保证交付产品的质量,节省测试资源。