QTP

上一篇 / 下一篇  2009-09-05 16:17:01

数据驱动在QTP的运用


  最近看了不少朋友写的blog文章后,就越显自己的文章比较稚嫩.但我觉得这也是一种 学习 的方式,现在抱着一种共同学习的态度来探讨A一下数据驱动在QTP中运用.很希望看我文章朋友能不吝啬的发表一下自己对这个方面的看法,那真是万分感谢啊.

   所谓数据驱动就是用一个数据文件把 测试 脚本驱动起来,来达到更接近用户化更智能的测试.其目的是把测试人员从维护复杂的脚本程序中解放出来,只需维护好数据文件即可,减少了很多修改脚本的麻烦.下面讲一下通过四种途径来达到数据驱动.

1. datatable

        QTP本身程序就给我们提供了这么一个数据表,我们可以把测试数据或 测试用例 填入这个数据表中.

如:设计用例

   username  passwd

case1  mercury mercury

case2 xxxxxxx xxxxxx

录制脚本

For i="1" to Datatable.GetRowCount
Dialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtGlobalSheet)
Dialog("Login").WinEdit("password:").Set DataTable("passwd", dtGlobalSheet)
Dialog("Login").WinButton("OK").Click
datatable.GlobalSheet.SetNextRow
Next

        本例是验证一个登录系统,通过DataTable不同的用例设计,驱动起这段脚本,达到测试的效果.当然上面的例子中还少一个很重要的步骤,那就是结果比较.如果不能进行结果比较的 自动化测试 不能够称为自动化测试.
        当然我们这里主要讲的是数据驱动,所以不在对上面的例子进行补充.

2. 文本文件

        我们可以把文本文件当成数据文件,通过对文本文件的读写操作,来实现数据驱动.

例:文本文件内的内容

  mercury,mercuy

读文件的代码

Function writeorderno(orderno)
Dim fso, myfile,username,passwd
Set fso="CreateObject(""scrīpting.FileSystemObject")
Set myfile="fso.openTextFile(""C:\testing.txt",1,false)
tmp=split(myfile.readline,",")
username=tmp(0)
passwd=tmp(1)
myfile.close
End Function

写文本文件的代码

Function writeorderno(orderno)
Dim fso, myfile
Set fso="CreateObject(""scrīpting.FileSystemObject")
Set myfile="fso.openTextFile(""C:\result1.txt",8,false)
myfile.writeline orderno
myfile.close
End Function

3 . EXCEL文件

        我们可以把EXCEL文件当成数据文件,通过对EXCEL文件的读写操作,来实现数据驱动.

        可以把EXCEL文件当作对象的方式来完成写的操作

Dim Excel,ExcelSheet
Set Excel="CreateObject(""Excel.Application")
Set ExcelSheet="CreateObject(""Excel.Sheet")
ExcelSheet.Application.visible=true
ExcelSheet.ActiveSheet.Cells(1,1).value=1
ExcelSheet.ActiveSheet.Cells(1,2).value=2
ExcelSheet.ActiveSheet.Cells(1,3).value=3
Excel.Save "C:\test.xls"
Set ExcelSheet="Nothing

        用ADO的方式连接EXCEL文件来做读的操作


Dim conn,input,filename
filename="D:\公基本情况(tb_gsgk)-标准格式.xls" '
Set conn= createobject("ADODB.Connection")
conn.Open "provider="Microsoft.Jet.OLEDB.4.0;persist" Security Info="False;Data" Source="&filename&";Extended Properties="'Excel" 8.0;hdr="yes'""
Set input= createobject("ADODB.Recordset")
input.Open "select * from [公基本情况-标准格式$] " ,conn,2,2
input.close
Set input="nothing

4.数据库

        可以利用设计数据表,把测试数据和测试用例放在数据表里,用ADO或者 其他 任何可以访问连接数据库的方式连接数据库,来实现数据驱动

   Dim res,cmd,sql
Set Res="createobject(""adodb.recordset")
Set Cmd="createobject(""adodb.command")
Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info="True;User" ID="sa;Initial" Catalog="xhq;Data" Source="192.168.191.142""  '这句话是连接数据库的数据源,要做修改
Cmd.CommandType = 1
sql ="selec t * from 表 where name="username""
Cmd.CommandText = sql
Set res = Cmd.Execute()
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing

