qtp实例练习

周六看了一天文档,《qtp基础教程》

按照里面的步骤一步步进行了操作,明白了每个步骤的意思,最后一步始终做不出来;

过了两天,在公司下班后,我又打开,思考了一下,按照自己的想法,重新做,没想到做成功了,想想也很简单,可能就是一个思考和模仿的过程;


正好公司有个qtp大牛,我就问了问关于写脚本加参数的问题;

大牛说得学学VBS编程,其实也很简单,qtp编程不难;

而且有个地方需要注意下:就是data table,里面有global和active参数,global针对所有active,运行起来的话会叠加,所以他一般都是将参数写在txt文本中,然后进行引用;

set obj=createobject("scripting.filesystemobject")

set myfile=obj.opentextfile("E:\qtp\mydata.txt",1,false)


————————————华丽丽滴分割线—————————————

以下是引用牛人的blog:http://blog.sina.com.cn/s/blog_6135750a01011kpx.html

方法一、DataTable方法

  这是QTP提供的一种方法,也是最容易实现参数化的一种方式。QTP针对DataTable对象提供了很多方法,可以对DataTable进行灵活的操作。DataTable分为Global和Local两种,Global所有的Action都可以用,而Local就是只能Action自己用。

  通过DataTable做参数化最直接的方法就是在KeywordView视图下通过选项进行,这样即方便又减少出错的几率。单击要参数化项目的value列,选择出现的箭头弹出ValueConfiguration Option对话框,在这里可以很方便的进行参数化。

                                                  

  Parameters选择数据来源类型。下拉列表选择DataTable后,选择所要使用的数据表Global还是local,最后选择name参数取自哪列,点击确定后即可完成参数化过程。

代码如下:Dialog("Login").WinEdit("Agent Name:").SetDataTable("user", dtGlobalSheet)

  这是最简单最直接的方式。用这种方式需要注意,在File---Seting---Run需要做相应设置,否则运行结果很容易出错,使实际取到的参数值和预期的不一样或是循环不正确的错误。最好的方式是通过写语句来控制迭代过程中的取值。在脚本开发过程中,这种方式是最常用的。类似如下代码:

For i=0 to DataTable.GetCurrentRow



  Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtGlobalSheet)



  DataTable.SetNextRow



Next

                       

关于DataTable iterations的问题:

a、 file-->settings-->run下datatableiterations中设置控制的是数据表中global里数据的运行方式;global是全局的!当运行方式设置为运行全部或多行时,运行几行数据“程序”就要回放几次!!不能重新设置!!
b、edit-->action-->action callproperties-->run下data tableiterations中设置控制的是数据表中该action里数据的运行方式;local是局部的!当运行方式设置为运行全部或多行时,运行几行数据“该action”就要回放几次!!
进一步说明:

  • 当global有多行数据file-->settings-->runOn all Rows ;action有多行数据action call property->Run Onall Rows 程序每次运行时,action中的每行都要执行一次
  • 当global有多行数据file-->settings-->run On allRows ;action有多条数据,action callproperty->Run  one iteration only而且global的行数>action的行数,当action执行到最后一行后,不管此时global的行数为几,下次回放时action都执行最后一行!如果global的行数<action的行数,action就执行不到最后一行
  • action call property->Run from rows torows,就结合上面所说可以理解
  • 当同一个action中有多个参数时,且action call property->Run Onall Rows, 这个时候每个参数的数据个数需要相等

方法二、环境变量实现参数化
  Environment对象提供对环境变量的访问。环境变量的来源有两种方式:内部环境变量和用户定义的环境变量,其中后者支持从外部导入,格式为XML文件。用环境变量做参数化有一定的局限性,因为环境变量对数据的操作没有方法一灵活,所以环境变量用的最多还是数据的共享。在此暂作为一种方式来学习,灵活运用就好。

  首先说用户定义的环境变量,需要自己定义变量名和值。定义好后就可以用这些变量去参数化脚本中的常量。

  Dialog("Login").WinEdit("Agent Name:").SetEnvironment("test3")

                                      

  这样做参数时,每个参数值都需要指定,而且不能批量的生成。所以它有一定的应用场景:当一个Test中的不同Action需要同样一个参数,用环境变量去参数化常量是很好的一种方式;其次就是不同的Test需要用到同样的参数时,用环境变量可以很好的解决这个问题。

  其次说内部环境变量。它是QTP默认定义的一组变量,包括一些系统信息、项目信息等。目前用到最多的是TestDir,利用这个可以实现一个相对目录的目的。具体应用,在做一个数据驱动的脚本时,将数据文件放到脚本文件夹中,然后利用Environment("TestDir")+FileName导入数据文件。这样可以很方便的移植,而不需要考虑将数据文件放到具体目录下。 

方法三、外部数据源实现参数化

  利用外部数据驱动脚本的运行,这是经常用到的方法,这样可以很方便的组织测试数据。相对前两种方法,这种方式数据的读取、控制稍有些麻烦。下面以常见的几种方式进行说明。

1. 数据文件以Excel组织

  用Excel组织测试数据是最常用的了。此种驱动可以采用两种方式,将数据Import到DataTab中或是利用com来操纵Excel文件。

  方式1、导入到DataTable中

