美文网首页
自动化测试原理

自动化测试原理

作者: robot_test_boy | 来源:发表于2020-06-25 15:40 被阅读0次

自动化测试的实现原理,针对不同的类型(静态测试和动态测试)来区别对待。动态测试的自动化实现主要通过特定的程序来模拟软件的操作过程或操作行为,然后对软件所做出的反应或输出结果进行检查或验证。而静态测试的自动化实现,是按照代码规范和软件开发的最佳实践建立各种代码规则,然后依据这些规则对代码进行自动扫描,发现和规则不匹配的各种问题。

动态测试,关键是3点,即识别测试的对象、模拟操作和对结果进行验证:

1) 识别对象,包括调用Windows API来识别GUI对象,以及使用其他工具(IE DOM  Inspector和Firebug )来识别Web的DOM对象;

2) 通过测试脚本来模拟操作,能捕获鼠标和键盘的操作,或者通过调用API来直接操作所识别的对象;

3) 通过自动比较技术,验证实际获得的测试结果和事先定义的期望结果是否一致。如果不一致,将记录所执行的具体日志(log),报告错误。比较技术包括静态比较和动态比较、简单比较和复杂比较、敏感性测试比较和健壮性测试比较、比较过滤器等。

GUI对象的识别

功能测试工具须要和用户界面打交道,就要能操作、控制用户界面上的各种对象,所以大部分功能测试工具是基于GUI对象识别技术来实现自动化测试的。

基于GUI对象识别和控制的自动化测试工具,一般在脚本语言中采用Windows  API (Application Programming Interface,应用程序编程接口)函数调用的方法来实现。Windows API涵盖了系统的管理、诊断、图形和多媒体、网络、安全性等各个方面,但在自动化测试工具中或对象识别中,主要使用Windows User Interface (用户界面)一类的API。这类函数封装了操作应用软件所需的接口函数,包括键盘和鼠标操作的捕获,以及窗口、按钮、选择项等的识别和操作。

除了Windows API函数调用方法之外,还有其他的一些技术可以采用,如反射机制(Reflection)。通过反射来加载被测试程序,获取被测试程序的各种属性,触发被测试程序的各种事件,从而达到自动化测试的目的。

DOM对象识别(Web浏览器操作)

有些测试工具(如Selenium、Watir等)直接访问Web浏览器,利用脚本语言操纵浏览器和Web页面,这时就须要对DOM(Document  Object Model,文档对象模型)对象进行识别,从而模拟用户控制浏览器中页面元素的操作。也只有获取DOM对象的属性,才可以验证页面实际的表现,即确定实际结果和期望结果是否一致。

根据W3C DOM规范http://www.w3.org/DOM,DOM定义了HTML的标准对象集合,是HTML文档的编程接口,与浏览器、平台、语言无关。DOM也就是定义了标准的访问和操纵HTML对象的方式,使得其他程序或软件可以访问页面的标准组件。DOM解决了不同浏览器使用Javascript的不一致性,为web开发和测试建立了一个数据、脚本和表现层对象交换的标准。DOM以层次结构组织节点、内容等相关信息,从而将一个web页面转换为一个基于树或基于对象的多层次集合。

最好用的DOM识别工具是Firebug(注意和静态测试工具Findbugs的区分),我们可从http://getfirebug.com/下载。

Firebug以JavaScript文件(Firebug Lite -  firebug-lite-compressedjs)方式支持在Internet Explorer、Opera和Safari等浏览器中运行,但推荐作为Firefox的一个插件使用更好。Firebug功能更强大,集HTML查看和编辑、Javascript控制台、CSS/script/DOM查看器、网络状况监视器、测试于一体,从各个不同的角度剖析Web页面内部的细节层面。

打开Firefox工具下的Firebug后,在浏览器载入任何页面时,Firebug都可以生成DOM树。点击HTML标签,鼠标只要停在某个对象上面,浏览器页面上相应的对象就会被明显标识出来。当鼠标停在“<img id=’lg’ height =’129’ … > ”时,就可以看到页面上“百度”图标被标识出来。

点击DOM标签,可以更详细地了解页面的DOM结构及其元素,如下图所示。层次结构清楚,可以获得各种文档对象元素的信息,如URL、applet、属性(attributes)、背景颜色(bkcolor)等,而且这些信息用不同的颜色标识,关键参数的值都用红颜色显示,然后,逐项展开其子节点(childnodes)、子节点的子节点等。

测试脚本技术

脚本是一组测试工具执行的指令集合,也是计算机程序的一种形式。脚本可以通过录制测试的操作产生,然后再做修改,这样可以减少脚本编写的工作量。当然,也可以在编辑器中直接编写脚本。

自动化测试脚本和程序代码比较接近,包含指令和数据,还包括其他内容:

1) 同步,何时进行下一个输入;

2) 比较信息,是测试验证点所需要的,包括比较什么、如何比较及和谁比较;

3) 捕获何种屏幕数据及存储在何处;

4) 从何处读取测试数据;

5) 控制信息等。

脚本的技术围绕着脚本结构设计、如何有效地实现测试用例描述的测试规程,在建立脚本的代价和维护脚本的代价中获得平衡,并从中获得最大收益

脚本可以分为线性脚本、结构化脚本、数据驱动脚本和关键字驱动脚本线性脚本是最简单的脚本,如同流水账那样描述测试过程,一般由自动录制得来;而结构化脚本是对线性脚本的加工,类似于结构化设计的程序,是脚本优化的必然途径之一。而数据驱动脚本和关键字驱动脚本可以进一步提高脚本编写的效率,极大地降低脚本维护的工作量。目前大多数测试工具都支持数据驱动脚本和关键字驱动脚本。

