首先談一下VuGen確定腳本運行成功的判斷條件。在錄制編寫腳本后,通常就會進行回放,如果回放通過沒有出現(xiàn)錯誤,就認為腳本是正確的。究竟VuGen怎么區(qū)分腳本是否回放正確呢?細心的朋友會發(fā)現(xiàn),基本上所有腳本回放錯誤都是因為404錯誤,也就是頁面無法找到,而只要頁面返回了,VuGen都不會提示任何錯誤。例如前面登錄Web Tours網站的腳本,由于沒有做關聯(lián)操作而導致登錄失敗,但是腳本還是執(zhí)行成功了,在Test Results中顯示為PASS狀態(tài)。
VuGen判斷腳本是否執(zhí)行成功是根據(jù)服務器返回的狀態(tài)來確定的,如果服務器返回的HTTP狀態(tài)為200 OK,那么VuGen就認為腳本正確地運行了,并且是運行通過的。在絕大多數(shù)系統(tǒng)出錯時會返回錯誤頁面嗎?不會,一般系統(tǒng)都會返回一個消息提示框,來提升用戶感受。例如:“網站忙,請稍候”。其實這個時候網站已經無法正確響應用戶請求了,但是VuGen腳本無法識別,會錯誤地認為網站還能正確訪問,導致分析錯誤。所以這時需要一種檢查點函數(shù)幫助驗證請求發(fā)送出去后,服務器的返回是不是期望的內容,如果不是,那么就說明服務器無法提供正常的服務了。
檢查點函數(shù)和關聯(lián)函數(shù)比較相似,同樣也是一個注冊型函數(shù)web_reg_find()。該函數(shù)能夠對服務器返回的內容進行檢查。
例如:Web Tours的注冊操作,在注冊成功后,服務器會返回以下內容:
Thank you, test1, for registering and welcome to the Web Tours family. We hope we can meet all your current and future travel needs. If you have any questions, feel free to ask our support staff. Click below when you're ready to plan your dream trip...
這里帶下畫線的是注冊用戶名,只要服務器返回以上的內容那么就說明注冊成功了,否則就是注冊失敗,腳本回放失敗。先錄制一個注冊用戶的腳本,如下所示:
Action()
{
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
web_url("sign up now", "URL=http://127.0.0.1:1080/WebTours/login.pl? username=&password=&getInfo=true",
"TargetFrame=body",
"Resource=0",
"RecContentType=text/html",
"Referer=http://127.0.0.1:1080/WebTours/home.html",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
web_submit_data("login.pl",
"Action=http://127.0.0.1:1080/WebTours/login.pl",
"Method=POST",
"TargetFrame=info",
"RecContentType=text/html", "Referer=http://127.0.0.1:1080/ WebTours/login.pl?username=&password=&getInfo=true",
"Snapshot=t3.inf",
"Mode=HTML",
ITEMDATA,
"Name=username", "Value=test2", ENDITEM,
"Name=password", "Value=test2", ENDITEM,
"Name=passwordConfirm", "Value=test2", ENDITEM,
"Name=firstName", "Value=", ENDITEM,
"Name=lastName", "Value=", ENDITEM,
"Name=address1", "Value=", ENDITEM,
"Name=address2", "Value=", ENDITEM,
"Name=register.x", "Value=34", ENDITEM,
"Name=register.y", "Value=9", ENDITEM,
LAST);
return 0;
}
回放這個腳本,查看Test Results中顯示的結果是運行通過,但是如果認真看一下最后一步的截圖,就會發(fā)現(xiàn)回放的腳本根本就沒有執(zhí)行成功,因為test2用戶已經存在了,回放不會注冊任何新的用戶,但是VuGen不會判斷注冊失敗的錯誤,這里必須通過檢查點函數(shù)來解決。
現(xiàn)在在web_submit_data()函數(shù)前添加檢查點函數(shù)(注冊型函數(shù)一定要寫在請求前)。打開Insert菜單下的New step選項,找到web_reg_find()函數(shù)并進行添加,如圖3.155所示。
圖3.155 web_reg_find()函數(shù)設置界面
我們在進行性能測試而不是功能測試,雖然檢查點也可以很好地實現(xiàn)功能測試,但在大多數(shù)時候并不需要太在意功能點是否全部正確,只要確?;緲I(yè)務操作正確即可(如果希望測試系統(tǒng)在高負載情況下的功能是否正??梢栽谶\行場景中調用QTP實現(xiàn),具體內容參考第4.4節(jié))。
web_reg_find()文本檢查點函數(shù)提供了一種對服務器返回內容進行查詢的功能,和關聯(lián)的不同之處在于檢查點函數(shù)只能返回檢索到內容的次數(shù)。
Ÿ Search for specific Text
需要查詢的標準文本,該功能和Word中的查找功能十分相似。在服務器返回的內容中查找特定的字符串,內容支持參數(shù)化,并且支持和關聯(lián)相同的通配符和識別方式。
在這里輸入需要查找的字符串即可,檢查點函數(shù)將會找出服務器返回中是否存在需要查找的內容。
Ÿ Search for Text by start and end of string
文本檢查點函數(shù)也同樣提供了根據(jù)左右邊界進行查找的功能,選項參考關聯(lián)函數(shù)。
Ÿ Search in
設置在服務器返回的哪部分數(shù)據(jù)中進行查詢。這里提供了All、Headers、Body三個選項,和關聯(lián)函數(shù)相同,Headers是指HTTP返回的包頭部分;而Body是指返回HTTP的正文部分,一般來說需要檢查的內容都存放在Body中。
Ÿ Save count
這是文本檢查點很特別的功能,它將記錄查找內容的出現(xiàn)次數(shù)并且存放到一個參數(shù)中,這里可以填寫一個參數(shù)名稱來存放計數(shù)結果。
Ÿ Fail if
設置在什么情況下文本檢查點函數(shù)錯誤,提供了兩個選項:Found、NotFound。如果選擇Found也就是說如果在服務器返回中存在需要檢查的對象,那么文本檢查點函數(shù)出錯;選擇NotFound則相反,如果沒有找到對應的內容,那么文本檢查點函數(shù)出錯。
檢查點函數(shù)的錯誤會導致整個腳本運行結果的失敗,通過這個功能可以方便地定位腳本運行中的邏輯錯誤。
接著來完成注冊用戶的腳本,實現(xiàn)腳本每次運行必須完成用戶的注冊,否則腳本運行失敗。在腳本中添加檢查點函數(shù)。在Search for specific Text中輸入以下內容:for registering and welcome to the Web Tours family,然后設置Search in為Body、Save count為regcheck、Fail if為Not Found,如圖3.156所示。
圖3.156 設置web_reg_find函數(shù)
確定后,得到檢查點函數(shù):
web_reg_find("Fail=NotFound",
"Search=Body",
"SaveCount=regcheck",
"Text=for registering and welcome to the Web Tours family",
LAST);
現(xiàn)在再回放一下腳本看看效果,會得到以下錯誤信息:
Action.c(36): Error -26366: "Text=for registering and welcome to the Web Tours family" not found for web_reg_find [MsgId: MERR-26366]
Action.c(36): web_submit_data("login.pl") highest severity level was "ERROR", 2630 body bytes, 226 header bytes [MsgId: MMSG-26388]
在服務器的返回中沒有發(fā)現(xiàn)我們想要搜索的東西,所以腳本回放錯誤,整個Test Results是以FAIL結束的。接著修改一下注冊的用戶信息,看看檢查點函數(shù)是否能查詢得到相關信息。修改用戶名后,再次運行腳本。
Action.c(36): Registered web_reg_find successful for "Text=for registering and welcome to the Web Tours family" (count=1) [MsgId: MMSG-26364]
Action.c(36): web_submit_data("login.pl") was successful, 1020 body bytes, 343 header bytes [MsgId: MMSG-26386]
可以看到web_reg_find()函數(shù)成功地查詢到了需要的內容,并且提示count=1,說明找到了1次該內容,腳本成功運行,Test Results狀態(tài)為PASS。
如果打開了參數(shù)存取值日志選項,可以看到regcheck參數(shù)的值,如果沒有查詢到那么regcheck的值為0,反之regcheck存放count對應的記錄條數(shù)。檢查點函數(shù)有效地對腳本運行進行了監(jiān)控,確保了腳本操作的正確性。另外一方面也可以通過它來進行一些邏輯分支的判斷和頁面的內容檢查工作。
有些時候我們需要確保每個請求中都包含一個檢查信息,然而手動添加檢查點函數(shù)非常麻煩,這個時候可以使用自動檢查點規(guī)則,通過建立一個新的規(guī)則,可以在回放時對所有的返回內容進行檢查工作。
打開Run-time Settings/ContentCheck,如圖3.157所示。
圖3.157 ContentCheck設置窗口
在這里單擊New Application按鈕來添加一個應用,然后在這個應用下添加對應的規(guī)則,單擊New Rule按鈕。這里可以在Search for Text中填寫需要檢查的內容,也可以在下面的Search by prefix and suffix中填寫需要檢查的邊界,大小寫需要區(qū)分的話將Match case選中,最后確定該規(guī)則在什么情況下失敗。
如果希望腳本檢查每個頁面是否包含logo.gif這個圖片,那么可以在這里添加一個圖片檢查規(guī)則。在Search for Text 中填寫images/logo.gif,設置Fail if為Not Found,如圖3.158所示。
圖3.158 設置全局檢查點規(guī)則
運行腳本時,如果有頁面返回的代碼中沒有包含images/logo.gif時,就能看到以下錯誤:
Action.c(3): Error -26370: ContentCheck Rule "Rule_2" in Application "discuz" triggered. Text "images/logo.gif" not matched [MsgId: MERR-26370]
Action.c(3): web_url("mainpage") highest severity level was "ERROR", 114808 body bytes, 4592 header bytes [MsgId: MMSG-26388]
如果返回的代碼中包含images/logo.gif則不會有任何提示出現(xiàn)。通過自動檢查點,可以輕松地對頁面中固定出現(xiàn)的內容進行校驗工作。也可以通過web_global_verification()函數(shù)實現(xiàn)全局檢查點功能。
通過web_image_check()函數(shù)可以檢查頁面上的圖片。例如:
web_image_check(“函數(shù)標題”,”ALT=圖片說明”,LAST);
圖片檢查點函數(shù)必須在Run-time Settings中打開Preferences下的Enable Image and text check才有效。