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
接下来来看另一个重要的函数,大家应该知道当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
Public Function CreateLogin()
Dim objLogin
Set objLogin = New BaiduSearch
Set CreateLogin = objLogin
End Function
调用业务行为
在QTP中加载之前保存的VBS文件后,在专家视图中输入以下脚本,就可以完成业务行为的调用了。
当脚本执行完毕后,会在结果报告中显示对象的存在与否,如果在运行时出现某个对象不能识别,或者说出现属性不匹配的情况,QTP就会立刻退出,并在结果报告中显示不匹配的那个对象来方便我们的定位,这其实也是本设计模式的一个比较明显的优势。
对象识别全部通过的结果图
个别对象识别未通过的结果图
通过上图我们可以看到当对象出现不匹配时,我们可以很容易的在结果报告中进行定位。
总结
优点:
缺点:
参考文献:
《Implementing a GUI Layer with Classes》 December 20th, 2008 by Meir Bar-Tal