軟件測試中使用WinRunner 進(jìn)行測試給新手們的幾點(diǎn)建議
一、分解TestCase
在大型程序測試中,往往有很多任務(wù)是可以分開(kāi)來(lái)Record。同時(shí),如果錄制的代碼過(guò)長(cháng)的,進(jìn)行調試是很麻煩的事情,此外如果今后某一部分的程序進(jìn)行了修改的話(huà),修改和重新錄制的工作也是非常痛苦的一件使用。因此我們可以將一個(gè)TestCase 進(jìn)行分解,分解TestCase 可以采用以下幾種方式
1、將任務(wù)分段,比如Log、Logout、公共窗口的打開(kāi)、關(guān)閉
2、錯誤處理的分類(lèi),比如將某一輸入項目的各中錯誤輸入分開(kāi)錄制
3、公共界面的操作函數化統一處理,這種方式主要可以象移動(dòng)BOSS 的業(yè)務(wù)受理等不
同窗口使用同一子界面的情況,如DELPHI/C++ Builder 中的Frame。將不同任務(wù)(TestCASE)的分解之后,我們可以使用call 函數及自定義函數機制來(lái)調用不同的子Script、函數來(lái)完成一個(gè)的testCase
二、通過(guò)隨機組合實(shí)現大規模路徑覆蓋
有時(shí)候我們需要將一組數據隨機組合來(lái)進(jìn)行大量數據測試,如填寫(xiě)某些表單。那么我們有兩種辦法:一是使用外邊工具隨機生成大量數據,也可用使用先將各個(gè)數據按測試要求生成一小組數據,然后使用rand 方法隨機抽取數據來(lái)測試
偽代碼如下
data a[];
date b[];
for (i="0;i<要測試的次數;i++){
ca=a[rand()]
cb=b[rand()]
dosomething;
}
使用這種代碼的好處是隨意調整測試力度,缺點(diǎn)是數據單一,不想外邊工具一樣生產(chǎn)的數據的多樣化。如果想根據數據分段標準動(dòng)態(tài)產(chǎn)生不同數據,應該使用其他編程工具來(lái)生產(chǎn)而不應采用這種辦法。
三、動(dòng)態(tài)修改chk 文件實(shí)行參數化的動(dòng)態(tài)Check
有時(shí)候我們知道在測試過(guò)程中的某些數據是動(dòng)態(tài)生產(chǎn)的,比如某些按順序或隨機產(chǎn)生的單號,而我們又往往需要根據這個(gè)單號進(jìn)行一些判斷,比如數據庫中對應的數據是否完整。還有,當我們需要根據輸入的某些條件來(lái)判斷輸出的條件是否正確,這個(gè)時(shí)候WINRUNNER 就無(wú)能為力了,因為它目前沒(méi)有提來(lái)實(shí)現參數化的Check。但是我們可用使用WINRUNNER 的函數及WINNRUNNER 的錄制功能,先錄制一個(gè)使用ULTRAEDIT(或類(lèi)似工具)手工修改chk 文件的函數。然后將要修改的內容參數化,在主SCRIPT 執行Check 以前先調用該函數。
四、在Script 里面管理GUI
使用WINRUNNER 都知道GUI 文件的重要性,MI 推薦的一種方式是專(zhuān)人來(lái)管理GUI 文件,整個(gè)測試使用同一個(gè)/系列GUI 文件。但實(shí)際我覺(jué)得這很困難的,特別是程序比較的話(huà),光是找出所有的窗口就已經(jīng)是很痛苦的一件事情。我認為應該首先應該將GUI 與SCRIPT 同時(shí)存儲在同一目錄下。然后使用GUI_load 在SCRIPT 開(kāi)始以前就裝載GUI,在SCRIPT 開(kāi)始增加:
if (GUI_load(".\\login.gui")!="0)
{
pause ("Can't load login.gui");
texit;
}
使用Winner 做過(guò)復雜測試的可能會(huì )問(wèn),如果不同GUI 文件中的對象名稱(chēng)相同的話(huà),運行時(shí)候就會(huì )出問(wèn)題。因此我們應該在SCRIPT 完畢的時(shí)候加入GUI_close(".\\login.gui");
五、注意恢復測試前的狀態(tài)
此外,如果我們要連續運行多個(gè)測試CASE、就必須考慮將被測試程序恢復測試前的狀態(tài),比如我們在測試SCRIPT A 中打開(kāi)了窗口A(yíng),如果下一個(gè)TESTCASE 不需要用到窗口A(yíng),那么在SCRIPT A 窗口A(yíng)。這樣下一個(gè)TESTCASE 才能正常運行。如果我們采用采用批處理及CALL 的方式來(lái)組織SCRIPT 的話(huà),就應該堅持這樣一個(gè)原則:“誰(shuí)打開(kāi)、誰(shuí)關(guān)閉”,這樣才便于管理。此外如果對數據庫的操作也要根據具體要求考慮恢復。這些操作可以考慮通過(guò)錄制通過(guò)錄制庫客戶(hù)端的操作來(lái)實(shí)現。
六、WinRunner 腳本標準格式
(一)目錄結構
存放目錄要求:
1、根目錄與項目名稱(chēng)相同,如江西移動(dòng)BOSS 測試目錄為JXBOSS
2、根目錄下應該是按子項目存放,如SALES、ACCOUNT。如果有公共腳本,存放在Share 目錄下面
3、子項目下面應該根據功能/TestCase 來(lái)存放,如果有公共腳本也應該存放在Share 目錄下
4、為存取及備份方便,目錄不能使用中文。使用的名稱(chēng)應該盡量與開(kāi)發(fā)保持一致
5、GUI 文件應該存放在腳本的同一目錄,并且名稱(chēng)相同
6、正確性測試(使用完全正確數據來(lái)檢查程序功能是否完成)目錄名稱(chēng)規定為
validity
以下是一個(gè)目錄例子
JxBoss
-Sales
--ChangeSimCard
--validity
--CheckSimNoExistAnIdError
--Share
--Share
-Account
腳本要求
注釋要求
腳本創(chuàng )建及修改說(shuō)明注釋
每個(gè)腳本的開(kāi)頭注釋格式如下:
#腳本名稱(chēng):文件名稱(chēng)
#創(chuàng )建人:創(chuàng )建人
#創(chuàng )建日期:格式為YYYY/MM/DD
#功能:腳本完成的功能描述
#運行前要求:運行前的要打開(kāi)的窗口及狀態(tài)要求、數據庫中的數據要求、被測試程序運行目錄等
#參考文檔:描述錄制代碼是參考的有關(guān)設計測試文檔
#修改歷史:
# 修改人:
# 修改 http://www.csai.cn 格式為YYYY/MM/DD
# 主要修改內容:
注意創(chuàng )建人及修改人必須是中文完整姓名,不允許使用其它任何名稱(chēng)。運行前的要求一定要描述清楚
子功能注釋
在各小段功能前應該加入功能注釋?zhuān)⒁獠荒苤皇荳inRunner 自己產(chǎn)生的注釋 如:
# insert a record
# Flight Reservation
set_window ("Flight Reservation", 1);
obj_mouse_click ("Button", 13, 16, LEFT);
obj_type ("MSMaskWndClass","101002");
list_select_item ("Fly From:", "London"); # Item Number 2;
list_select_item ("Fly To:", "Paris"); # Item Number 3;
obj_mouse_click ("FLIGHT", 56, 22, LEFT);
注釋可以使用英文或中文。
修改代碼說(shuō)明注釋
在具體修改的代碼附近應該加入如下注釋
#修改人
#修改日期
#修改原因/增加功能
注釋可以放在一行中,簡(jiǎn)單修改可以忽略“修改原因/增加功能”,復雜修改應該不能忽略(簡(jiǎn)單及復雜標準待定)
代碼要求
路徑要求
代碼中使用的路徑都應該使用相對路徑,不允許出現類(lèi)似“d:\\”、“\\”下的代碼,應該使用類(lèi)似“..\\..\\”的代碼。
在Script 里面打開(kāi)和關(guān)閉GUI各Script 的GUI 的文件應該分開(kāi)保存在與Script 保存在同一個(gè)目錄,應該使用用GUI_load 在SCRIPT 開(kāi)始以前就裝載GUI,在SCRIPT 開(kāi)始增加:
if (GUI_load(".\\login.gui")!="0)
{pause ("Can't load login.gui");
texit;
}
在SCRIPT 完畢的時(shí)候加入GUI_close(".\\login.gui");關(guān)閉GUI,注意代碼中的路徑一定要使用相對路徑。
錯誤報告
在使用錯誤報告的時(shí)候,應該注意包括出錯的腳本文件名稱(chēng),這樣當腳本文件被其他腳本調用時(shí)候,也能很清楚在什么地方?jīng)]有通過(guò)。Report_msg 的參數格式定義為“文件名稱(chēng):錯誤描述”。同時(shí)鑒于WinRunner 的Check 函數不能提供清楚的錯誤報告,要求錯誤報告使用以方式
if ( win_check_bitmap("Flight Reservations", "Img1", 1)!="E_OK)
{
report_msg("DateCheck:月份輸入錯誤提示不對!");
}
附件:一個(gè)完整的例子
#腳本名稱(chēng):DateCheck
#創(chuàng )建人:謝慧強
#創(chuàng )建日期:2002/09/08
#功能:檢查FLIGHTA 程序在輸入錯誤月份的時(shí)候提示是否正確
#運行前要求:要求FLIGHA 進(jìn)入定票窗口(New_Order 狀態(tài))且無(wú)任何數據輸入
# 或者FLIGHTA 沒(méi)有運行,這時(shí)候要求FLIGHTA。EXE 位
# 于E:\\Program Files\\Mercury
Interactive\\WinRunner\\samples\\flight\\app\\flight1a.exe
#參考文檔:無(wú)
#修改歷史:
# 修改人:謝慧強
# 修改 http://www.csai.cn 2002/09/09
# 主要修改內容:不采用位圖方式,改為直接判斷字符串內容
#load gui file
#Flight Reservation
if (GUI_load(".\\DateCheck.gui")!="0)
{
report_msg ("DataCheck:Can't load .\\DateCheck.gui");
texit;
}
#Check windows exists ,if don't exist ,call login to open it.
# Flight Reservation
if (win_exists("Flight Reservation")!="E_OK){
pause ("Windows Flight Reservation don't exist");
#texit;
call "..\\login\\login"();
}
#input error month
win_activate ("Flight Reservation");
set_window ("Flight Reservation", 3);
obj_mouse_drag ("Button_4", 17, 6, 17, 7, LEFT);
obj_type ("MSMaskWndClass","301212");
list_select_item ("Fly From:", "Denver"); # Item Number 0;
#check message bitmap
# Flight Reservations_1
set_window ("Flight Reservations", 3);
#2002/09/09 謝慧強
#if ( win_check_bitmap("Flight Reservations", "Img1", 1)!="E_OK)
#static_check_info("Invalid month Entered.The month must be greater than 01 and less than
12.(static)","enabled",1);
if (static_check_info("CheckMessage","label","Invalid month Entered.The month must be
greater than 01 and less than 12.")!="E_OK)
#2002/09/09 謝慧強修改結束
{
report_msg("DateCheck:月份輸入錯誤提示不對!");
}
button_press ("確定");
#close gui file
GUI_close(".\\DateCheck.gui");
注意恢復測試前的狀態(tài)
此外,如果我們要連續運行多個(gè)測試CASE、就必須考慮將被測試程式恢復測試前的狀
態(tài),比如我們在測試SCRIPT A 中打開(kāi)了窗口A(yíng),如果下一個(gè)TESTCASE 不必用到窗口A(yíng),
那么在SCRIPT A 窗口A(yíng)。這樣下一個(gè)TESTCASE 才能正常運行。
如果我們采用采用批處理及CALL 的方式來(lái)組織SCRIPT 的話(huà),就應該堅持這樣一個(gè)原
則:“誰(shuí)打開(kāi)、誰(shuí)關(guān)閉”,這樣才便于管理。
此外如果對數據庫的操作也要根據具體需求考慮恢復。這些操作能考慮通過(guò)錄制通過(guò)
數據庫客戶(hù)端的操作來(lái)實(shí)現。
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/