1. 概述
本文针对QTP提供的运行时错误处理机制进行详细描述。内容包括各种错误处理方式的功能的介绍,各种机制的作用范围的分析,以及错误处理机制同时作用时的优先级别的分析。
2. 三种错误处理方式介绍
Quick Test Professional 中有三种错误处理机制,在这里定义为:
全局错误响应: Test Setting 中Run 设置
VBScript On Error 错误处理: On Error Resume Next
错误恢复场景: Recovery Scenarios
2.1 全局错误响应
全局错误响应在Test Setting 的Run 选项中进行设置:【File】—>【Settings】—>【Run】—>【When error occurs during run session】
QTP四种全局错误响应设置选项如下:
pop up message box: Quick Test 在出现错误时显示一个错误消息对话框
process to next action iteration:Quick Test 出现错误时继续下一个Action 循环
stop run: Quick Test 在出现错误时停止测试
process to next step:Quick Test 在出现错误时跳过错误语句,继续下一步骤
全局错误响应是QTP 的系统缺省错误处理,就是说当没有使用其他错误处理方式时,系统会自动调用在这里指定的方式进行错误处理
2.2 VBScript 的On Error 错误处理方式
由于QTP 使用了VBScript 作为脚本语言,自然地,VBScrip 的错误处理方式在QTP 中都适用。在VBScript中,与错误处理相关的三者为:
On Error Resume Next 语句
On Error GoTo 0 语句
Err 对象
2.2.1 On Error Resume Next
一旦这个语句已被处理,脚本引擎将继续运行后面的程序,而不理会已经发现的任何错误。
2.2.2 On Error GoTo 0
使用On Error Goto 0 语句恢复缺省的错误处理行为。在运行这个语句后,发生的运行期错误将导致缺省错误处理。在QTP 中,缺省错误处理就是全局错误响应。
2.2.3 Err 对象
Err 对象重要的属性有三个:Number, Source, Description,分别是错误号,错误来源,错误描述.Err 对象会在运行时错误发生的时候赋予新的值,旧的值会被舍弃。Err 对象不会受到函数调用的影响,它完全是全局的。Err 对象可以用Clear 方法清空,任何时候调用On Error Resume Next 或者On Error GoTo 0 的时候,都会清空Err 对象。
2.3 恢复场景Recovery Scenarios
Resources_Recovery Scenarios Manager…可以创建恢复场景。具体请参考帮助文档,这里只是说明对于运行错误的处理。在恢复场景中触发事件TriggerEvent 中的一个选项是Test Run Error,表示在运行过程中遇到错误时所采取的恢复处理方式。我们看一看下面对哪几种错误进行恢复处理,即错误恢复的触发条件:
Any Error Item in list or menu is not unique Item in list or menu not found More than one object responds to the physical description Object is disable Object not found Object not visible |
恢复处理(Recovery Operation)有以下几种方式:
Keyboard or mouse operation Close application process Function call Restart Microsoft Windows |
从恢复场景的触发条件可以看出,所有错误处理都是针对测试对象发生的错误而言的(Any Error 指列表中所有的其他错误类型),它并不处理被零除、非法赋值,内存分配错误等等VBScript 的运行时错误。这是和其它两种错误处理方式不同之处。为了说明这一点,我们不妨再看看Recovery Operation 中OperationType 如果选择Function Call,函数原型定义如下所示,所有的函数参数都必须包含有被测对象,触发函数必须遵循原型定义,否则函数无法执行。
再来看错误恢复的后处理方式(Post-Recovery Test Run Options)有以下几种:
Repeat current step and continue Proceed to next step Proceed to next action or component iteration Proceed to next test iteration Restart current test run Stop the test run |
我们看到Proceed to next step/ Proceed to next action or component iteration/ Stop the test run这三种方式在全局错误处响应理方式中也是存在的,Proceed to next step 这种方式更是和On ErrorResume Next 处理方式也是相同的。稍后会就此作进一步叙述。
3. 三种错误处理方式的作用域
本节阐述三种错误处理方式的作用范围,为了方便比较说明,这里假设三种错误处理方式为:
· 全局错误响应: Process to next step
· VBScript 错误处理: On Error Resume Next
· 错误恢复后处理方式: Proceed to next step
因为这三种处理方式效果一样,以后没有特殊说明,都采用以上设置,可以方便比较
3.1 全局错误响应
原则: 对该test 中的所有Action 均生效。也就是说在Action 里没有其他错误处理方式的时候,脚本运行过程中遇到的错误都会按照全局错误响应的设置进行处理
3.1.1 对 Action 中直接定义的函数:
对所有函数生效。如下例,如果全局错误响应设置成process to next step 函数testA 中的被零除语句 i=1/0 会跳过,三个msgbox 均可以执行。错误代码会逐级返回。
3.1.2 对用ExecuteFile 引入的函数:
与Action 中直接定义的函数处理方式完全一样
3.1.3 对于Function Library 中定义的函数
与Action 中直接定义的函数处理方式基本一致,对所有函数生效。但不同的是,对于错误代码,只能在Function Library 中传递,而不会传递到Action 中来。
3.1.4 对于Action 的嵌套调用
如之前所述,对Test 中的所有Action 均生效,自然嵌套调用的Action 也不例外。同Function Library一样,错误码只能在Action 内部传递,也就是说被调用Action 中产生的错误码不能传递到调用Action 中去。
3.2 VBScript 的On Error 错误处理方式
原则: 只对语句所在函数或Action 中该语句之后的代码生效,对子函数,调用Action 均无效。
3.2.1 对 Action 中直接定义的函数:
函数中错误抛出,不会继续执行错误代码。一个错误在函数/子程序中出现时,如果没有运行On Error Resume Next 语句,那么错误将被交给调用它的环境,这个过程一直重复到找到运行On Error Resume Next 语句的环境继续运行,或者找到缺省的脚本错误处理器。
3.2.2 对用ExecuteFile 引入的函数:
与对Action 中直接定义的函数的处理完全一致
3.2.3 对于Function Library 中定义的函数
Function Library 中定义的函数遇到错误抛出,执行系统缺省错误处理
3.2.4 对于Action 的嵌套调用
被调用Action 中的语句遇到错误抛出,执行系统缺省错误处理
3.3 错误恢复场景 Recovery Scenarios
原则: 任何函数调用和Action 中,只要满足触发条件,就会触发错误恢复处理和后处理
前面讲过,错误恢复场景的触发条件是以下6 种
Item in list or menu is not unique Item in list or menu not found More than one object responds to the physical description Object is disable Object not found Object not visible |
对于VBScript 的其他运行时错误,并不会触发错误恢复场景,当然也不存在错误恢复处理及后处理。但一旦在任何函数或者action 中满足触发条件,都会进行错误恢复处理及后处理,也就是说,其作用范围为所有Action 和函数/子程序中。当错误恢复完成后(包括错误处理及后处理),错误会被清0。如果错误恢复的后处理方式为Proceed to next step,处理完成后再次碰到VBScript 错误时如何处理呢?如新产生错误并不能满足触发条件,则原错误恢复中设置后处理方式不会继续生效,此时会遵循缺省错误响应或其他指定的错误处理。值得注意的是,如果错误恢复的后处理方式为Repeat current step and continue 或者Restart currenttest run,再次运行到该语句仍重复同样的错误,可能会导致死循环。
4. 三种错误处理方式的优先级别
错误恢复场景中的错误处理优先级最高 (Recovery Operation)
On Error Resume Next 优先级次之
错误恢复场景中的后处理方式优先级别再次之 (Post-Recovery Test Run Options)
缺省错误响应优先级别最低
也就是说,只要满足恢复场景的触发条件,就会进行错误恢复处理(Recovery Operation)。但是其后处理方式的优先级别和错误恢复处理的优先级别是不同的。如果触发错误恢复处理的语句之前有On ErrorResume Next,就不会执行错误恢复后处理中所定义的处理方式。当没有找到以上任何错误处理方式的定义时,才执行缺省错误处理。
注意: On Error GoTo 0 其实就是指采用缺省错误处理,不可和On Error Resume Next 处理的优先级别等同起来。
5. 自动化框架测试与实践
5.1错误处理模式三种测试设计技术
为了解决传统错误处理模式的不足,现在错误处理的技术往往采取如下的手段。
图片处理技术
伪视频技术
视频技术
5.1.1图片处理技术
图片处理技术主要是基于原先的图片截图上进行扩展的,只要的目的是采取简便的方式来展示错误信息的显示,一般的操作过程如下:
出现错误的时候开始截屏
记录错误的控件的位置
在图片上标示控件
在控件附近标示错误的信息
这样设计的目的就是希望方便测试人员或者开发人员能够很方便的了解导致程序出错的过程,接下来我会针对图片处理技术来进行实践。
5.1.2伪视频技术
伪视频的技术是为了展现因为测试过程而导致出现错误的现象。它所实现的过程是采取对每个操作过程的截屏,然后生成Gif格式的文件,类似一个动画的效果。伪视频的技术操作过程如下:
自动化测试脚本在运行之初,初始化一段缓冲区来保存即将捕获的截图
自动化测试脚本按照顺序进行逻辑顺序执行
“伪视频程序”也在按照一定的频率进行截图处理,并把图片保存在缓冲区
如果缓冲区达到最大容量,尽早的截图将会被新的图片代替
一旦错误出现,自动化脚本通知“伪视频程序”,“伪视频程序”将手机缓冲区的截图,然后形成动态图片
脚本运行停止
5.1.3视频技术
这是个真正的屏幕录制技术,采取的是自动化测试执行与屏幕录制平台操作的过程, 来录制自动化测试的一个过程。但是这个技术最大的问题在于,需要的空间比较大,如果空间小的话,就将会导致出错的过程难以有效地展现.
最新内容请见作者的GitHub页:http://qaseven.github.io/