1. 结构化脚本

结构化脚本(Test Script Modularity),类似于结构化设计的程序,具有各种逻辑结构,包括选择性结构、分支结构、循环迭代结构,而且具有函数调用功能,允许脚本之间相互调用。这样,可以进一步构造脚本库或常用的脚本基础模块,供上层脚本调用。结构化脚本具有很好的可重用性、灵活性,所以结构化脚本易于维护。

结构化脚本还可以发展为基于库架构(Library Architecture),即最底层的脚本成为库函数,供上层脚本调用。

2. 关键字驱动脚本

关键字驱动脚本(Keyword-Driven or Table-Driven Testing script),实际上封装了各种基本的操作,每个操作由相应的函数实现,而在开发脚本时,不须要关心这些基础函数,直接使用已定义好的关键字,这样的好处是脚本编写的效率会有很大的提高,脚本维护起来也很容易。而且,关键字驱动脚本构成简单,脚本开发按关键字来处理,可以看作是业务逻辑的文字描述,每一个测试人员都能开发,这就能做到“全民皆兵”——每个测试人员都可以进行自动化测试的工作。

关键字的层次处在合适的水平,既不要关注细节,也不能过高。如果关键字过于复杂,包罗万象,就不够灵活,甚至无法适应业务逻辑的变化,反而给脚本维护带来巨大的工作量。关键字及其说明如表:

3. 数据驱动脚本

数据驱动脚本将测试脚本(执行步骤)和数据进行分离,将测试输入数据存储在独立的文件或数据库中,而不是直接存储在脚本中。在脚本中引入变量,通过变量来引用数据,脚本本身描述测试的具体执行过程。当应用功能变动时,只须要修改业务功能部分的脚本,有利于脚本的维护。针对某些功能测试时,操作步骤是一样的,而输入数据是不一样的,相当于一个测试用例对应一种输入组合,这时候,是数据驱动脚本最能发挥效益的地方,同一个脚本可以针对不同的输入数据来进行测试,提高了脚本的使用效率和可维护性。

在实际测试当中,这种情况很多,例如用户登录的功能测试中,“用户名、口令”就是输入数据,测试时要对不同的情形分别测试,如用户名为空、口令为空、大小写是否区分、是否允许特殊字符等。更理想的数据驱动脚本,可以控制测试的工作量,即控制业务操作过程,真正地由数据来驱动测试,使自动化测试具有一定的智能性。关键字驱动脚本控制单个具体的“动作”,而数据驱动控制“过程”,即业务层次上的操作。

自动比较技术

没有验证点的自动化测试就不能被称为测试,验证某个测试用例的结果,实质上就是将实际结果(输出)与期望结果进行比较。自动化测试时,预期输出是事先定义的,要么插入脚本中或记录在数据库、数据文件中,然后在测试过程中运行脚本,将捕获的结果和预期的输出进行比较,从而确定测试用例是否通过。

自动比较有两类模式:验证(Verify)和断言(Assert)。它们所具有的功能(命令)是非常相近的,只是对验证结果的处理不一样。当Assert失败时,则退出当前测试;而当Verify失败时,测试会继续运行。

用于自动比较的命令,Selenium就有几十个

assertTitle(titlePattern) 检查当前页面的title是否正确;

assertValue(inputLocator, valuePattern) 检查input的值;

assertSelected (selectLocator, optionSpecifier) 检查下拉菜单中选项是否匹配;

assertText (elementLocator,textPattern) 检查指定元素的文本;

assertTextPresent(text) 检查当前页面上是否出现指定的文本;

assertAttribute(.{}elementLocator@attributeName.{}, ValuePattern) 检查当前指定元素的属性值;

assertTable(cellAddress, valuePattern) 检查table里某个cell的值;

assertVisible(elementLocator) 检查指定的元素是否可视;

assertEditable(inputLocator) 检查指定的input是否可以编辑;

assertAlert(messagePattern) 检查JavaScript是否产生指定message的警告对话框;

assertPrompt(messagePattern) 检查JavaScript是否产生指定message的提示对话框。

自动比较可以对比分析屏幕或屏幕区域图像、比较窗口或窗口上控件的数据或属性、比较网页、比较文件等。

图片或自绘窗口特效的验证是自动化测试中的一个难点。虽然有些自动化测试工具提供了验证图片的功能,但是稳定性都不是很好。一般图片验证原理是首先截取并保存正确的图片,然后将脚本运行时截取的图片与保存的图片进行比较。由于这种比较是在像素级上进行的,极微小的差异都会被认为是不同的,这可能导致同样的脚本在不同物理机器(显卡、操作系统等不同)上运行时,常常会因为显示上的微小差异而导致检查结果失败,但用户是可以接受的。

有的测试工具可以设定阈值,允许存在微小的差异,高于阈值的,被认为“差异明显存在”,认定验证失败;而低于或等于阈值的差异将被忽视,认定验证通过。这样,测试结果会比较稳定、可靠。如果阈值可以根据实际情况或用户的特定要求进行自动调整,那么比较技术就具有一定的智能性,这种自动比较技术,可以称“智能比较”。

当然,为了确认数据的正确性或为了使结果具有良好的可靠性,须要精心设计,自动产生所需的测试数据,从而根据预先准备的测试数据,采用另外一种方法来获得期望的结果 ,然后与实际测试结果进行比较。

整篇摘取自朱少民老师的《轻轻松松自动化测试》

相关文章

网友评论

      本文标题:自动化测试原理

      本文链接:https://www.haomeiwen.com/subject/dnqkfktx.html