|
方法一、DataTable方法
這是QTP提供的一種方法,也是最容易實(shí)現(xiàn)參數(shù)化的一種方式。QTP針對(duì)DataTable對(duì)象提供了很多方法,可以對(duì)DataTable進(jìn)行靈活的操作。DataTable分為Global和Local兩種,Global所有的Action都可以用,而Local就是只能Action自己用。
通過(guò)DataTable做參數(shù)化最直接的方法就是在Keyword
View視圖下通過(guò)選項(xiàng)進(jìn)行,這樣即方便又減少出錯(cuò)的幾率。單擊要參數(shù)化項(xiàng)目的value列,選擇出現(xiàn)的箭頭彈出Value
Configuration Option對(duì)話(huà)框,在這里可以很方便的進(jìn)行參數(shù)化。
Parameters選擇數(shù)據(jù)來(lái)源類(lèi)型。下拉列表選擇DataTable后,選擇所要使用的數(shù)據(jù)表Global還是local,最后選擇name參數(shù)取自哪列,點(diǎn)擊確定后即可完成參數(shù)化過(guò)程。
代碼如下:Dialog("Login").WinEdit("Agent Name:").Set
DataTable("user", dtGlobalSheet)
這是最簡(jiǎn)單最直接的方式。用這種方式需要注意,在File---Seting---Run需要做相應(yīng)設(shè)置,否則運(yùn)行結(jié)果很容易出錯(cuò),使實(shí)際取到的參數(shù)值和預(yù)期的不一樣或是循環(huán)不正確的錯(cuò)誤。最好的方式是通過(guò)寫(xiě)語(yǔ)句來(lái)控制迭代過(guò)程中的取值。在腳本開(kāi)發(fā)過(guò)程中,這種方式是最常用的。類(lèi)似如下代碼:
For i=0 to DataTable.GetCurrentRow
Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtGlobalSheet)
DataTable.SetNextRow
Next

關(guān)于DataTable iterations的問(wèn)題:
a、 file-->settings-->run下data
table
iterations中設(shè)置控制的是數(shù)據(jù)表中g(shù)lobal里數(shù)據(jù)的運(yùn)行方式;global是全局的!當(dāng)運(yùn)行方式設(shè)置為運(yùn)行全部或多行時(shí),運(yùn)行幾行數(shù)據(jù)“程序”就要回放幾次!!不能重新設(shè)置!!
b、edit-->action-->action call
properties-->run下data table
iterations中設(shè)置控制的是數(shù)據(jù)表中該action里數(shù)據(jù)的運(yùn)行方式;local
是局部的!當(dāng)運(yùn)行方式設(shè)置為運(yùn)行全部或多行時(shí),運(yùn)行幾行數(shù)據(jù)“該action”就要回放幾次!!
進(jìn)一步說(shuō)明:
- 當(dāng)global有多行數(shù)據(jù)file-->settings-->run
On all Rows ;action有多行數(shù)據(jù)action call property->Run On
all Rows 程序每次運(yùn)行時(shí),action中的每行都要執(zhí)行一次
- 當(dāng)global
有多行數(shù)據(jù)file-->settings-->run On all
Rows ;action有多條數(shù)據(jù),action call
property->Run one iteration only
而且global的行數(shù)>action的行數(shù),當(dāng)action執(zhí)行到最后一行后,不管此時(shí)global
的行數(shù)為幾,下次回放時(shí)action都執(zhí)行最后一行!
如果global的行數(shù)<action的行數(shù),action就執(zhí)行不到最后一行
- action call property->Run from rows to
rows,就結(jié)合上面所說(shuō)可以理解
- 當(dāng)同一個(gè)action中有多個(gè)參數(shù)時(shí),且action call property->Run On
all Rows, 這個(gè)時(shí)候每個(gè)參數(shù)的數(shù)據(jù)個(gè)數(shù)需要相等
方法二、環(huán)境變量實(shí)現(xiàn)參數(shù)化 Environment
對(duì)象提供對(duì)環(huán)境變量的訪(fǎng)問(wèn)。環(huán)境變量的來(lái)源有兩種方式:內(nèi)部環(huán)境變量和用戶(hù)定義的環(huán)境變量,其中后者支持從外部導(dǎo)入,格式為XML文件。用環(huán)境變量做參數(shù)化有一定的局限性,因?yàn)榄h(huán)境變量對(duì)數(shù)據(jù)的操作沒(méi)有方法一靈活,所以環(huán)境變量用的最多還是數(shù)據(jù)的共享。在此暫作為一種方式來(lái)學(xué)習(xí),靈活運(yùn)用就好。
首先說(shuō)用戶(hù)定義的環(huán)境變量,需要自己定義變量名和值。定義好后就可以用這些變量去參數(shù)化腳本中的常量。
Dialog("Login").WinEdit("Agent Name:").Set
Environment("test3")

