标签(空格分隔): 测试架构


什么是测试基础架构?

测试基础架构指的是,执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此,我们也把测试基础架构称之为广义的测试执行环境。通常来讲,测试基础架构主要包括以下内容:

  • 执行测试的机器;
  • 测试用例代码仓库;
  • 发起测试执行的 Jenkins Job;
  • 统一的测试执行平台;
  • 测试用例执行过程中依赖的测试服务,比如提供测试数据的统一测试数据平台、提供测试全局配置的配置服务、生成测试报告的服务等;

由于测试基础架构的核心是围绕测试执行展开的,所以我们今天就先来重点讨论一下“执行测试的机器”部分。

先试想一下:你要在一个典型测试场景中,基于某种浏览器去执行 Web 应用的 GUI 测试。这时,你首先要做的就是找到相应的机器,并确保上面已经安装了所需的浏览器。如果这台机器上,还没有安装所需浏览器的话,你需要先安装这个浏览器。一切准备就绪后,你就可以使用这台机器执行测试了。

如果你要执行的测试只需要覆盖一种浏览器的话,那就很简单了,你只要事先准备好一批专门的机器或者虚拟机,然后安装好所需的浏览器就可以了。同时,如果测试用例的数量也不是很多的话,你需要的这批机器或者虚拟机的数量也不会很多。执行测试时,你只要将需要使用的那台机器的地址提供给测试用例就可以了。

其实,这种模式就是典型的“小作坊”模式。“小作坊”模式的特点就是,人工维护一批数量不多(通常在 30 台以内)的执行测试的机器,然后按需使用。

对于小团队来讲,“小作坊”模式的问题并不大。但是,随着测试覆盖率要求的提升,以及测试用例数量的增加,这种“小作坊”模式的弊端就逐渐显现,并被不断放大了。其中,最主要问题体现在以下四个方面:

  • 当 Web 应用需要进行不同浏览器的兼容性测试时,首先你需要准备很多台机器或者虚拟机,并安装所需的不同浏览器;然后,你要为这些机器建立一个列表,用于记录各台机器安装了什么浏览器;最后,你在执行测试时,需要先查看机器列表以选择合适的测试执行机。
  • 当 Web 应用需要进行同一浏览器的不同版本的兼容性测试时,你同样需要准备很多安装有同一浏览器的不同版本的测试执行机,并为这些机器建立列表,记录各台机器安装的浏览器版本号,然后执行测试时先查看列表以选择合适的测试执行机。
  • 测试执行机的机器名或者 IP 发生变化,以及需要新增或者减少测试机时,都需要人工维护这些机器列表。很显然,这种维护方式效率低下,且容易出错。
  • 在 GUI 自动化测试用例的数量比较多的情况下,你不希望只用一台测试执行机以串行的方式执行测试用例,而是希望可以用上所有可用的测试执行机,以并发的方式执行测试用例,以加快测试速度。为了达到这个目的,你还是需要人工管理这些测试用例和测试执行机的对应关系。

四种情况的问题,可以归结为:测试执行机与测试用例的关系是不透明的,即每个测试用例都需要人为设置测试执行机。

为了改善这种局面,Selenium Grid 就应运而生了。

  • 一方面,使用 Selenium Grid 可以让测试机器的选择变得“透明”。也就是说,我们只要在执行测试用例时指定需要的浏览器版本即可,而无需关心如何找到合适的测试执行机。因为,这寻找符合要求的测试执行机的工作,Selenium Grid 可以帮你完成。
  • 另一方面,Selenium Grid 的架构特点,天生就能很好地支持测试用例的并发执行。

接下来,我就和你详细聊聊到底什么是 Selenium Grid,Selenium Grid 的架构是什么样的。

  • Selenium Hub 用来管理各个 Selenium Node 的注册信息和状态信息,并且接收远程客户端代码的测试调用请求,并把请求命令转发给符合要求的 Selenium Node 执行。

传统 Selenium Grid 的搭建方法

  • 通过官网下载 selenium-server-standalone-.jar 文件。这里需要注意的是,不管是 Hub 还是 Node,都使用同一个 JAR 包启动,只是启动参数不同而已。将下载的 selenium-server-standalone-.jar 文件分别复制到两台机器上。选定其中一台机器作为 Selenium Hub,并在这台机器的命令行中执行以下命令:

java -jar selenium-server-standalone-<version>.jar -role hub

