QTP自动化测试

发表于:2009-11-23来源:作者:点击数: 标签:自动化qtpQTP
QTP自动化测试 软件测试 一、QTP自动化 测试流程 1)准备 TestCase - 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本 - 在录制脚本之前设计好脚本,便于录制过程的流畅 - 由于 测试用例 设计和脚本 开发 可能不是同一个人完成,便于团队合作 -

QTP自动化测试    软件测试

 

一、QTP自动化测试流程

1)准备TestCase

        - 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本

        - 在录制脚本之前设计好脚本,便于录制过程的流畅

        - 由于测试用例设计和脚本开发可能不是同一个人完成,便于团队合作

        - 便于后期的维护

        - 文档化的方式:TD或者文档

2)配置QTP

        QTP支持不同的开发环境,在正式录制之前,需要根据被测程序的开发环境,选择合适的Add-In,并进行加载。

3)录制脚本

        启动QTP的录制功能,按照Test Case的操作步骤描述执行,QTP自动记录每一步操作,并自动生成VBScript脚本。

4)修改增强脚本

        刚刚录制好的脚本可能包含错误,或者没有达到预期的目的,这就需要在录制脚本的基础上,进行修改增强

        - 删除录制过程中多余的以及错误的操作,以最少的脚本完成任务

        - 如果前面操作的输出是后面操作的输入,则需要使用变量或者输出值来进行替换

        - 不是所有的操作都可以通过录制产生的,有些需要通过手工编码实现这些功能

        - 录制产生的脚本是线性的,可以加入条件、循环控制语句,实现更复杂的流程

        - 对脚本进行结构化

        - 加入注释,便于阅读和维护

5)调试脚本

        - 回放通过的脚本,不一定是正确的,也可能会包含错误

        - 在测试脚本正式使用之前,要保证其本身的正确性

        - 避免测试脚本故障和被测程序故障搅在一起,不容易定位

6)回放脚本

        - 对于回放的错误,不要急于马上提交Bug,首先要判断是脚本本身的错误还是程序的错误,确认后再提交。

7)脚本维护

        - 随着工作的不断推进,脚本量会越来越多

        - 被测试程序的不断更新,也需要更新相应的测试脚本

        - 采用版本管理工具保存脚本,如CVSVSS,可以随时获取历史版本

        - 采用统一的脚本架构

        - 采用统一的命名规范

        - 添加充分的注释,避免时间久了,自己都不能马上读懂脚本。

 

二、QTP识别对象的原理

QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。

这两个概念从字面上不大好理解,也容易混淆。

但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。

QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。

然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,

接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。

仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,

也可以在运行过程中进行动态修改,以匹配实际对象。

和TO、RO相关的几个函数有:

GetTOProperty():取得仓库对象的某个属性的值

GetTOProperties():取得仓库对象的所有属性的值

SetTOProperty():设置仓库对象的某个属性的值

GetROProperty():取得实际对象的某个属性的值

理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。

记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。

我们要对每条记录进行检查,也就是要点击每个Check按钮。

但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。

那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0

然后用下面的脚本,就可以完成测试

buttnNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))

For buttonIndex = 0 to buttonNum - 1

  JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)

  JavaWindow("Test").JavaButton("Check").Click

Next

或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去

我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")

JavaWindow("Test").JavaButton("AnyButton").Click

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")

JavaWindow("Test").JavaButton("AnyButton").Click

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")

JavaWindow("Test").JavaButton("AnyButton").Click

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")

JavaWindow("Test").JavaButton("AnyButton").Click

另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象

( Written by yabest,http://yabest.net )

如上面两个任务,可以如下实现

1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试

buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))

For buttonIndex = 0 to buttonNum - 1

  JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click

Next

2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试

JavaWindow("Test").JavaButton("label:=New").Click

JavaWindow("Test").JavaButton("label:=Modify").Click

JavaWindow("Test").JavaButton("label:=Delete").Click

JavaWindow("Test").JavaButton("label:=Check").Click

 

三、QTP自动化发展方向

1.       入门,初识自动化相信很多的朋友,包括我自己也是一样,在刚听到或接触到自动化测试的时候,迫不及待的下载了一个工具开始用,然后傻眼了,面对例如功能强大QTP,不知如何下手,同时也会严重的打消我们的积极性,在这里,我建议每个刚开始接触或学习自动化的朋友,先了解一些自动化的概念,在这一阶段你要先搞清楚这几个问题:

什么是自动化测试?

自动化可以做什么?

学好自动化测试需要哪些知识准备?

自动化测试的局限性?

你做的项目适不适合做自动化测试?为什么?

为什么要先搞懂这几个问题?因为你先了解了这些问题后,有助于消除你对自动化测试学习的恐惧,也会有一个初步的思路,不会觉得无所适从,再者,带着问题去学习,能更好的理解并记住然后形成自己的思维。

