记得刚刚接触QTP时,我花了一些时间想找到QTP执行一个testcase的入口点在哪里,各种文件是如何组织的?这个顺序没有搞清楚,心理总不踏实。总不能就稀里糊涂的录制下,接着稀里糊涂的回放,然后就称作QTP回归测试?当然不是!

记得在Java中,搞清楚一个类的创建过程,了解对类中各种资源执行的时间顺序非常重要。比如,Java解释器碰到创建一个类对象的语句(类似于Class A =New ClassA()),或者调用一个类中静态方法(类似于a = ClassA.getA() )解释器首先查找到该类,然后装载;对载入的类,首先执行静态变量和方法的初始化动作;然后初始化其他非静态变量和方法;最后执行构造函数。那么对于QTP,执行一个testcase时,各种资源文件又是按照何种顺序执行的呢?

首先,我们归结一下一般情况下,一个QTP testcase包括哪些资源文件:1)一个或者多个action(我们大部分的测试脚本都写在action中);2)一个或者多个连接的外部VB Script文件库;3)如果不是采用默认的环境变量,还可以连接一个外部的XML文件作为保存环境变量的文件;4)Recovery scenario中可能调用错误处理的函数,而这些函数可以保存在外部的一个VB Script文件中;5)如果采用Object Repository,则有一个或者多个对象库文件;6)其他各种跟运行testcase相关的设置。

这些众多的文件,在打开一个testcase并执行时,是如何执行的呢?经过试验,我么发现,总体来说是先testcase后test action。就是说,QTP先执行testcase的设置和文件,再执行属于action的设置和文件。以上6种资源,2,3,4,6是跟testcase相关的,是先被读取执行的;而1,5是和action相关的,后执行。其次,在2,3,4,6中,顺序是这样排列的:打开一个testcase,先读取影响该testcase运行的总体设置参数6,接着读取2,3,4(其具体顺序依赖脚本中的先后顺序);在1和5中,自然先检查5,看该action对应的对象库是否存在,接着,才执行第一个action。至于后面的其他action,很容易,按照测试脚本中action的顺序执行。

理解这个顺序,对于理解整个测试的执行非常重要,甚至对在编写代码时产生的“莫名其妙”的错误也很有帮助。比如:若在2)中定义个public 变量,在4)中也定义了整个变量,代码编写时没有任何问题,但是在运行test时,会产生重复定义的错误!我曾经遇到一个问题:就是将4)中的错误处理函数也写在2)中,结果运行时老报告重复定义的错误!而事实上,在2)定义的函数库文件中,我并没有重复定义任何public变量!后来发现,QTP对于2)和4)的文件,是重复载入的,也就是说,对于2)QTP读取一次;对于4)QTP重新读取一次,所以,若在2)中定义了一个函数外的变量,在读取4)时会报告重复定义了。处理的方法就是将4)的函数放在另外一个文件中。

接下来我带大家做一个qtp设计测试用例脚本实例:
Set  Browser_name=Description.Create()
Browser_name("name").value="欢迎访问华为用户管理网站"
'实例化一个对象

Set  Page_name=Description.Create()
Page_name("title").value="欢迎访问华为用户管理网站"

'SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe"
'Browser("name:=hao123--我的上网主页").Navigate "https://uniportal.huawei.com/uniportal"

 '打开IE,并赋值地址

For   i=1  to  DataTable.GetSheet("Action1").GetRowCount    '循环取出datatable中sheet中的行总数
' msgbox   DataTable.GetSheet("Action1").GetRowCount  ‘打印出调试信息
Browser( Browser_name).Page(Page_name).WebEdit("name:=uid").Set  DataTable("用户名",dtLocalSheet)   '从datatable中取数据
Browser(Browser_name).Page(Page_name).WebEdit("name:=password").Set  DataTable("密码",dtLocalSheet)
Browser(Browser_name).Page(Page_name).WebEdit("name:=verifyCode").Set "1"
Browser(Browser_name).Page(Page_name).WebButton("name:=登录" ).Click

datatable.Value("运行结果",dtLocalSheet)=Browser(Browser_name).Page(Page_name).WebTable("name:=uid").WebElement("html tag:=B").GetROProperty("outertext")  '将运行时的文本检查点赋值到datatable中指定的列中

y_status= DataTable("结果",dtLocalSheet)  '设置变量存放预期结果
r_status= DataTable("运行结果",dtLocalSheet)   '设置变量存放运行结果

'msgbox  r_status
'
'msgbox  y_status

 
 If    r_status = y_status Then

   
   Reporter.ReportEvent  micPass, "login", "系统登录成功!+预期值为:" &y_status+"实际值为:"&r_status
   else

   Reporter.ReportEvent  micfail, "login", "系统登录成功!+预期值为:" &y_status+"实际值为:"&r_status

end  if 

DataTable.SetNextRow
'将从datatable下一行取值

'Browser(Browser_name).Page(Page_name).Frame("name:=topFrame").Image("name:=登录").FireEvent "name:=onmouseover"
'Browser(Browser_name).Page(Page_name).Frame("name:=topFrame").Image("name:=登录").Click
'Browser(Browser_name).Dialog("text:=Microsoft Internet Explorer").WinButton("text:=确定").Click

Next

datatable中的数据

用户名 密码  结果    运行结果      

6666 1 登录错误:校验码错误,请重新输入校验码! 
6666 2 登录错误:用户名或密码无效