在这条命令中,“-role hub”的作用是将该机器启动为 Selenium Hub。启动完成后,这台机器默认对外提供服务的端口是 4444。

然后,你就可以在这台机器上通:http://localhost:4444/grid/console

观察Selenium Hub 的状态,也可以在其他机器上通过 http://:4444/grid/console 观察 Selenium Hub 的状态。其中, 是这台 Selenium Hub 机器的 IP 地址。由于此时还没有 Node 注册到该 Hub 上,所以你看不到任何的 Node 信息。

启动过程和状态信息,分别如图

  • 在另一台作为 Selenium Node 的机器上执行以下命令:

java -jar selenium-server-standalone-<version>.jar -role node -hub http:// <Hub_IP>:4444/grid/register

这条命令中,“-role node”的作用是,将该机器启动为 Selenium Node,并且通过“-hub”指定了 Selenium Hub 的节点注册 URL.执行成功后,你可以再次打开 http://:4444/grid/console 观察 Selenium Hub 的状态。此时,你可以看到已经有一个 Node 挂载到了 Hub 上。这个 Node,就是用来实际执行测试的机器了。并且,这个 Node 上已经缺省提供了 5 个 Firefox 浏览器的实例、5 个 Chrome 浏览器的实例和 1 个 IE 浏览器的实例,同时默认允许的并发测试用例数是 5 个

如果你想自己配置这些内容,可以在启动 Node 的时候提供不同的启动参数。具体可以指定哪些参数,你可以参考

https://github.com/SeleniumHQ/selenium/wiki/Grid2

所示为在 Hub 端注册 Node 的过程,如图 6 所示为挂载完 Node 后 Selenium Hub 的状态。

完成上述操作后,在测试用例中通过以下代码将测试指向 Selenium Hub,然后由 Selenium Hub 完成实际测试执行机的分配与调度工作。其中,最关键的部分是,创建 RemoteWebDriver 实例的第一个参数,这个参数不再是一个具体的测试执行机的 IP 地址或者名字了,而是 Selenium Hub 的地址。


DesiredCapabilities capability = DesiredCapabilities.firefox();
WebDriver driver = new RemoteWebDriver(new URL("http://<Hub_IP>:4444/wd/hub"), capability);

基于 Docker 的 Selenium Grid 的搭建方法

目前,Docker 技术的广泛普及,再加上它的轻量级、灵活性等诸多优点,使得很多软件都出现了 Docker 版本。当然,Selenium Grid 也不例外。所以,我也会在这里和你简单介绍一下基于 Docker 的 Selenium Grid 搭建过程。

在这个搭建过程中,你将会发现基于 Docker 运行 Selenium Grid 的话,机器的利用率会得到大幅提高。因为,一台实体机或者虚拟机,往往可以运行非常多的 Docker 实例数量,而且 Docker 实例的启动速度也很快。因此,相对于虚拟机或者实体机方案而言,Docker 方案可以更高效地创建 Node。

接下来,我们就一起看看如何基于 Docker 来搭建 Selenium Grid 吧。

在基于 Docker 搭建 Selenium Grid 之前,你需要先安装 Docker 环境。具体安装方法,https://docs.docker.com/get-started/

接下来,你就可以通过以下命令分别启动 Selenium Hub 和 Selenium Node 了。


#创建了Docker的网络grid
$ docker network create grid #以Docker容器的方式启动Selenium Hub,并且对外暴露了4444端口
$ docker run -d -p 4444:4444 --net grid --name selenium-hub selenium/hub:3.14.0-europium #以Docker容器的方式启动并挂载了Chrome的Selenium Node
$ docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome:3.14.0-europium #以Docker容器的方式启动并挂载了Firefox的Selenium Node
$ docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox:3.14.0-europium

相比基于实体机或者虚拟机搭建 Selenium Grid 的方法,基于 Docker 的方式灵活性更大、启动效率也更高、可维护性也更好。而且,在更高级的应用中,比如当我们需要根据测试用例的排队情况,动态增加 Selenium Grid 中的 Node 数量的时候,Docker 都将是最好的选择。关于这部分内容具体的细节,我会在后面两篇文章中详细展开。

