测试自动化设计 - GUI层面向对象的扩展设计
作者:zzxxbb112
时间:2011/12/10 版权所有,侵权必究。
出处:http://blog.csdn.net/zzxxbb112
源码下载: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 方法***************
- PublicPropertyGet ChildObjects()
- Set ChildObjects = m_htChildObjects
- EndProperty
- PublicPropertyLet ChildObjects(ByRef dic)
- Set m_htChildObjects = dic
- EndProperty
- '*************初始化GUI界面上的测试对象**************
- PublicFunction 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:=百度一下")
- EndWith
- Init = IsContextLoaded(ChildObjects)
- EndFunction
- '**********业务行为函数 - 百度输入搜索内容***********
- PublicFunction SetSearchContent()
- ChildObjects.item("SearchContent").Set"zzxxbb112"
- EndFunction
- '**********业务行为函数 - 百度点击搜索***************
- PublicFunction Submit()
- ChildObjects.item("Submit").Click
- EndFunction
- EndClass
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层中所有对象的是否已经存在并且把结果进行返回。
- PublicFunction 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
- EndIf
- IsContextLoaded = IsContextLoaded And allExist
- SelectCase IsContextLoaded
- CaseTrue intStatus = micPass
- CaseFalse intStatus = micWarning
- EndSelect
- strDetails = strDetails & " found." & strAdditionalRemarks
- Next
- Reporter.ReportEvent intStatus, "IsContextLoaded", strDetails
- EndFunction
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服务了。
- PublicFunction CreateLogin()
- Dim objLogin
- Set objLogin = New BaiduSearch
- Set CreateLogin = objLogin
- EndFunction
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
- 下一篇:QTP的对象封装与运作原理
相关推荐
GUI层的面向对象扩展设计是软件开发中一种重要的技术实践,尤其在自动化测试领域,如QuickTest Professional(QTP)中应用广泛。QTP是一种功能强大的自动化测试工具,主要用于测试图形用户界面(GUI)的应用程序。它...
- **GUI层面向对象的高级扩展设计**:探讨如何通过面向对象的方法对GUI层进行高级扩展设计。 - **自动化测试框架设计思维模式**:讲解自动化测试框架的设计原则和最佳实践。 #### 四、总结 本次自动化测试培训旨在...
Java面向对象程序设计是编程的核心概念,它基于类和对象,强调封装、继承和多态等特性。在Java中,类是对象的蓝图,而对象是类的实例。本章主要探讨了Java语言中关于面向对象的一些关键概念,包括类的方法、封装与...
Objective-C的面向对象特性使其成为开发图形用户界面(GUI)应用的理想选择。 #### 二、面向对象编程(OOP)在Objective-C中的体现 面向对象编程的核心概念包括封装、继承和多态,这些在Objective-C中都有明确的...
Java 主要面向使用 Java 开发的产品的测试,TCL 是老牌的自动化测试语言,但它在设计之初并不支持面向对象的设计方法。Perl 语言在设计之初也不支持面向对象,Python 是一个 moderne、面向对象的脚本语言,Ruby 是...
- **面向对象支持**:虽然TCL本身不直接支持面向对象编程,但可以通过TCL/TK库来实现面向对象的设计。 **2. TCL在自动化测试中的优势** - **快速原型设计**:TCL的脚本性质使其非常适合快速构建测试用例和原型系统...
Spring框架是Java开发中的核心组件,它主要用于构建后端服务,但通过扩展,Spring也可以用于创建...通过研究这些示例,开发者可以理解如何在Spring上下文中设计、实现和测试GUI组件,提升其在桌面应用开发领域的技能。
1.1 自动化测试从零开始 ...5.2 GUI层面向对象的扩展设计 6.1 框架设计理念 6.2 框架设计平台 6.3公共对象管理 6.4 用例设计管理 6.5 公共函数工厂 6.6 测试执行管理 6.7 测试报表管理 6.8 一点写给读者的话语(总结)
【VC++ 面向对象与可视化程序设计】是由黄维通教授主讲的一门课程,专注于使用Visual C++进行程序开发。Visual C++是Microsoft公司推出的一种在Windows环境下进行C++应用程序开发的重要集成开发环境(IDE),尤其...
在本篇C++面向对象课程设计报告中,我们将深入探讨C++编程语言的核心特性——面向对象编程(OOP)。C++是一种多范式语言,它不仅支持过程化编程,更以其强大的面向对象特性而闻名。面向对象编程是现代软件开发中的...
《Visual C++面向对象与可视化程序设计(第2版)》是一本深入讲解使用Microsoft的Visual C++开发面向对象及可视化应用的专业教程。该书针对第二版进行了更新和完善,旨在帮助读者掌握C++语言的核心特性,同时充分...
inForm Control are abstracted into a ComponentGUI structure, which ...随着Windows应用程序开发的持续发展,面向WinForm Control的自动化测试框架将会扮演越来越重要的角色,为开发者提供更强大、灵活的测试支持。
这些框架通常采用面向对象的设计,提供层次化的视图、控制器和模型结构,便于代码组织和管理。 面向对象的GUI模式主要包括以下几种: 1. 观察者模式(Observer Pattern):GUI组件作为观察者,监听数据模型的变化...
- **Visual Basic**: 针对Windows环境设计,支持图形用户界面(GUI)开发,是面向对象的、事件驱动的高级语言。 - **Pascal**: 结构化的高级语言,广泛用于教学。 - **C**: 一种通用的、过程式的编程语言,被广泛...
总之,这个"工作项目-圣诞小游戏-扩展:一个可以实现自动打游戏的Java程序"是一个综合性的学习资源,涵盖了Java GUI编程、游戏开发基础、自动化控制等多个知识点。无论是对Java初学者还是有经验的开发者来说,都能...
【White自动化UI测试框架源代码】是一个用于进行GUI自动化测试的开源工具,尤其适用于Windows桌面应用程序。这个框架设计得非常灵活,提供了面向对象的API,使得开发者能够方便地对应用程序的用户界面进行精确控制和...
本章节主要涵盖了五个关键知识点:客户/服务器体系结构测试、图形用户界面测试、实时系统测试、面向对象软件的测试以及Web应用程序的压力测试。 1. **客户/服务器体系结构测试**: - **测试方法**:测试通常分为三...