`
peizhiinfo
  • 浏览: 1421569 次
文章分类
社区版块
存档分类
最新评论

测试自动化设计 - GUI层面向对象的扩展设计

 
阅读更多

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文件后,在专家视图中输入以下脚本,就可以完成业务行为的调用了。

clip_image008

当脚本执行完毕后,会在结果报告中显示对象的存在与否,如果在运行时出现某个对象不能识别,或者说出现属性不匹配的情况,QTP就会立刻退出,并在结果报告中显示不匹配的那个对象来方便我们的定位,这其实也是本设计模式的一个比较明显的优势。

对象识别全部通过的结果图

clip_image010

个别对象识别未通过的结果图

clip_image012

通过上图我们可以看到当对象出现不匹配时,我们可以很容易的在结果报告中进行定位。

总结

优点:

  • 高效的重用化有效的减少了代码的维护量
  • 关键字字典驱动有效的提高了编码的效率
  • GUI层提供的行为函数接口使脚本与业务能够更好的关联起来
  • 对象检查的先发机制可以有效的防止QTP卡住的现象
  • 对不匹配的对象能够在结果报告中自动定位

缺点:

  • 由于QTP缺少类这一功能的提示,因此脚本编写没有了代码提示功能
  • 前期工作量较多,比较适合大型的自动化测试项目
  • 需要有一定的编码能力

参考文献:

《Implementing a GUI Layer with Classes》 December 20th, 2008 by Meir Bar-Tal

分享到:
评论

相关推荐

    精通QTP——自动化测试技术领航

    1.1 自动化测试从零开始 ...5.2 GUI层面向对象的扩展设计 6.1 框架设计理念 6.2 框架设计平台 6.3公共对象管理 6.4 用例设计管理 6.5 公共函数工厂 6.6 测试执行管理 6.7 测试报表管理 6.8 一点写给读者的话语(总结)

    基于JAVA实现的理财小助手要求有用户登录等 GUI 界面,用户数据存在数据库里,并体现面向对象编程的能力

    用面向对象的编程方法(OOP)和ADO数据库访问技术,其开发主要包括后台数据库的建立、维护以及前端应用程序开发,通过JAVA和数据库 相结合,实现了大学生理财的自动化和信息化。 3.1、性能需求 为了保证系统能够长期、...

    新版Android开发教程.rar

    � 暂不具备 Push Mail 和 Office(DataViz 、 QuickOffice 计划近期推出 ) 功能,目前主要面向的是普通消费 者 用户,对商业用户支持尚弱。 Android Android Android Android 带来的影响 ANDROID 的推出后可能影响的...

    JAVA GUI 图书馆管理系统.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    领域驱动设计与模式实战

    3.2.4 用测试桩替换协作对象 3.2.5 用模拟对象替换协作对象 3.2.6 设计含义 3.2.7 结论 3.2.8 更多信息 3.3 重构 3.4 小结 第二部分 应用DDD 第4章 新的默认架构 4.1 新的默认架构的基础知识 4.1.1 从以数据库为...

    软件工程知识点

    结构化设计中的函数、过程,面向对象设计中的类、对象,它们都是模块。概要设计时并不需要说明模块的内部细节,但是需要进行全部的有关它们构造的定义,包括功能特征、数据特征和接口等。 在进行概要设计时,模块的...

    matlab如何敲代码-ivis:Matlab实时眼动追踪工具箱,用于凝视特遣队设计

    该工具包以面向对象的风格编写,因此应该易于扩展/开发,并且包含了各种“专业”功能,例如doxygen文档和单元测试。 快速入门:设置 下载工具包(例如,通过单击“克隆或下载”按钮) 将其解压缩到适当的目录(例如C...

    Python Cookbook

    16.11 自动化py2exe将脚本编译成Windows可执行文件的过程 585 16.12 在UNIX中将主脚本和模块绑成一个可执行文件 587 第17章 扩展和嵌入 590 引言 590 17.1 实现一个简单的扩展类型 592 17.2 用Pyrex实现一个...

    Python核心编程第二版

     1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展   1.3.5 可移植性   1.3.6 易学   1.3.7 易读   1.3.8 易维护   1.3.9 健壮性   1.3.10 高效的快速原型开发工具   1.3.11 内存管理器...

    java开源包1

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    p2p_node_server:这是用Node.Js编写的P2P服务器解决方案。 无需数据库服务器或内存缓存服务器。 对等连接在一起,并自动扩展其自身集群中的任何服务

    只能使用此软件制作云,并且所有内容都应该自动化。 我们使用DataCenter ID来确定对等方位于何处。 这样,我们可以轻松地在对等方关闭时重新启动服务,或者在速度变慢时改进任何服务。 用户可以自行托管它们,...

    java开源包10

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    Python核心编程第二版(ok)

     1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展   1.3.5 可移植性   1.3.6 易学   1.3.7 易读   1.3.8 易维护   1.3.9 健壮性   1.3.10 高效的快速原型开发工具   1.3.11 内存管理器...

    精通Qt4编程(第二版)源代码

    \21.3 GUI测试 481 \21.2.1 仿真GUI事件 481 \21.2.2 重放GUI事件 483 \21.3 小结 484 \附录A Qt安装 485 \附录B Qt集成开发环境 492 \附录C qmake速查 501 \附录D 深入Qt源代码 506 \附录E Qt资源 512 ...

    精通qt4编程(源代码)

    \21.3 GUI测试 481 \21.2.1 仿真GUI事件 481 \21.2.2 重放GUI事件 483 \21.3 小结 484 \附录A Qt安装 485 \附录B Qt集成开发环境 492 \附录C qmake速查 501 \附录D 深入Qt源代码 506 \附录E Qt资源 512 序言/前言 ...

    软件工程工资管理系统

    Vb6.0功能强大的应用程序开发工具,主要支持基于面向对像化的语言的各种开发项目。 2.需求分析 2.1系统需求和功能 工资管理信息系统对企业加强工资管理有着重要的作用,就一般的大型企业来说,它的设计内容非常...

    java开源包11

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包2

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

    java开源包3

    JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接...

Global site tag (gtag.js) - Google Analytics