蔣桂梅
【摘 要】在使用QTP進(jìn)行自動(dòng)化測(cè)試時(shí),數(shù)據(jù)驅(qū)動(dòng)起著舉足輕重的作用,進(jìn)行數(shù)據(jù)驅(qū)動(dòng)關(guān)鍵是實(shí)現(xiàn)腳本的參數(shù)化。筆者結(jié)合實(shí)例總結(jié)和歸納了多種進(jìn)行數(shù)據(jù)驅(qū)動(dòng)參數(shù)化的方式。
【關(guān)鍵詞】QTP;自動(dòng)化測(cè)試;參數(shù)化
0 引言
自動(dòng)化測(cè)試是使用軟件來控制測(cè)試執(zhí)行過程,需要在適當(dāng)?shù)臅r(shí)間使已形式化的手工測(cè)試過程自動(dòng)化,最好的自動(dòng)化測(cè)試工具是能夠?qū)⒐ぞ吲c測(cè)試需求達(dá)成一致,并且提供高度可自定義的工作流程和跟蹤報(bào)告能力[1]。
Mercury QuickTest Professional(簡(jiǎn)稱QTP)是企業(yè)級(jí)自動(dòng)化測(cè)試工具,已被惠普公司收購(gòu),QTP主要適用于功能和回歸測(cè)試的自動(dòng)化,采用關(guān)鍵字驅(qū)動(dòng)的理論來簡(jiǎn)化對(duì)測(cè)試用例的創(chuàng)建和維護(hù),用戶可以直接錄制屏幕上的操作流程,自動(dòng)生成功能測(cè)試或回歸測(cè)試腳本。當(dāng)腳本錄制完成,并不能完全立即使用,主要原因是錄制的腳本只能覆蓋一條測(cè)試用例,并且對(duì)數(shù)據(jù)的依賴性很強(qiáng),更換數(shù)據(jù)后就會(huì)出錯(cuò),這種線性的自動(dòng)化測(cè)試方式缺點(diǎn)很明顯,需要對(duì)腳本進(jìn)行優(yōu)化和增強(qiáng)。
適當(dāng)調(diào)整和增強(qiáng)測(cè)試腳本,提高腳本的靈活性,數(shù)據(jù)驅(qū)動(dòng)方式的測(cè)試腳本是解決這類問題的重要方式。數(shù)據(jù)驅(qū)動(dòng)的測(cè)試方法要解決的核心問題是把數(shù)據(jù)從測(cè)試腳本中分離出來,從而實(shí)現(xiàn)測(cè)試腳本的參數(shù)化[2]。
1 數(shù)據(jù)驅(qū)動(dòng)測(cè)試的步驟
數(shù)據(jù)驅(qū)動(dòng)測(cè)試一般按以下步驟進(jìn)行[3]:
1)參數(shù)化測(cè)試數(shù)據(jù),綁定到數(shù)據(jù)表格中的各個(gè)字段;
2)在表格中編輯多行的測(cè)試數(shù)據(jù),取決于測(cè)試用例及測(cè)試覆蓋率的需要;
3)設(shè)置迭代次數(shù),每次迭代選擇一行數(shù)據(jù)。
2 參數(shù)化方法
2.1 DataTable實(shí)現(xiàn)參數(shù)化
本測(cè)試是測(cè)試飛行程序的登錄用戶名和密碼,將多組測(cè)試數(shù)據(jù)放在DataTable的Global或當(dāng)前Action表中。DataTable是一種最容易實(shí)現(xiàn)參數(shù)化的方式。
2.2 環(huán)境變量實(shí)現(xiàn)參數(shù)化
參數(shù)化在“Value Configuration Option”對(duì)話框中設(shè)置“Name”和“Value”框中進(jìn)行設(shè)置,環(huán)境變量實(shí)現(xiàn)參數(shù)化當(dāng)在同一個(gè)Test中多個(gè)Action調(diào)用同一個(gè)參數(shù)時(shí),使用環(huán)境變量作為參數(shù)是一種很好的方式,但每個(gè)參數(shù)值都要指定,如果測(cè)試多組數(shù)據(jù)工作量就大了。
2.3 使用文本文件實(shí)現(xiàn)參數(shù)化
先在腳本根目錄中創(chuàng)建txt文件,將內(nèi)容輸入文件中,輸入格式如圖4。
QTP腳本代碼如下:
Const ForReading=1
FilePath = Environment("TestDir")&"\login.txt" '取得存儲(chǔ)數(shù)據(jù)的txt文件的路徑
Set FSO = CreateObject("Scripting.FileSystemObject")
Set DataFile = Fso.OpenTextFile(FilePath,F(xiàn)orReading,F(xiàn)alse)
Do while DataFile.AtEndOfLine<>true
systemutil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
ReadString = DataFile.ReadLine '讀取txt文件中的行記錄
DataStr = split(ReadString,",") '將行記錄以逗號(hào)為分隔符分開,并存入數(shù)組中
Dialog("Login").WinEdit("Agent Name:").Set datastr(0) '輸入用戶名
Dialog("Login").WinEdit("Password:").SetSecure datastr(1) '輸入密碼
Dialog("Login").WinButton("OK").Click
If Dialog("Flight Reservations").Exist (5) then
Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
wait(3)
loop
DataFile.close
do-loop結(jié)構(gòu)是為了使多組數(shù)據(jù)循環(huán)執(zhí)行下去,直到文件結(jié)尾,if-else-endif結(jié)構(gòu)是判斷對(duì)話框“Flight Reservations”的存在與否來推斷用戶和密碼是否輸入錯(cuò)誤的情況處理,讓循環(huán)能繼續(xù)下一組數(shù)據(jù)的驗(yàn)證。
2.4 使用excel表實(shí)現(xiàn)參數(shù)化
先在腳本根目錄中創(chuàng)建xls文件,將內(nèi)容輸入文件中,輸入格式如圖5。
QTP腳本代碼如下:
datatable.ImportSheet "login.xls","login_sheet","Action1"
'第一個(gè)參數(shù)是源文件,第二個(gè)參數(shù)是源文件工作表名稱,第三個(gè)參數(shù)是目的路徑表名稱
Dim i,rowcount
i=1
rowcount=datatable.GetSheet ("Action1").GetRowCount
Do while(i<=rowcount)
systemUtil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
datatable.SetCurrentRow (i)
Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtLocalSheet)
Dialog("Login").WinEdit("Password:").Set DataTable("pwd", dtLocalSheet)
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
i=i+1
Loop
datatable.ImportSheet語句是導(dǎo)入Excel外部文件到DataTable的Action1中,do-loop結(jié)構(gòu)依然是為了使多組數(shù)據(jù)循環(huán)執(zhí)行下去。
3.5 使用XML文件實(shí)現(xiàn)參數(shù)化
先在腳本根目錄中創(chuàng)建XML文件,將內(nèi)容輸入文件中,輸入格式如圖6。
QTP腳本代碼如下:
set xmldoc=CreateObject("microsoft.xmldom")
TestPath = Environment("TestDir")&"\ login.xml"
xmldoc.load(TestPath)
Set Root=xmldoc.documentElement
For i = 0 To Root.childNodes.Length-1
systemutil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
Set TestCases = Root.childNodes.Item(i)
For j = 0 To TestCases.childNodes.Length-1
Set TestCase = TestCases.childNodes.Item(j)
If cstr(TestCase.nodeName)="UserName" Then
Dialog("Login").WinEdit("Agent Name:").Set TestCase.text
end if
If cstr(TestCase.nodeName)="PW" Then
Dialog("Login").WinEdit("Password:").SetSecure TestCase.text End If
Next
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
wait(3)
Next
Set root=nothing
Set xml=nothing
QTP腳本中用到了雙層for語句,外層for語句用于多組數(shù)據(jù)的循環(huán),內(nèi)層for用于同組數(shù)據(jù)多個(gè)字段間的循環(huán)。
4 結(jié)論
通過參數(shù)化方式,從外部數(shù)據(jù)源或數(shù)據(jù)產(chǎn)生器讀取測(cè)試數(shù)據(jù),從而擴(kuò)大測(cè)試的覆蓋面,提高了測(cè)試的靈活性。除了以上方式實(shí)現(xiàn)參數(shù)化,還可以使用數(shù)據(jù)庫(kù)表作為數(shù)據(jù)源。在實(shí)際的測(cè)試工作中,我們可以根據(jù)需要靈活組合方式來進(jìn)行使用。
【參考文獻(xiàn)】
[1]王磊.關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測(cè)試框架設(shè)計(jì)與實(shí)現(xiàn)[J].電子測(cè)試,2010,41(8):91-97.
[2]王蕾.基于數(shù)據(jù)驅(qū)動(dòng)的軟件自動(dòng)化測(cè)試框架系統(tǒng)的研究與實(shí)現(xiàn)EJ1[J].軟件導(dǎo)刊,2009,38(6):33-34.
[3]陳能技.QTP自動(dòng)化測(cè)試技術(shù)進(jìn)階[M].北京:電子工業(yè)出版社,2010.
[責(zé)任編輯:謝慶云]
Do while(i<=rowcount)
systemUtil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
datatable.SetCurrentRow (i)
Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtLocalSheet)
Dialog("Login").WinEdit("Password:").Set DataTable("pwd", dtLocalSheet)
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
i=i+1
Loop
datatable.ImportSheet語句是導(dǎo)入Excel外部文件到DataTable的Action1中,do-loop結(jié)構(gòu)依然是為了使多組數(shù)據(jù)循環(huán)執(zhí)行下去。
3.5 使用XML文件實(shí)現(xiàn)參數(shù)化
先在腳本根目錄中創(chuàng)建XML文件,將內(nèi)容輸入文件中,輸入格式如圖6。
QTP腳本代碼如下:
set xmldoc=CreateObject("microsoft.xmldom")
TestPath = Environment("TestDir")&"\ login.xml"
xmldoc.load(TestPath)
Set Root=xmldoc.documentElement
For i = 0 To Root.childNodes.Length-1
systemutil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
Set TestCases = Root.childNodes.Item(i)
For j = 0 To TestCases.childNodes.Length-1
Set TestCase = TestCases.childNodes.Item(j)
If cstr(TestCase.nodeName)="UserName" Then
Dialog("Login").WinEdit("Agent Name:").Set TestCase.text
end if
If cstr(TestCase.nodeName)="PW" Then
Dialog("Login").WinEdit("Password:").SetSecure TestCase.text End If
Next
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
wait(3)
Next
Set root=nothing
Set xml=nothing
QTP腳本中用到了雙層for語句,外層for語句用于多組數(shù)據(jù)的循環(huán),內(nèi)層for用于同組數(shù)據(jù)多個(gè)字段間的循環(huán)。
4 結(jié)論
通過參數(shù)化方式,從外部數(shù)據(jù)源或數(shù)據(jù)產(chǎn)生器讀取測(cè)試數(shù)據(jù),從而擴(kuò)大測(cè)試的覆蓋面,提高了測(cè)試的靈活性。除了以上方式實(shí)現(xiàn)參數(shù)化,還可以使用數(shù)據(jù)庫(kù)表作為數(shù)據(jù)源。在實(shí)際的測(cè)試工作中,我們可以根據(jù)需要靈活組合方式來進(jìn)行使用。
【參考文獻(xiàn)】
[1]王磊.關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測(cè)試框架設(shè)計(jì)與實(shí)現(xiàn)[J].電子測(cè)試,2010,41(8):91-97.
[2]王蕾.基于數(shù)據(jù)驅(qū)動(dòng)的軟件自動(dòng)化測(cè)試框架系統(tǒng)的研究與實(shí)現(xiàn)EJ1[J].軟件導(dǎo)刊,2009,38(6):33-34.
[3]陳能技.QTP自動(dòng)化測(cè)試技術(shù)進(jìn)階[M].北京:電子工業(yè)出版社,2010.
[責(zé)任編輯:謝慶云]
Do while(i<=rowcount)
systemUtil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
datatable.SetCurrentRow (i)
Dialog("Login").WinEdit("Agent Name:").Set DataTable("user", dtLocalSheet)
Dialog("Login").WinEdit("Password:").Set DataTable("pwd", dtLocalSheet)
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
i=i+1
Loop
datatable.ImportSheet語句是導(dǎo)入Excel外部文件到DataTable的Action1中,do-loop結(jié)構(gòu)依然是為了使多組數(shù)據(jù)循環(huán)執(zhí)行下去。
3.5 使用XML文件實(shí)現(xiàn)參數(shù)化
先在腳本根目錄中創(chuàng)建XML文件,將內(nèi)容輸入文件中,輸入格式如圖6。
QTP腳本代碼如下:
set xmldoc=CreateObject("microsoft.xmldom")
TestPath = Environment("TestDir")&"\ login.xml"
xmldoc.load(TestPath)
Set Root=xmldoc.documentElement
For i = 0 To Root.childNodes.Length-1
systemutil.Run "D:\Program Files\HP\QuickTest Professional\samples\flight\app\flight4a.exe","","",""
Set TestCases = Root.childNodes.Item(i)
For j = 0 To TestCases.childNodes.Length-1
Set TestCase = TestCases.childNodes.Item(j)
If cstr(TestCase.nodeName)="UserName" Then
Dialog("Login").WinEdit("Agent Name:").Set TestCase.text
end if
If cstr(TestCase.nodeName)="PW" Then
Dialog("Login").WinEdit("Password:").SetSecure TestCase.text End If
Next
Dialog("Login").WinButton("OK").Click
If Dialog("Login").Dialog("Flight Reservations").Exist (5) then
Dialog("Login").Dialog("Flight Reservations").winbutton("確定").Click
Dialog("Login").winbutton("cancel").Click
else
Window("Flight Reservation").Close
end if
wait(3)
Next
Set root=nothing
Set xml=nothing
QTP腳本中用到了雙層for語句,外層for語句用于多組數(shù)據(jù)的循環(huán),內(nèi)層for用于同組數(shù)據(jù)多個(gè)字段間的循環(huán)。
4 結(jié)論
通過參數(shù)化方式,從外部數(shù)據(jù)源或數(shù)據(jù)產(chǎn)生器讀取測(cè)試數(shù)據(jù),從而擴(kuò)大測(cè)試的覆蓋面,提高了測(cè)試的靈活性。除了以上方式實(shí)現(xiàn)參數(shù)化,還可以使用數(shù)據(jù)庫(kù)表作為數(shù)據(jù)源。在實(shí)際的測(cè)試工作中,我們可以根據(jù)需要靈活組合方式來進(jìn)行使用。
【參考文獻(xiàn)】
[1]王磊.關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測(cè)試框架設(shè)計(jì)與實(shí)現(xiàn)[J].電子測(cè)試,2010,41(8):91-97.
[2]王蕾.基于數(shù)據(jù)驅(qū)動(dòng)的軟件自動(dòng)化測(cè)試框架系統(tǒng)的研究與實(shí)現(xiàn)EJ1[J].軟件導(dǎo)刊,2009,38(6):33-34.
[3]陳能技.QTP自動(dòng)化測(cè)試技術(shù)進(jìn)階[M].北京:電子工業(yè)出版社,2010.
[責(zé)任編輯:謝慶云]