軟件測試中使用WinRunner 進行測試給新手們的幾點建議
一、分解TestCase
在大型程序測試中,往往有很多任務是可以分開來Record。同時,如果錄制的代碼過長的,進行調試是很麻煩的事情,此外如果今后某一部分的程序進行了修改的話,修改和重新錄制的工作也是非常痛苦的一件使用。因此我們可以將一個TestCase 進行分解,分解TestCase 可以采用以下幾種方式
1、將任務分段,比如Log、Logout、公共窗口的打開、關閉
2、錯誤處理的分類,比如將某一輸入項目的各中錯誤輸入分開錄制
3、公共界面的操作函數化統一處理,這種方式主要可以象移動BOSS 的業務受理等不
同窗口使用同一子界面的情況,如DELPHI/C++ Builder 中的Frame。將不同任務(TestCASE)的分解之后,我們可以使用call 函數及自定義函數機制來調用不同的子Script、函數來完成一個的testCase
二、通過隨機組合實現大規模路徑覆蓋
有時候我們需要將一組數據隨機組合來進行大量數據測試,如填寫某些表單。那么我們有兩種辦法:一是使用外邊工具隨機生成大量數據,也可用使用先將各個數據按測試要求生成一小組數據,然后使用rand 方法隨機抽取數據來測試
偽代碼如下
data a[];
date b[];
for (i="0;i<要測試的次數;i++){
ca=a[rand()]
cb=b[rand()]
dosomething;
}
使用這種代碼的好處是隨意調整測試力度,缺點是數據單一,不想外邊工具一樣生產的數據的多樣化。如果想根據數據分段標準動態產生不同數據,應該使用其他編程工具來生產而不應采用這種辦法。
三、動態修改chk 文件實行參數化的動態Check
有時候我們知道在測試過程中的某些數據是動態生產的,比如某些按順序或隨機產生的單號,而我們又往往需要根據這個單號進行一些判斷,比如數據庫中對應的數據是否完整。還有,當我們需要根據輸入的某些條件來判斷輸出的條件是否正確,這個時候WINRUNNER 就無能為力了,因為它目前沒有提來實現參數化的Check。但是我們可用使用WINRUNNER 的函數及WINNRUNNER 的錄制功能,先錄制一個使用ULTRAEDIT(或類似工具)手工修改chk 文件的函數。然后將要修改的內容參數化,在主SCRIPT 執行Check 以前先調用該函數。
四、在Script 里面管理GUI
使用WINRUNNER 都知道GUI 文件的重要性,MI 推薦的一種方式是專人來管理GUI 文件,整個測試使用同一個/系列GUI 文件。但實際我覺得這很困難的,特別是程序比較的話,光是找出所有的窗口就已經是很痛苦的一件事情。我認為應該首先應該將GUI 與SCRIPT 同時存儲在同一目錄下。然后使用GUI_load 在SCRIPT 開始以前就裝載GUI,在SCRIPT 開始增加:
if (GUI_load(".\\login.gui")!="0)
{
pause ("Can't load login.gui");
texit;
}
使用Winner 做過復雜測試的可能會問,如果不同GUI 文件中的對象名稱相同的話,運行時候就會出問題。因此我們應該在SCRIPT 完畢的時候加入GUI_close(".\\login.gui");
五、注意恢復測試前的狀態
此外,如果我們要連續運行多個測試CASE、就必須考慮將被測試程序恢復測試前的狀態,比如我們在測試SCRIPT A 中打開了窗口A,如果下一個TESTCASE 不需要用到窗口A,那么在SCRIPT A 窗口A。這樣下一個TESTCASE 才能正常運行。如果我們采用采用批處理及CALL 的方式來組織SCRIPT 的話,就應該堅持這樣一個原則:“誰打開、誰關閉”,這樣才便于管理。此外如果對數據庫的操作也要根據具體要求考慮恢復。這些操作可以考慮通過錄制通過錄制庫客戶端的操作來實現。
六、WinRunner 腳本標準格式
(一)目錄結構
存放目錄要求:
1、根目錄與項目名稱相同,如江西移動BOSS 測試目錄為JXBOSS
2、根目錄下應該是按子項目存放,如SALES、ACCOUNT。如果有公共腳本,存放在Share 目錄下面
3、子項目下面應該根據功能/TestCase 來存放,如果有公共腳本也應該存放在Share 目錄下
4、為存取及備份方便,目錄不能使用中文。使用的名稱應該盡量與開發保持一致
5、GUI 文件應該存放在腳本的同一目錄,并且名稱相同
6、正確性測試(使用完全正確數據來檢查程序功能是否完成)目錄名稱規定為
validity
以下是一個目錄例子
JxBoss
-Sales
--ChangeSimCard
--validity
--CheckSimNoExistAnIdError
--Share
--Share
-Account
腳本要求
注釋要求
腳本創建及修改說明注釋
每個腳本的開頭注釋格式如下:
#腳本名稱:文件名稱
#創建人:創建人
#創建日期:格式為YYYY/MM/DD
#功能:腳本完成的功能描述
#運行前要求:運行前的要打開的窗口及狀態要求、數據庫中的數據要求、被測試程序運行目錄等
#參考文檔:描述錄制代碼是參考的有關設計測試文檔
#修改歷史:
# 修改人:
# 修改 http://www.csai.cn 格式為YYYY/MM/DD
# 主要修改內容:
注意創建人及修改人必須是中文完整姓名,不允許使用其它任何名稱。運行前的要求一定要描述清楚
子功能注釋
在各小段功能前應該加入功能注釋,注意不能只是WinRunner 自己產生的注釋 如:
# 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);
注釋可以使用英文或中文。
修改代碼說明注釋
在具體修改的代碼附近應該加入如下注釋
#修改人
#修改日期
#修改原因/增加功能
注釋可以放在一行中,簡單修改可以忽略“修改原因/增加功能”,復雜修改應該不能忽略(簡單及復雜標準待定)
代碼要求
路徑要求
代碼中使用的路徑都應該使用相對路徑,不允許出現類似“d:\\”、“\\”下的代碼,應該使用類似“..\\..\\”的代碼。
在Script 里面打開和關閉GUI各Script 的GUI 的文件應該分開保存在與Script 保存在同一個目錄,應該使用用GUI_load 在SCRIPT 開始以前就裝載GUI,在SCRIPT 開始增加:
if (GUI_load(".\\login.gui")!="0)
{pause ("Can't load login.gui");
texit;
}
在SCRIPT 完畢的時候加入GUI_close(".\\login.gui");關閉GUI,注意代碼中的路徑一定要使用相對路徑。
錯誤報告
在使用錯誤報告的時候,應該注意包括出錯的腳本文件名稱,這樣當腳本文件被其他腳本調用時候,也能很清楚在什么地方沒有通過。Report_msg 的參數格式定義為“文件名稱:錯誤描述”。同時鑒于WinRunner 的Check 函數不能提供清楚的錯誤報告,要求錯誤報告使用以方式
if ( win_check_bitmap("Flight Reservations", "Img1", 1)!="E_OK)
{
report_msg("DateCheck:月份輸入錯誤提示不對!");
}
附件:一個完整的例子
#腳本名稱:DateCheck
#創建人:謝慧強
#創建日期:2002/09/08
#功能:檢查FLIGHTA 程序在輸入錯誤月份的時候提示是否正確
#運行前要求:要求FLIGHA 進入定票窗口(New_Order 狀態)且無任何數據輸入
# 或者FLIGHTA 沒有運行,這時候要求FLIGHTA。EXE 位
# 于E:\\Program Files\\Mercury
Interactive\\WinRunner\\samples\\flight\\app\\flight1a.exe
#參考文檔:無
#修改歷史:
# 修改人:謝慧強
# 修改 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");
注意恢復測試前的狀態
此外,如果我們要連續運行多個測試CASE、就必須考慮將被測試程式恢復測試前的狀
態,比如我們在測試SCRIPT A 中打開了窗口A,如果下一個TESTCASE 不必用到窗口A,
那么在SCRIPT A 窗口A。這樣下一個TESTCASE 才能正常運行。
如果我們采用采用批處理及CALL 的方式來組織SCRIPT 的話,就應該堅持這樣一個原
則:“誰打開、誰關閉”,這樣才便于管理。
此外如果對數據庫的操作也要根據具體需求考慮恢復。這些操作能考慮通過錄制通過
數據庫客戶端的操作來實現。
文章來源于領測軟件測試網 http://www.kjueaiud.com/