這樣做參數(shù)時(shí),每個(gè)參數(shù)值都需要指定,而且不能批量的生成。所以它有一定的應(yīng)用場(chǎng)景:當(dāng)一個(gè)Test中的不同Action需要同樣一個(gè)參數(shù),用環(huán)境變量去參數(shù)化常量是很好的一種方式;其次就是不同的Test需要用到同樣的參數(shù)時(shí),用環(huán)境變量可以很好的解決這個(gè)問(wèn)題。
其次說(shuō)內(nèi)部環(huán)境變量。它是QTP默認(rèn)定義的一組變量,包括一些系統(tǒng)信息、項(xiàng)目信息等。目前用到最多的是TestDir,利用這個(gè)可以實(shí)現(xiàn)一個(gè)相對(duì)目錄的目的。具體應(yīng)用,在做一個(gè)數(shù)據(jù)驅(qū)動(dòng)的腳本時(shí),將數(shù)據(jù)文件放到腳本文件夾中,然后利用Environment("TestDir")+FileName導(dǎo)入數(shù)據(jù)文件。這樣可以很方便的移植,而不需要考慮將數(shù)據(jù)文件放到具體目錄下?!?/p>
方法三、外部數(shù)據(jù)源實(shí)現(xiàn)參數(shù)化
利用外部數(shù)據(jù)驅(qū)動(dòng)腳本的運(yùn)行,這是經(jīng)常用到的方法,這樣可以很方便的組織測(cè)試數(shù)據(jù)。相對(duì)前兩種方法,這種方式數(shù)據(jù)的讀取、控制稍有些麻煩。下面以常見(jiàn)的幾種方式進(jìn)行說(shuō)明。
1. 數(shù)據(jù)文件以Excel組織
用Excel組織測(cè)試數(shù)據(jù)是最常用的了。此種驅(qū)動(dòng)可以采用兩種方式,將數(shù)據(jù)Import到DataTab中或是利用com來(lái)操縱Excel文件。
方式1、導(dǎo)入到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 如果宏運(yùn)行時(shí)micresoft excel顯示特定的警告和消息,則該值為true,bool類(lèi)型,可讀寫(xiě)。 Set book = excel.Workbooks.Open(DataStr)
Set sheet = book.Worksheets("Sheet1")
count1= sheet.usedrange.rows.count 'VBA VB of Applications 是VB的一種宏語(yǔ)言 For i = 2 to count1
user = excel.Worksheets("Sheet1").Cells(i,1) '獲取excel單元格中的內(nèi)容 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. 數(shù)據(jù)文件以txt組織
Const ForReading=1 '以只讀方式打開(kāi)文件 TFilePath= Environment("TestDir")&"\Login.txt"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set DataFile= Fso.OpenTextFile(TFilePath,ForReading,False)
DataFile.SkipLine '在讀取TextStream 文件時(shí)跳過(guò)下一行。如果讀的文件沒(méi)有打開(kāi),則產(chǎn)生一個(gè)錯(cuò)誤。 Do while DataFile.AtEndOfLine<>true
ReadString = DataFile.ReadLine '從 TextStream 文件中讀取一整行字符,并以字符串返回結(jié)果。 DataStr=split(ReadString,",") '用于把一個(gè)ReadString用逗號(hào)分割成字符串?dāng)?shù)組。 Dialog("Login").WinEdit("Agent Name:").Set DataStr(0) '訪(fǎng)問(wèn)字符串?dāng)?shù)組的第一個(gè)字符 Dialog("Login").WinEdit("Password:").SetSecure DataStr(1)
loop
DataFile.close
Set Fso=Nothing
3. 數(shù)據(jù)文件以數(shù)據(jù)庫(kù)組織
用access創(chuàng)建數(shù)據(jù)庫(kù)Login,并創(chuàng)建表Login,字段分別為user,pwd,表創(chuàng)建時(shí)自動(dòng)產(chǎn)生主鍵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) '聲明一個(gè)長(zhǎng)度為2的數(shù)組 Rst.MoveFirst
Do while not Rst.eof
strTest(0)=trim(cstr(Rst.fields(1))) 'cstr 把括號(hào)中的內(nèi)容轉(zhuǎn)換為字符串 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. 數(shù)據(jù)文件以XML組織

Dim xmlDoc 'As DOMDocument 需要引用xml對(duì)象
set xmldoc=CreateObject("microsoft.xmldom")
xmldoc.load(Environment("TestDir")&"\Login.xml")
Set Root=xmldoc.documentElement '返回文檔的根節(jié)點(diǎn)。
For i = 0 To Root.childNodes.Length-1 '檢索根節(jié)點(diǎn)下方的子節(jié)點(diǎn)數(shù) Set TestCases = Root.childNodes.Item(i)
For j = 0 To TestCases.childNodes.Length-1 '檢索testcase下的節(jié)點(diǎn)數(shù) 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
方法四、隨機(jī)數(shù)
隨機(jī)數(shù)參數(shù)化相對(duì)調(diào)用外部數(shù)據(jù)實(shí)現(xiàn)參數(shù)化來(lái)說(shuō),簡(jiǎn)單好多,我們直接看例子吧。。
參數(shù)的變化范圍已知的情況下,腳本切換到Keyword
View視圖下,點(diǎn)擊要參數(shù)化項(xiàng)目的value列,Parameter選項(xiàng)選擇RandomNumber,輸入?yún)?shù)的取值范圍,點(diǎn)擊ok。
Window("Flight Reservation").Dialog("Open
Order").WinEdit("Edit").Set RandomNumber(0, 100)
以下拉框?yàn)槔?,隨機(jī)選擇下拉框中的值:
flyFrom = Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount
Window("Flight Reservation").WinComboBox("Fly From:").Select RandomNumber(0,flyFrom-1)
|