PS:方法内容是转的别人的,我们项目中只用到了方法三,主要用于将测试数据与业务分离,增强测试数据的可维护性。

方法一、DataTable方法

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

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

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

代码如下:Dialog("Login").WinEdit("Agent Name:").Set DataTable("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下data table iterations中设置控制的是数据表中global里数据的运行方式;global是全局的!当运行方式设置为运行全部或多行时,运行几行数据“程序”就要回放几次!!不能重新设置!!
b、edit-->action-->action call properties-->run下data table iterations中设置控制的是数据表中该action里数据的运行方式;local 是局部的!当运行方式设置为运行全部或多行时,运行几行数据“该action”就要回放几次!! 
进一步说明:

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

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

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

  Dialog("Login").WinEdit("Agent Name:").Set Environment("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
  SystemUtil.Run "C:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe"
 datatable.SetCurrentRow(i)
  user = DataTable.Value("user","Login")
 pwd = DataTable.Value("pwd","Login")
  Dialog("Login").WinEdit("Agent Name:").Set user
  Dialog("Login").WinEdit("Password:").Set pwd
   Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").WinMenu("Menu").Select "File;Exit"
Next

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

  方式2、利用com操纵Excel

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

Set ExcelApp = createobject("excel.application") '创建ExcelApp对象
ExcelApp.Visible = true
ExcelApp.DisplayAlerts = false set book = ExcelApp.Workbooks.Open(DataStr) '打开excel文件工作簿
Set ExcelShe = book.Worksheets("Sheet1").usedrange '这里需要用到UsedRange,表示Sheet1所使用单元格的范围,否则会将所有单元格都打印出 rowcount = ExcelShe.rows.count '计算使用的单元格行数 For i = 2 to rowcount
SystemUtil.Run "C:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe" user = ExcelApp.Worksheets("Sheet1").cells(i,1)
pwd = ExcelApp.Worksheets("Sheet1").cells(i,2) Dialog("Login").WinEdit("Agent Name:").Set user
Dialog("Login").WinEdit("Password:").Set pwd Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").WinMenu("Menu").Select "File;Exit" Next
Set ExcelShe = nothing
book.close '关闭工作簿对象
ExcelApp.Quit '退出ExcelApp对象

备注:ExcelApp.Visible 是否把excel显示为当前窗口。

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

备注:AtEndOfLine 属性仅应用于以读方式打开的 TextStream 文件,否则会出现错误。

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

方法四、随机数

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

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

Window("Flight Reservation").Dialog("Open Order").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)

QTP 参数化的更多相关文章

  1. QTP参数化

    使用QTP可以通过将固定值替换为参数,扩展测试范围,可以提高测试的灵活性. 在QTP中,我们可以对以下部分进行参数化: 1.对象属性参数化 2.对象名称的参数化 3.对象方法的参数的参数化

  2. 自动化测试(三):QTP参数化

    1 Datatable参数化 Global表的数据可以被所有的action访问,Action的数据只能被对应的Action访问 本地表循环的次数设置:Action Call Properties Gl ...

  3. loadrunner和QTP视频教程汇总

    小布老师视频: 测试工具概述,兼LoadRunner介绍 -1-4 http://www.boobooke.com/v/bbk1046 http://www.boobooke.com/v/bbk104 ...

  4. QTP检查点和参数化_百度一下

    一.脚本编辑检查点: Browser("百度知道 - 全球最大中文互动问答平台").Page("百度知道 - 全球最大中文互动问答平台").WebEdit(&q ...

  5. QTP脚本--应用参数化来测试某个输入框

    以前一直觉得自己没有写代码的资质,太急于求成,以为一天就能写好几个功能,几千行代码,于是就没耐心了,没心情学下去了....但是最近发现其实写代码是一个漫长的过程,都是在修修改改中成长起来的.于是今天试 ...

  6. 【QTP专题】05_参数化之Excel

    QTP使用外部Excel实现参数化主要有以下两种方式 导入到DataTable中 Syntax:DataTable.ImportSheet(FileName, SheetSource, SheetDe ...

  7. QTP 学习 - 参数化

  8. QTP功能点笔记

    1.QTP启动应用程序的几种方法 1)用SystemUtil.Run 1 SystemUtil.Run "C:\Program Files (x86)\HP\QuickTest Profes ...

  9. QTP

    QTP支持功能测试和回归测试的自动化. 支持录制功能,可以对脚本设置检查点,也可以进行参数化.可以在一个ACTION中调用另外一个ACTION action可以调用外部脚本.可以复制已有的ACTION ...

随机推荐

  1. 通过store为toolbar添加按钮

    目的是实现导航条toolbar可以动态加载按钮. ExtJS的版本是4.0. 实现方案有两个.方案一:添加render事件监听,在监听事件处理函数中使用Ext.Ajax获取按钮信息,实现动态添加按钮. ...

  2. MS Chart-按照数据库的最大最小时间设置X轴label.

    核心代码: Chart1.ChartAreas[0].AxisX.Interval = (Front_Max - Front_Min).Days / 2; Chart1.ChartAreas[0].A ...

  3. C++实现禁忌搜索解决TSP问题

    C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...

  4. VS2010出现灾难性错误的解决办法

    VS2010出现灾难性错误的解决办法   之前本人利用VS2010 在编写一个基于对话框的程序的时候,要在对话框类C-.DLG中添加函数,右键点击类向导,此时界面上弹出一个消息框,告知出现灾难性事故, ...

  5. P3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四

    这个系列总算是做完了,这是我第一次高效率做完四道题,虽然中间有两道水题,但是第一和第四题还是蛮好的,但是只要能想到思路就很快能打完的. 像这道题,刚开始在想能不能用DP?但是苦于不知道怎么实施,后来又 ...

  6. Objective-C面向对象(一)

    1.类和对象 1.1定义类 面向对象的程序设计中有两个重要概念:类(class)和对象(object),类事某一批对象的抽象,对象是一个具体存在的实体. Objective-C定义类需要氛围2个步骤 ...

  7. 20145129 《Java程序设计》第6周学习总结

    20145129 <Java程序设计>第6周学习总结 教材学习内容总结 InputStream与OutStream 串流设计的概念 输入串流代表对象为java.io.InputStream ...

  8. VIM技巧:显示行号

    在vi的命令模式下输入":set nu",就有行号了,取消行号输入":set nonu". 命令只对当前文档有效,如果想使vi打开文档时默认显示行号,可以修改v ...

  9. string::rfind

    该函数返回目标字符串(key)在源字符串中最后一次匹配的位置 如果没有找到匹配的位置则返回string::npos,是一个无符号整形数字,可以打印看看 //// string::rfind #incl ...

  10. django Forgienkey字段 在前台用js做处理

    在我做的项目中有个选择省城市的选项,这两个字段的关系是一对多的关系class Province(models.Model): # 省会      name = models.CharField(max ...