以上四种方法都可以帮助我们实现数据驱动,应该说数据驱动在自动化测试中运用的比较的广泛,才有必要拿出来探讨一下.
  • QTP的一些小知识

    2007-11-09 16:55:57

    QTP的一些小知识

    1.GetCellData函数 

      作用:获取单元格的值

      例:  rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
      text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
      If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
      End If
    Next

    2.把值插入datatable里

      例:   datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"

    3.用代码来启动浏览器

      Browser1 = "IE"
      StartURL = "
    www.51testing.com"
      IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
      END IF
     

    4.ExecuteFile函数

      作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中 
           ExecuteFile FileName 
      说明:where FileName is the absolute or relative path of your VBscrīpt file.

      例:ExecuteFile("F:\test.vbs")

    5.Strcomp函数 

      作用:比较文本

      例:dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If  comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If 

    6.CaptureBitmap 

      作用:捕获屏幕

    7. GetROProperty

      作用:取对象属性值

      例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 

    8.ExitAction - 退出当前操作,无论其循环属性如何。
      ExitActionIteration - 退出操作的当前循环。
      ExitRun - 退出
    测试,无论其循环属性如何。
      ExitGlobalIteration - 退出当前全局循环。


    9.如何使用Excel对象处理数据?
      Dim xl
      打开excel文件
      Function OpenExcelFile(strFilePath)
      Set xl = CreateObject("Excel.Application")
      xl.Workbooks.Open strFilePath
      End Function
      获得指定单元格数据
      Function GetCellData(strSheet,rwIndex,colIndex)
      GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
      End Function
      填充单元格数据
      Function PutCellData(strSheet,rwIndex,colIndex,varData)
      xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
      End Function
      保存并推出
      Function SaveAndQuit()
      xl.Activeworkbook.save
      xl.Quit
      Set xl = nothing
      End Function

    10.连接sql数据库

      例:Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接
    数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
        Set Cmd= nothing

  • 在QTP中建立一个数据库检查点

    2007-11-02 17:12:06

    与Robot相比,QTP直接提供了对数据库中的数据进行检查的检查点,这样如果在我们的测试中需要对后台的业务数据进行检查,只需要建立一个数据库检查点就可以了。建立数据库检查点对于一些比较复杂的业务逻辑的测试非常重要。



    在QTP 8种,建立一个数据库检查点的基本步骤如下:



    1、 从Insert菜单或工具条上选择新建一个Database Checkpoint



    2、 接下来需要为这个Database Checkpoint建立相应的Database Query,这里我们可以通过QTP 8提供的向导完成建立Database Query的过程。



    在QTP 8里,我们有两种建立数据库query的选择:一种是通过Microsoft Query建立,这种方法比较简单,但是需要安装Microsoft Office中的Microsoft Query;另一种方法是手动建立,如果你对在Windows中手动建立ODBC数据源和SQL语句比较熟悉,那么可以选择这种方法。



    使用Microsoft Query建立数据库query的画面如下图,Microsoft Query可以帮助我们建立数据连接,选择数据源并建立数据库的qeury:

    最后Microsoft Query会把建立好的query返回给QTP 8。



    3、 在query建立好之后,QTP 8将打开Database Checkpoint的属性对话框让我们决定如何建立这个数据库检查点。





    数据库检查点对话框上方的表格中有蓝色对号的单元格表示将会作为基准数据在执行测试时参加检查,我们可以选择那些单元格的数据作为我们的基准数据。而在对话框下方有三个属性页,第一个属性页表明当前选择的基准数据是怎样配置的,可以是常数,也可以从数据表中读取,或者从被测软件的输出数据中读入。



    第二个属性页用来设置比较数据的规则。



    而第三个属性页用来设置在进行数据检查时怎样识别数据表的行,列以及单元格。如果我们选择通过键值来定位行数据,那么被选择为主键的列标题会加上图标 作为标识。



    当属性设置完成以后,一个数据库检查点就建立成功了。



    4、 修改数据库检查点

    如果需要对建立好的数据库检查点进行修改,可以通过选择该数据库检查点,然后选择检查点的Object Properties,在数据库检查点的Object Properties对话框中修改连接字串或者SQL query。



    如果需要修改数据库检查点的数据或其它属性,也可以再次打开盖数据库检查点的Checkpoint Properties对话框。





    小结:QTP 8提供了相对比较简便的方法让测试人员可以建立灵活的数据库检查点,这对我们的应用软件的测试会有很大的帮助。除此之外,QTP 8还对XML数据的检查和输出提供了支持,这些都能够提高测试自动化的能力,同时降低建立自动化测试的难度。应该说Rational Robot也具备同样的能力,但是相对而言需要花费比较多的时间和精力。
  • QTP中调用共享文件

    2007-11-02 17:11:19

    在我们开发脚本的时候,发现有些脚本总是重复的出现在各个脚本中。那么我们是不是可以把这些脚本写成一个共享的function,放到一个共享的文件中?然后再给各个脚本调用呢?答案当然是肯定中。其实我在《QTP的一些小知识》中也提到了一个方法,就是利用ExecuteFile函数来调用. vbs文件。如:一个名为test.vbs的文件,我们只要在脚本中写上这么一句代码ExecuteFile("F:\test.vbs") ,就可以来直接执行这个.vbs文件了。

        现在我再来介绍另一种方法,这种方法也是QTP本身所提供的。就是设置菜单选项“setting”中的"resource"选项来做到调用共享文件的效果。在"resource"选项中,有三种文件格式是可以被调用的,分别是*.sql;*.vbs;*.txt三种后缀文件。这里我用一个*.txt文件为例。   新建一个名为test.txt的文本文件,其保存内容如下:(注:保存的内容也必须合法)

    Function writeorderno(orderno)
    Dim fso, myfile
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\result1.txt",8,false)
    myfile.writeline orderno
    myfile.close
    End Function  

    一个名为writeorderno的Function,其作用是把传进来的值写到C盘名为result1.txt的结果文件中去。(注:结果文件也是事先要准备好的)。共享文件准备完毕,那么就开始设置"resource"选项。打开“setting”窗口,找到"resource"选项。点击“+”的 button。选择前面我们建好的文件。如下:

                                            

        确定关闭窗口。我们就来试验一下,是不是这个共享文件里的Function能够被调用了。在QTP专家视图里写上这么几句代码:

    Dim order

    order=1

    writeorderno order

        接下去就按run执行试验,结果测试通过。虽然在脚本中根本没对writeorderno函数做说明,但是当QTP运行到这句代码的时候,在本脚本里没说明的情况下,自己会到"resource"选项里去找。结果QTP能正确识别这个writeorderno 函数。打开c盘里的 result1.txt的结果文件,发现传进函数的值1,被正确的写了进去。预示着整个调用共享文件的成功。
  • QTP的登陆脚本设计

    2007-11-02 17:10:37

    由于一直以来事情都比较多,最近上课还有其它的事情,所以本来答应一个朋友把脚本帮他写一些,但是耽误了3-4天了,实在不好意思。这里把脚本简单说一下,我们分析一下。

    当时问题是这样的,“我的错误的用户名就没办法登陆”,其实含义就是脚本最好能处理成功的用户名错误的用户名,那么这里涉及到脚本的设计。
    目标如下:
    1. 脚本需要处理成功和失败的用户的登陆
    2. 数据驱动

    设计开发脚本如下:


    第一步录制脚本如下
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "吕巍"
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set ""
    Browser("智能变电巡检仪系统 4.0").Page("Page").Syn
    Browser("智能变电巡检仪系统 4.0").Close

    以上为录制的正确的用户名,下边录制错误的用户名
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "xx"
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set ""
    出现错误提示“该用户不存在”

    第二步 增强脚本

    现在需要设计的是一套脚本驱动所有的测试数据,这样可以驱动所有的用例数据,qtp中提供了datatable。
    但是有数据驱动也要做一个事情就是如何处理错误的用户名和正确的用户名,如何结合起来呢?
    这里我把datatable看作存放测试用例的地方,里面放入测试数据,还放入测试的预期结果。这样我的设计已经出现雏形了。
    我把datatable设计为三列

    username password status
    吕x
    xxx xxxx 该用户不存在

    第三列放入最后执行的结果,我设计的是空为成功登陆,如果有信息就用实际运行的结果和这一列对比.好了万事俱备只欠东风了

    修改脚本如下:
    Dim iStatus

    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set DataTable("username", dtLocalSheet)
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set DataTable("password", dtLocalSheet)
    iStatus = DataTable("status", dtLocalSheet)

    If iStatus="" Then
    Browser("智能变电巡检仪系统 4.0").Close
    End If


    If iStatus="该用户不存在" Then
    Reporter.ReportEvent micFail, "登陆", "登陆失败."
    End If

    Browser("智能变电巡检仪系统 4.0").Close

    第三步,设置脚本运行过程

    打开 tests-〉settings
    设置RUN TAB页面下 Datatable iterations中 Run On all rows

    这样就完成了整个脚本的设计工作,以上通过一个简单例子吧脚本的设计和软件的功能结合起来,达成脚本的设计效果。
  • 用QTP做自动化测试过程剖析

    2007-11-02 17:02:43

    如何用工具对自己的业务实现自动化测试,是一个很多人都关心的问题。
    在我看来,实现自动化测试有两种方式:一、对于特定的系统录制或者编写脚本,实现特定系统的自动化测试。二、自己编写测试工具,对于同一类的软件进行测试。这种软件的基本功能是,抓取被测对象,根据抓取的对象生成测试脚本。这个适合于需要测试的多个项目具有大致相同的特征,比如说,要测试的项目都是管理信息系统,项目中大部分功能都类似。都是新增、修改、删除。功能相似的情况下,要进行测试的范围也大致相同。比如对于新增,都要测试超长啊,无效的数据。这种情况下,编写一个通用的工具,制定公共的测试点,然后根据被测对象生成测试脚本是比较可取的方法。

    下面我以 通过QTP工具实现对www.xxx.com中交易管理的自动化测试的过程为例子,说明一下我是如何做的及碰到的哪些问题。

    首先说下被测系统的背景知识。www.xxx.com是个支付平台,买家和卖家在这里完成完整的交易支付过程。

    下面我从几个方面来说一下实施自动化测试的一个大体的过程,当然这只是最基础的一部分,后面要做的工作还很多。

    首先,对所测的业务系统进行分析,抽取公共操作,定义接口参数。目前我简单分析了几个部分:
    创建交易;买家付款;卖家发货;买家确认收货;买家发起退款_未收货;卖家同意退款;买家发起退款_已收货;卖家拒绝退款_买家已收货;买家修改退款协议_已收货;卖家同意退款_买家已收货;买家发货;卖家确认收货退款;

    其次,确定实现方式,也就是技术框架和细节。包括:
    所有这些接口的调用方式;变量及函数的存放位置[位置有外部的vbx文件和QTP自己的文件]。
    在QTP中,不支持调用脚本,只能调用脚本中的某个Action。所以最好把这些基础性的动作放在一个脚本文件中。
    在QTP中,调用Action传参数可以通过两种方法实现:1、利用Action本身的参数。在Acition的属性中,可以定义输入输出参数。2、参数化输入数据。这两种方法都很容易的。
    在别的脚本中调用其他脚本的Action时,还需要两个脚本共享对象库,被调用的Action还需要设置为Reusable。
    最后,所有的技术细节都准备好后,就可以开始录制脚本了。

    录制过程中,千万要记得把一些组件或者页面重命名为有意义的,这样在以后维护的时候可以更清楚一些。否则以后你回对着N个相同的页面名称加上“_n"这样的后缀的对象不知所措。

    由于第一次接触QTP,工作过程中碰到了一些问题,把重要的列举如下:

    1、如何在一个脚本中调用另外的脚本?解决办法:在QTP中脚本无法重复调用,只能调用脚本中的Action。如果一个脚本中的某个Action需要被外部调用,需要设置:a、脚本的属性为Reusable。b、设置脚本的object repository type 为 shared,这样,此脚本的对象可以被别的脚本使用。

    2、登陆时用户名和密码的参数化问题:由于系统有两种用户,经常需要用不同的用户登陆,如果是把用户名和密码做成参数化,需要手工频繁修改参数。最后考虑把登陆部分放到外部文件中,以函数的形式调用。

    3、如何只运行指定的Action?我把所有的交易动作都放在了一个脚本里,每个动作是一个Action。这样需要组合不同的Action完成不同的业务,需要运行指定的Action。现在还没有找到方法。暂时采用新建一个运行脚本,调用基础脚本里的各种操作完成业务。

    4、一个Action的输入参数依赖于另一个Action的输出。这个在参数的传递上用什么来实现呢?用脚本里的全局参数来传递。
  • QTP中测试环境的初始化

    2007-11-02 17:01:53

    在我们运行脚本前,有时候忘了清理环境.可能被测对象已经存在了,QTP再次运行时又重新打开了个相同的对象.导致后续步骤,由于QTP根据对象库中的对象匹配到了两个相同的对象,不知操作哪个对象了,于是报错.那我们有没有办法避免呢?答案当然是肯定的.我们可以在运行测试脚本前,先写段脚本来判断我们要测试的对象是否存在.如果存在可以先关闭,再执行重新打开的操作.接下去以QTP自带的Fight的登录框为例.

    首先我们用QTP中的object spy来看一下这个窗口的属性,找到我们可以利用的属性

    这边我想利用的就是这个窗口的名称属性及值,利用这个名称属性来告诉QTP该关闭哪个窗口属性.

    代码如下:

    Dim loginwin

    :u+k#d CW/U7n68246Set loginwin=descrīption.Create()            '创建对象名为loginwin的对象
    a0Q8~Q!k#Z68246loginwin( "regexpwndtitle").value="Login"       ,对象属性及值
    w7Op:i(|z2KJ68246Set child=desktop.ChildObjects (loginwin)       
    A?_I;X `68246For i=1 to child.count
    e/ll^7Nl68246   child(i-1).close                    '循环寻找这个对象,一次关闭
    3q,w/po-^68246Next

        需要更改的地方,我用蓝色表示了,大家也可以自己试试.不过有一点要注意就是,要执行关闭窗口的关系,这个也完全依照windows的特性来做.最上面的处在激活状态的先关,然后依次关闭其他的窗口.否则脚本会无法执行.可以把这段脚本放在脚本的最前面,实现测试环境的初始化

  • TD与QTP连接

    2007-11-02 16:59:09

    1 、安装TD,检验TD 是否安装成功,启动TD Server 服务器后,在与Server 相连的其他计算机上,打开IE 浏览器,在地址栏输入http://TD Server 的ip 地址/TDbin/start_a.htm 如果能够浏览到TD 界面 ,说明安装成功。

    2、安装QTP,验证QTP 安装成功,进入windows 操作系统,点击,开始 -> 程序->Quick Test Professional-> Quick Test Professional ,打开QTP 使用界面,进行简单的录制,保证脚本录制成功,并且可以回放,与你的预操作达到的结果一致,证明QTP 安装成功。

    3、安装插件,进入TD 首页,点击见面上的TD Add In,进入TD Add In 界面点击More TestDirector Add Ins 进入More TestDirector Add Ins 界面,下载名为TDplugInsSetup 的插件,大约35 兆并且在Server 与QTP 客户机上安装这个插件,安装成功后,会要求你重启电脑,重启后会看到,开始-程序中有个新安装的程序 “Quick Test Professinal add in for Quality Center” ,登入TD 进入test plan 检测是否可以在test plan 中添加QTP 类型的测试用例,点击后 , 出现QUICKTEST.TEST , 并且可以建立QTP 的测试用例。

    4、检查没有问题之后 , 还需要在安装QTP 的机子上做一些相应的设定,进入QTP 主界面 , 点击文件栏的Tools-Options ,进入Options 对话框 在Run Tab 中选择Allow other Mercury products to run test and components , 以及Submit a defect to Qualiyt Center for each failed step 选中后 ,点击ok 保存这个设置,在QTP 主界面中点击Tool -Quality Center Connection,在Server 中输入http:// TDServer ip 地址/TDbin( 本例中使用htt......) , 点击connect 按钮 ,QTP 连接到服务器上 , 如果服务器连接有问题, 则会提示连接失败。

    5、在project connection 中包含一下几项:
    Domain :TD 服务器站点管理中建立项目的域
    Project :域中你所建立的项目
    User :登陆项目所用的用户名
    Password :相应用户名使用的密码
    Reconnect on startup 在下次启动QTP 时自动登陆到你的项目中
    Save password for reconnection on startup 为下次登陆保存密码
    完成了上述操作就TD 和QTP 就连接起来 ,可以从TD 调用QTP 脚本了。
  • 用QTP调用外部vbs读写XML的例子

    2007-11-02 16:58:14

    目前,企业中对XML的应用越来越广泛,作为自动化测试的测试工程师,也应该掌握XML的读写操作。                                    以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。

    读取函数原型 GetXml strXmlPath,nodeName
    这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
    首先,新建一个vbs文件(取个名字叫readXml.vbs),输入代码:

    CODE:

    '==================================================================
      Author : songfun  
     
    ' Descrīption : Read XML
    ==================================================================
     Dim strXML
     GetXml "c:\search.xml","TestResult" '这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
    MsgBox strXML

    Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
    Dim xmlDoc,xmlRoot

    Set xmlDoc = CreateObject("Microsoft.XMLDOM") '创建XML DOM对象
    xmlDoc.async = False '控制加载模式为同步模式(xml树加载完毕后再执行后续代码)
    xmlDoc.load strXmlFilePath '载入xml文件
    If xmlDoc.parseError.errorCode <> 0 Then
    MsgBox "XML文件格式不对,原因是:" & Chr(13) & xmlDoc.parseError.reason                   
    Exit Function
    End If
    Set xmlRoot = xmlDoc.documentElement
    xmlRecursion xmlRoot,xmlNodeName '调用xml递归函数传入指定的根和节点名
    GetXml = True 'xmlRecursion (xmlRoot)
    End Function
    Function xmlRecursion(byval xmlNode,byval strNodeName)                                           If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
    If xmlNode.childNodes.item(0).nodeName = "#text" Then                                             strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)                                                                                                                         End If                                                                                                                       End If                                                                                                                 If xmlNode.hasChildNodes Then
    For Each childNodeItem In xmlNode.ChildNodes
    If childNodeItem.hasChildNodes Then
    xmlRecursion childNodeItem,strNodeName

    Next
    End If
    End Function接着,自己构造一个xml文件(取个名字叫search.xml),如:

    CODE:

    <?xml version="1.0" encoding="GB2312"?>

    <ROOT>
    <TestCase>
    <TestNumberOne>1</TestNumberOne>
    <TestNumberTwo>2</TestNumberTwo>
    <TestNumberThree>+</TestNumberThree>
    <TestResult>3</TestResult>
    </TestCase>
    <TestCase>
    <TestNumberOne>3</TestNumberOne>
    <TestNumberTwo>2</TestNumberTwo>       
    <TestNumberThree>-</TestNumberThree>
    <TestResult>1</TestResult>            
    </TestCase>         
    <TestCase>
    <TestNumberOne>3</TestNumberOne>          
    <TestNumberTwo>7</TestNumberTwo>        
    <TestNumberThree>*</TestNumberThree>            
    <TestResult>21</TestResult>
    </TestCase>                                                                                          <TestCase>
    <TestNumberOne>2</TestNumberOne>  
    <TestNumberTwo>5</TestNumberTwo> 
    <TestNumberThree>/</TestNumberThree>
    <TestResult>0.4</TestResult>                                                                  </TestCase>
    </ROOT>

    然后,在QTP的expert view中调用刚才写的vbs文件:

     executefile "c:\readXml.vbs"

    点“Run”,就能看到这个效果了。

    当然,如果你不用调用外部文件的方式,也可以,如下图。



  • QTP导入EXCEL文件

    2007-11-02 16:56:45

    找了很久,结合资料和VB。终于可以从EXCEL中读入数据

    Dim conn,rst,filename

    Dim var
    filename="E:\test.xls"
    Set conn= createobject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="&filename&";
    Extended Properties='Excel 8.0;hdr=yes'"Set rst= createobject("ADODB.Recordset")
    rst.Open "select  *   from [Sheet1$] " ,conn,1,1
    result = rst.RecordCount
    msgbox "RecordCount = "&result
     While Not rst.EOF 
      var = rst.fields("a")
      msgbox "Data="&var 
          rst.MoveNext          
       Wend
    rst.close
    Set rst=nothing
  • QTP中虚拟对象设置

    2007-11-02 16:55:15

    当我们在录制脚本中,有时会遇到某个对象回放时不能识别.那么就可以考虑是不是可以做个虚拟对象来代替它.您可以将这些对象定义为虚拟对象,并将它们映射到标准类,例如按钮或复选框。QuickTest 在运行会话过程中模拟虚拟对象上的用户操作。在测试结果中,虚拟对象显示时类似标准类对象。
    下面我们还是通过一个例子来具体操作一下.这次选用LoadRuner自带的b/s架构的web例子,来录制脚本.(注:运行这个例子,同时把web server先给开起来.).这次只录制一个点击sign up(注册)的步骤.
    录出脚本如下:
    Browser("Mercury Tours").Page("Mercury Tours").Frame("navbar").Image("signup").Click 45,12

    QTP把这个button对象识别成了Image(图片)对象,导致最后回放的时候,QTP不能完成Click操作,弹出报错信息.对于这个对象,我马上想到了做个虚拟的button对象来代替它.
    下面是整个虚拟对象的制作过程:
    1.选择“工具”>“虚拟对象”>“新建虚拟对象”。或者,也可以在虚拟对象管理器中,单击“新建”。将打开虚拟对象向导。单击“下一步”。

    TAG: QTP qtp

     

    评分:0

    我来说两句