赞
踩
Selenium 1.0 的核心是,基于 JavaScript 代码注入;而 Selenium 2.0 的核心是,运用了浏览器原生支持的 WebDriver。
Selenium 1.0,又称 Selenium RC,其中 RC 是 Remote Control 的缩写。Selenium RC 利用的原理是:JavaScript 代码可以很方便地获取页面上的任何元素并执行各种操作。
Http Proxy 模块就是用来“欺骗”浏览器,要想在测试用例运行中的浏览器中,注入 JavaScript 代码从而实现自动化的 Web 操作,Selenium RC 就必须“欺骗”被测站点,让它误以为被注入的代码是同源的。
Selenium RC Server,主要包括 Selenium Core,Http Proxy 和 Launcher 三部分:
Selenium 2.0,又称 Selenium WebDriver,它利用的原理是:使用浏览器原生的 WebDriver 实现页面操作。
Selenium WebDriver 是典型的 Server-Client 模式,Server 端就是 Remote Server。以下是 Selenium 2.0 工作原理的解析。
“测试脚本和数据解耦”的本质是实现了数据驱动的测试,让操作相同但是数据不同的测试可以通过同一套自动化测试脚本来实现,只是在每次测试执行时提供不同的测试输入数据。
“页面对象模型”的核心理念是,以页面为单位来封装页面上的控件以及控件的部分操作。而测试用例使用页面对象来完成具体的界面操作。
测试脚本只有一份,其中需要输入数据的地方会用变量来代替,然后把测试输入数据单独放在一个文件中。这个存放测试输入数据的文件,通常是表格的形式,也就是最常见的 CSV 文件。
测试脚本中通过 data provider 去 CSV 文件中读取一行数据,赋值给相应的变量,执行测试用例。接着再去 CSV 文件中读取下一行数据,读取完所有的数据后,测试结束。CSV 文件中有几行数据,测试用例就会被执行几次。
以下图片也就是数据驱动(Data-driven)测试。
脚本通常是由一系列的页面控件的顺序操作组成的。
利用模块化思想,把一些通用的操作集合打包成一个个名字有意义的函数,然后 GUI 自动化脚本直接去调用这些操作函数来构成整个测试用例,这样 GUI 自动化测试脚本就从原本的“流水账”过渡到了“可重用脚本片段”。
但是,还存在问题:每个操作函数内部的脚本可读性问题依然存在,而且还引入了新的问题,即如何把控操作函数的粒度,以及如何衔接两个操作函数之间的页面。
因此,需要未解决这个问题,那就需要了解“页面对象模型”
页面对象模型的核心理念是,以页面(Web Page 或者 Native App Page)为单位来封装页面上的控件以及控件的部分操作。而测试用例,更确切地说是操作函数,基于页面封装对象来完成具体的界面操作,最典型的模式是“XXXPage.YYYComponent.ZZZOperation”。
业务流程抽象是,基于操作函数的更接近于实际业务的更高层次的抽象方式。基于业务流程抽象实现的测试用例往往具有较好的灵活性,可以根据实际测试需求方便地组装出各种测试用例。
业务流程的核心思想是,从业务的维度来指导测试业务流程的封装。由于业务流程封装通常很贴近实际业务,所以特别适用于组装面向终端用户的端到端(E2E)的系统功能测试用例,尤其适用于业务功能非常多,并且存在各种组合的 E2E 测试场景。
操作函数的粒度是指,一个操作函数到底应该包含多少操作步骤才是最合适的。
脚本粒度的控制往往以完成一个业务流程(business flow)为主线,抽象出其中的“高内聚低耦合”的操作步骤集合,操作函数就由这些操作步骤集合构成。
前序操作函数完成后的最后一个页面,必须是后续操作函数的第一个页面。
如果连续的两个操作函数之间无法用页面衔接,那就需要在两个操作函数之间加入额外的页面跳转代码。
业务流程抽象是,基于操作函数的更接近于实际业务的更高层次的抽象方式。基于业务流程抽象实现的测试用例往往灵活性会非常好,你可以很方便地组装出各种测试用例。
对于每一个业务流程类,都会有相应的业务流程输入参数类与之一一对应。具体的步骤通常有这么几步:
(执行业务流程实例的过程,其实就是调用操作函数来完成具体的页面对象操作的过程)
实际测试项目中,往往需要综合运用 API 调用和数据库操作来创建测试数据,并且会根据测试数据自身的特点,分而治之地采用 On-the-fly 和 Out-of-box 的方式,以寻求数据稳定性和数据准备效率之间的最佳平衡。
在实际项目中,对于创建数据的技术手段而言,最佳的选择是利用 API 来创建数据,只有当 API 不能满足数据创建的需求时,才会使用数据库操作的手段。
数据的创建和修改直接在产品代码内完成,而且并没有对外暴露供测试使用的接口,就需要通过直接操作数据库的方式来产生测试数据。
可以创建和修改 API 不支持的测试数据,并且由于是直接数据库操作,执行效率会远远高于 API 调用方法。
数据库操作这种方式的缺点也显而易见,数据库表操作的任何变更,都必须同步更新测试数据工具中的 SQL 语句。
但是,经常出现因为 SQL 语句更新不及时而导致测试数据错误的问题,而且这里的数据不准确往往只是局部错误,因此这类问题往往比较隐蔽。
因此,需要版本管理。
当你要创建一种特定的测试数据时,你发现没有直接 API 支持,但是可以通过 API 先创建一个基本的数据,然后再通过修改数据库的方式来更新这个数据,以此来达到创建特定测试数据的要求。
GUI 测试脚本中,在开始执行界面操作前,我们往往会通过调用测试数据工具实时创建测试数据,也就是 On-the-fly 方式。
Out-of-box 的含义是开箱即用,也就是说,已经在被测系统中预先创建好了充足的、典型的测试数据。这些数据通常是在搭建测试环境时通过数据库脚本“预埋”在系统中的,后续的测试用例可以直接使用。
页面对象自动生成技术,属于典型的“自动化你的自动化”的应用场景。它的基本思路是,你不用再手工维护 Page Class 了,只需要提供 Web 的 URL,它就会自动帮你生成这个页面上所有控件的定位信息,并自动生成 Page Class
注意点
那些依赖于数据的动态页面对象也会被包含在自动生成的 Page Class 里,而这种动态页面对象通常不应该包含在 Page Class 里,所以,往往需要以手工的方式删除。
GUI 测试数据自动生成,指的由机器自动生成测试用例的输入数据。
无头浏览器,其实是一个特殊的浏览器,你可以把它简单地想象成是运行在内存中的浏览器。它拥有完整的浏览器内核,包括 JavaScript 解析引擎、渲染引擎等。与普通浏览器最大的不同是,无头浏览器执行过程中看不到运行的界面,但是你依然可以用 GUI 测试框架的截图功能截取它执行中的页面。
不能完全模拟真实的用户行为,而且由于没有实际完成页面的渲染,所以不太适用于需要对于页面布局进行验证的场景。
同时,业界也一直缺乏理想的无头浏览器方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。