DataStr = Environment("TestDir")&"\Login.xls"



DataTable.AddSheet("Login")

DataTable.ImportSheet DataStr,"Sheet1","Login"



rowCount1 = DataTable.GetSheet("Login").GetRowCount

For i = 1 to rowCount1

  datatable.SetCurrentRow(i)

  user = DataTable.Value("user","Login")

  pwd = DataTable.Value("pwd","Login")

  Dialog("Login").WinEdit("Agent Name:").Set user

  Dialog("Login").WinEdit("Password:").SetSecure pwd

Next

Dialog("Login").WinButton("OK").Click

Window("Flight Reservation").WinMenu("Menu").Select "File;Exit"

                                                        

注意:QTP支持xls后缀的excel文档,不支持xlsx后缀的

  方式2、利用com操纵Excel

set excel = createobject("excel.application")

excel.Visible = true

excel.DisplayAlerts = false  'VBA 如果宏运行时micresoft excel显示特定的警告和消息,则该值为true,bool类型,可读写。
Set book = excel.Workbooks.Open(DataStr)

Set sheet = book.Worksheets("Sheet1")



count1= sheet.usedrange.rows.count 'VBA VB of Applications 是VB的一种宏语言
For i = 2 to count1

    user = excel.Worksheets("Sheet1").Cells(i,1) '获取excel单元格中的内容
     pwd = excel.Worksheets("Sheet1").Cells(i,2)

    Dialog("Login").WinEdit("Agent Name:").Set user

    Dialog("Login").WinEdit("Password:").SetSecure pwd



Next

excel.Quit

Set excel = nothing

2. 数据文件以txt组织

Const ForReading=1  '以只读方式打开文件
TFilePath= Environment("TestDir")&"\Login.txt"



Set Fso = CreateObject("Scripting.FileSystemObject")

Set DataFile= Fso.OpenTextFile(TFilePath,ForReading,False)



DataFile.SkipLine   '在读取TextStream 文件时跳过下一行。如果读的文件没有打开,则产生一个错误。
Do while DataFile.AtEndOfLine<>true



      ReadString = DataFile.ReadLine    '从 TextStream 文件中读取一整行字符,并以字符串返回结果。
       DataStr=split(ReadString,",")              '用于把一个ReadString用逗号分割成字符串数组。
       Dialog("Login").WinEdit("Agent Name:").Set DataStr(0)   '访问字符串数组的第一个字符
       Dialog("Login").WinEdit("Password:").SetSecure DataStr(1)



loop



DataFile.close



Set  Fso=Nothing

                                             

3. 数据文件以数据库组织

用access创建数据库Login,并创建表Login,字段分别为user,pwd,表创建时自动产生主键ID

                                             

strDB="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\HP\QuickTest Professional\Tests\Flight\FlightLogin\Login.mdb;"_

&"Persist Security Info=False"

strTableName="Login"

Set Conn=createobject("adodb.connection")

Set Rst=createobject("adodb.recordset")



Conn.open strDB

Rst.open "select * from "+strTableName,Conn,2,2



Dim strTest(1)  '声明一个长度为2的数组
Rst.MoveFirst

Do while not Rst.eof



       strTest(0)=trim(cstr(Rst.fields(1)))  'cstr 把括号中的内容转换为字符串
       strTest(1)=trim(cstr(Rst.fields(2)))

       Dialog("Login").WinEdit("Agent Name:").Set strTest(0)

       Dialog("Login").WinEdit("Password:").SetSecure strTest(1)



       Rst.MoveNext

Loop



Rst.close

Set Conn=nothing

4. 数据文件以XML组织

                                                      

 

Dim xmlDoc 'As DOMDocument 需要引用xml对象


set xmldoc=CreateObject("microsoft.xmldom")

xmldoc.load(Environment("TestDir")&"\Login.xml")



Set  Root=xmldoc.documentElement   '返回文档的根节点。


For i = 0 To Root.childNodes.Length-1 '检索根节点下方的子节点数
      Set TestCases = Root.childNodes.Item(i)

             For j = 0 To TestCases.childNodes.Length-1 '检索testcase下的节点数
                    Set TestCase = TestCases.childNodes.Item(j)

                           If cstr(TestCase.nodeName)="user" Then

                                  Dialog("Login").WinEdit("Agent Name:").Set TestCase.text       

                           end if

                           If cstr(TestCase.nodeName)="pwd" Then

                                 Dialog("Login").WinEdit("Password:").SetSecure TestCase.text                 

                            End If                         

             Next

Next



Set root=nothing

Set xml=nothing

方法四、随机数

  随机数参数化相对调用外部数据实现参数化来说,简单好多,我们直接看例子吧。。

  参数的变化范围已知的情况下,脚本切换到KeywordView视图下,点击要参数化项目的value列,Parameter选项选择RandomNumber,输入参数的取值范围,点击ok。

Window("Flight Reservation").Dialog("OpenOrder").WinEdit("Edit").Set RandomNumber(0, 100)

  以下拉框为例,随机选择下拉框中的值:

flyFrom = Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount

Window("Flight Reservation").WinComboBox("Fly From:").Select RandomNumber(0,flyFrom-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值