什么是Selenium Grid?如何搭建Selenium Grid?的更多相关文章

  1. selenium===使用docker搭建selenium分布式测试环境

    准备: #请在此之前先了解,selenium grid :参考:selenium-grid ,下载地址,win-本地部署过程 >>>环境准备: Linux操作系统 >>& ...

  2. 用docker搭建selenium grid分布式环境实践之路

    最近需要测试zoom视频会议,同时模拟100个人加入会议.经过了解,zoom提供了直接通过url链接加入会议的方式(只能通过chrome浏览器或者FireFox浏览器,因为用的协议是webrtc). ...

  3. 使用docker搭建selenium grid 分布式环境

    本文章只做docker搭建selenium grid 分布式环境步骤说明,对于selenium grid中的参数.流程.原理等不做说明.selenium grid的详细情况可查看官方文档https:/ ...

  4. selenium Grid2环境搭建和基本使用

    Selenium Grid简介 利用Selenium Grid可以使主节点(hub)的测试用例在不同主机即分支点(node)运行.可以使一份测试用例在不同环境下(操作系统.浏览器)执行自动化测试.Se ...

  5. Python+Selenium(1)- 环境搭建

    一,Selenium 简介 Selenium是目前最流行的web自动化测试工具,也常用于网络爬虫,已经更新到3以上的版本. 1,组件 它提供了以下web自动化测试组件: Selenium IDE,Fi ...

  6. 开发回归测试之Selenium开发环境搭建

    前言 在解bug的过程中,经常遇到解完某个bug带来新的bug,原因一般是因为回归测试不足或不全面,下面我们来看看怎么利用selenium工具来完成开发后的回归测试, 虽然这可能是QA的事,不过有利于 ...

  7. Selenium自动化测试环境搭建汇总(一):Selenium+Eclipse+Junit+TestNG

    第一步 安装JDK JDk1.7. 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-188026 ...

  8. Python+Selenium+webdriver环境搭建(windows)以及相关资源下载链接

    今天记录一下测试小菜鸟alter在测试入门的一点关于python+Selenium+webdriver环境搭建的经历以及资源分享.欢迎交流学习,批评指正. 一.Python的下载与安装 1.pytho ...

  9. pycharm 的安装及selenium环境的搭建

    6.呵呵哒,前面写了一篇pycharm的安装,,结果自己都看不懂了,copy了别人的,,,自己现在再写一遍,这篇文章主要写pycharm 的安装及selenium 环境的搭建,selenium的搭建不 ...

  10. 自动化测试基础篇--Selenium Python环境搭建

    学习selenium python需要的工具: 1.浏览器 2.Python 3.Selenium 4.FireBug(Firefox) 5.chromedriver.IEDriverServer.g ...

随机推荐

  1. Wordpress给每一个分类栏目定制不同的广告位

    给分类栏目添加广告位,等同于添加自定义字段. 如果需要依据不同的栏目给广告位添加不同的tag来源,需要在模板页面中获取栏目的分类别名,读取不同的广告. 图1 如图1所示添加新的图片输入框 1. 实现的 ...

  2. WPF使用Shape实现复杂线条动画

    看到巧用 CSS/SVG 实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果.ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合 MASK 实现 ...

  3. python小功能

    django实现将linux目录和文件名列出来 def index(request): obj=models.USER.objects.all() fileroot = 'd:\machangwei' ...

  4. 从 p12 格式 SSL 证书解出 pem 格式公钥私钥给 Postman 使用

    目的 Postman 的(非 Chrome 扩展版的)app 并不能读取系统中的客户端证书,这种调试要发送客户端证书的 https 请求的时候就得自己另外设置.系统直接导出证书有 cer 和 p12 ...

  5. Bear and String Distance

    传送锚点: codeforces.com Copy 4 26 bear output roar input 2 7 af output db input 3 1000 hey output -1 思路 ...

  6. Java8新特性——接口静态方法

    概述 从Java8开始接口发生两个大的改变,一个是引入了default关键字,另个一个就是允许静态方法的存在. default关键字在<Java8新特性default关键字,引出Java多继承问 ...

  7. jquery 给表格添加或删除一行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. HTML——基本标签

    1.标题标签 <h1>标题1</h1> <h2>标题2</h2> <h3>标题3</h3> <h4>标题4</ ...

  9. PaddleOCR之高性能Go语言实现OCR识别

    最近为了让python语言能够直接调用PaddleOCR的C++的动态链接库,针对本人已经开源的PaddleOCR项目https://gitee.com/raoyutian/paddle-ocrsha ...

  10. matplotlib学习:搞明白plt. /ax./ fig

    原文章一:https://zhuanlan.zhihu.com/p/93423829,原文章二:https://jishuin.proginn.com/p/763bfbd23e20    感谢作者的讲 ...