Rss订阅IQuickTest(关于如何订阅?)
作者:zzxxbb112
时间:2011/12/10 版权所有,侵权必究。
出处:http://blog.csdn.net/zzxxbb112
分类:QTP自动化设计模式(原创)
源码下载:http://download.csdn.net/source/1855793
摘要
本文主要介绍的是QTP的一种较为先进的技术,本技术是由AdvancedQTP SOLMAR自动化测试专家组所采纳的一种面向对象的设计模式,由Meir Bar-Tal于2008年12月20日发表,笔者将会详细介绍此设计模式的每个类以及方法,设计模式的使用,设计模式的优缺点。
此模式主要是把QTP描述性编程以及装载GUI对象的DICTIONARY对象通过业务驱动的方式来得到体现,最有价值的地方在于其对象识别的先发机制,可以有效的防止QTP在运行时识别对象出现卡住的现象,当对象出现不匹配时,能使测试顺利退出,并在报告中定位细节。有效的降低了测试的维护量并节省了自动化测试的时间。
介绍
自动化测试的核心问题就是如何减少维护量,例如:我们应该使用对象库还是描述性编程?如果选择OR那么我们可以在每个ACTION中使用共享对象库或者本地对象库,那如果选择DP,可以有什么方式来实现吗?
成本效益和可维护性是我们在做自动化测试中最为关注的,在此引出一个概念-GUI层扩展。这一概念经过的SOLMAR自动化专家组的分析和观察已被采纳,使用它就可以尽可能地提高代码重用性(通过使用面向对象的方法来提高效率,并分解出若干个抽象层且可维护性较高的自动化项目)。
层的概念
我们前面已经提到了GUI层,那层的作用是什么呢?这里先简单解释一下,层可以使重用化发挥到最大极限,定义一个类(封装一个图形用户界面层)通过相应的接口来控制应用程序GUI界面中的测试对象,从而把这个类称之为GUI层。
封装测试对象类
为了能够使大家更加容易理解此设计模式,我在这里重新修改了原文中层的方法和对象,这里就通过把百度搜索页封装成GUI层作为一个最简单的例子来讲解,代码如下:
Class BaiduSearch
Private m_htChildObjects '定义变量作为Scripting.Dictionary
'***************为变量设置GET SET 方法***************
Public Property Get ChildObjects()
Set ChildObjects = m_htChildObjects
End Property
Public Property Let ChildObjects(ByRef dic)
Set m_htChildObjects = dic
End Property
'*************初始化GUI界面上的测试对象**************
Public Function Init()
ChildObjects = CreateObject("Scripting.Dictionary")
With ChildObjects
.Add "Browser", Browser("name:=百度一下,你就知道")
.Add "Page", ChildObjects.item("Browser").Page("title:=百度一下,你就知道")
.Add "SearchContent", ChildObjects.item("Page").WebEdit("html id:=k")
.Add "Submit", ChildObjects.item("Page").WebButton("value:=百度一下")
End With
Init = IsContextLoaded(ChildObjects)
End Function
'**********业务行为函数 - 百度输入搜索内容***********
Public Function SetSearchContent()
ChildObjects.item("SearchContent").Set "zzxxbb112"
End Function
'**********业务行为函数 - 百度点击搜索***************
Public Function Submit()
ChildObjects.item("Submit").Click
End Function
End Class
首先看最外层的BaiduSearch类它代表着一个百度的GUI层,我们在类中定义了一个Scripting.Dictionary对象并且为其设置GET/LET方法,接着是一个初始化的函数Init这个函数主要的作用是把页面上下的所有对象全部封装在一个Scripting.Dictionary容器对象中,并通过描述性编程结合迭代式的对象封装有效的提高了代码的重用性,最后还有两个业务行为函数,一个是在文本框中输入搜索内容的行为,另一个是点击搜索按钮行为,这两个函数都是可以直接在字典对象中进行搜索关键字来定位对象的,并针对对象进行操作来达成关键字字典对象驱动。。这样一个百度的GUI层就已经封装好了,并且这个类还具备了两种业务行为的接口。
接下来来看另一个重要的函数,大家应该知道当QTP在运行时,测试对象一旦发生变化,与对象库中的对象无法匹配时QTP就会卡住直到超时,然后弹出错误框,在QC里执行也是一样,只是没有了错误框,这样的情况会导致在自动化测试中浪费很多无谓的时间,因此我们在GUI层中的INIT函数的最后加入了IsContextLoaded函数,此函数的作用就是在检查GUI层中所有对象的是否已经存在并且把结果进行返回。
Public Function IsContextLoaded(ByRef htContext)
Dim allExist, ix, aItems, aKeys, strDetails, strAdditionalRemarks
allExist = True
aItems = htContext.Items
aKeys = htContext.Keys
For ix = 0 To htContext.Count-1
IsContextLoaded = aItems(ix).Exist(0)
strDetails = strDetails & vbNewLine & "Object #" & ix+1 & ": '" & akeys(ix) & "' was"
If IsContextLoaded Then
strDetails = strDetails & ""
strAdditionalRemarks = ""
Else
strDetails = strDetails & " not"
strAdditionalRemarks = " Please check the object properties"
allExist = False
End If
IsContextLoaded = IsContextLoaded And allExist
Select Case IsContextLoaded
Case True intStatus = micPass
Case False intStatus = micWarning
End Select
strDetails = strDetails & " found." & strAdditionalRemarks
Next
Reporter.ReportEvent intStatus, "IsContextLoaded", strDetails
End Function
由于QTP是不提供从外部文件中读取类的方法,因此我们在这里添加一个创建类的函数,接着我们的外部文件就已经封装好了,直接保存为*.vbs后就可以为QTP服务了。
Public Function CreateLogin()
Dim objLogin
Set objLogin = New BaiduSearch
Set CreateLogin = objLogin
End Function
调用业务行为
在QTP中加载之前保存的VBS文件后,在专家视图中输入以下脚本,就可以完成业务行为的调用了。
当脚本执行完毕后,会在结果报告中显示对象的存在与否,如果在运行时出现某个对象不能识别,或者说出现属性不匹配的情况,QTP就会立刻退出,并在结果报告中显示不匹配的那个对象来方便我们的定位,这其实也是本设计模式的一个比较明显的优势。
对象识别全部通过的结果图
个别对象识别未通过的结果图
通过上图我们可以看到当对象出现不匹配时,我们可以很容易的在结果报告中进行定位。
总结
优点:
- 高效的重用化有效的减少了代码的维护量
- 关键字字典驱动有效的提高了编码的效率
- GUI层提供的行为函数接口使脚本与业务能够更好的关联起来
- 对象检查的先发机制可以有效的防止QTP卡住的现象
- 对不匹配的对象能够在结果报告中自动定位
缺点:
- 由于QTP缺少类这一功能的提示,因此脚本编写没有了代码提示功能
- 前期工作量较多,比较适合大型的自动化测试项目
- 需要有一定的编码能力
参考文献:
《Implementing a GUI Layer with Classes》 December 20th, 2008 by Meir Bar-Tal