2.       下载安装QTP   这时候是不是对自动化测试有所了解了,那现在就下载一个自动化测试工具,然后安装并破解它或使用试用版本,开始自动化工具的学习吧。在这里我要谈一点我个人的经验:我应该学习哪个工具?对于这个问题,我想说这跟我当时学习编程语言一样的,到处找资料看人家的经验,人家说VB容易上手,马上学习VB,看到人家说DEPHI好就学习DEPHI,人家说JAVA好就学习JAVA。。。。。。。,甚至一天几变,几个月下来,什么也没学会,最后安下心来从C开始吧,自动化测试也是一样,不要老去问别人学什么好,选择一个,硬着头皮学下来就是了,你精通了一门工具后,再去用另一个工具也就是一两周的时间就能运用自如,所以,就从QTP开始吧,它的IDE很直观,适合新手,然后下载一份用户手册,先了解下各个功能

3.       简单自动化 QTP装好了吧,那现在就开始我们的第一个自动化体验:录制flight自动化脚本,这个过程比较简单,录制三个部分:登陆、定票、查询定票和删除定票,具体的业务过程和录制过程我就不说了,网上有很多资料,本文也不是一个实验指导书,只是提供一个比较清晰的自动化学习路线。当然,在录制了这些脚本之后,回放成功,第一个自动化完成了。

4.       增强脚本功能 这个阶段主要是学习一些QTP的基本功能,在这里你要去增强一下你的脚本了,参数化登陆用户名和密码,参数化航班选择、定票张数,增加金额的检查。主要是学习参数化和检查点,这里会遇到一些困难:那就是选择航班这里,可以运用随机数等方法来参数化航班金额的检查会需要用到一些简单编程,总金额=张数*单价.通过定单号查询定票会要用到对象的GetRoProperty("")方法.这个学习的过程,还会遇到一些调试方面的困难,不过不用心急,慢慢来,成功是建立在失败之上的,记得在调试时,可以按F11单步运行,建立你的输出如:msgbox实时输出你想要看到的信息。

5.       数据驱动   经历了上面的阶段,在这里将要接触一点数据驱动的思想了,其实很简单,就是把你参数化的地方拿出来,放到一个外置的excel文件里面,然后通过读取excel里面的数据来控制循环次数,大概的步骤如下:

创建excel对象

循环读取excel数据赋值给变量

在脚本中引用变量

6.       功能函数化   这个阶段主要是把各个可以重用的功能写成函数,而主控脚本主要是用来调用这些功能函数,实现重用和结构清晰化,这个阶段又可以分成以下几个子阶段:

把单个的功能写成一个action,主脚本调用这些action,在这里会遇到一个问题,那就是关于被调用action的设置,这个在我的博客里面有一篇文章有介绍,可以去看看把单个的功能写成函数放到一个action里面,脚本最下面调用这些函数

把单个的功能写成函数到一个.vbs文件,脚本中调用这些函数,在这里也会遇到一个问题,那就是QTP调用.vbs文件,这在我的博客里面也有一篇文章详细写了,这里就不再重复这个过程完成后,就大概有基本的框架了,接下来进入下一个阶段

7.       完善框架   在这个阶段,我们以网上一位朋友的轻量级自动化测试框架来说,相信有很多朋友都有看过,我也懒得重新去做一个示例了,在这里你需要建立你自己的report、日志文件、函数文件、数据驱动文件、脚本文件等,把这些都放到单独的文件夹里面,方便管理,并对函数的创建、定义进行规范,详情参见轻量级自动化测试框架

8.       理清框架思想 在这个阶段主要是用来思考和完善你的框架思想了,此时你们应该有一个清晰的思路了,明白自动化脚本开发的各个阶段,并知道最后要做成什么样子,现在重要的一点就是学习做分析和计划了,一个项目交到你手里,你要先评估这个项目适不适合做自动化、自动化哪些东西、哪些功能可以封装起开写成函数、哪些地方需要进行数据来控制驱动,最后评估各个阶段的耗时、需要的资源、各阶段的产出(文档、脚本等)

 

四、QTP操作对象的原理

QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。

对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。

对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。

两种接口的脚本书写格式的差别在于:

  自身接口需要在对象名后面加object再加属性名或方法名,

  封装接口就不用在对象名后面加object。

具体格式如下:

  对实际对象的操作:

      对象.object.自身属性

      对象.object.自身方法()

      对象.GetROProperty("封装属性")

      对象.封装方法()

  对仓库对象的操作:

      对象.GetTOProperty("封装属性")

      对象.GetTOProperties()      ’获取所有封装属性的值

      对象.SetTOProperty("封装属性", "封装属性值")

比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:

  设置JavaEdit的内容:

     JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"

  读取JavaEdit的内容:

     msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")

如果通过JavaEdit的自身接口,脚本如下:

  设置JavaEdit的内容:

     JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")

  读取JavaEdit的内容:

     Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()

QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。

QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。

JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。

但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。

所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。

不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。

封装接口有相应功能的话,就尽量用封装接口吧!

( Written by yabest,http://yabest.net )

理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

但是我们怎么知道对象都有哪些封装接口和自身接口呢?

其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。

窗口中间有选择栏让你选择Run-time Object或者Test Object,

当你选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)

当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,

两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。

不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。

QTP里的Test Object/Run-time Object的概念太容易让人混淆了!

它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。

 

 

 

 

 

 

原文转自:http://www.ltesting.net