1.事務的開始和結束名稱需要相同
lr_start_transaction(“transaction_name”);
…//事務處理
lr_end_transaction(“transaction_name”,LR_AUTO);
2.事務和子事務
在VuGen中可以通過事務來完成一組操作的響應時間監控,如果想監控某一個事務中某一步操作的響應時間,就要使用子事務來完成。當然也可以使用事務嵌套
lr_start_sub_transaction(“子事務名”, “父事務名”);
lr_end_sub_transaction(“子事務名”, 子事務狀態);
注意:子事務和父事務很像,但是父事務支持的很多函數在子事務中都無法實現,所以應酌情考慮。
例:做一個登錄的事務,同時把打開登錄頁面和登錄操作都做成一個事務,這樣就可以得到三個事務的時間:打開頁面和登錄操作及整個操作的時間。
Action()
{
//開始登錄事務
lr_start_transaction("login");
//打開登錄界面
lr_start_sub_transaction("loginpage", "login");
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t16.inf",
"Mode=HTML",
LAST);
lr_end_sub_transaction("loginpage", LR_AUTO);
lr_think_time(4);
//提交登錄頁面的表單
lr_start_sub_transaction("submit", "login");
web_submit_form("login.pl",
"Snapshot=t17.inf",
ITEMDATA,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
lr_end_sub_transaction("submit", LR_AUTO);
lr_end_transaction("login", LR_AUTO);
}
運行結果:
3.事務狀態
在默認情況下使用LR_AUTO來作為事務狀態,對於一個事務有以下4個狀態可以選擇。
1) LR_AUTO
指事務的狀態由系統自動根據默認規則來判斷,結果為PASS/FAIL/STOP
LR_AUTO也是根據服務器的返回狀態信息來決定事務是以LR_PASS狀態通過還是以LR_FAIL狀態結束,只要服務器返回頁面,那么事務就會認為請求成功發出去了,服務器看懂了請求也返回了內容,自然事務就是PASS狀態。
這樣由於事務的自動判斷,導致雖然操作失敗的,但是得到了一個響應時間,並且這個響應時間又沒正確反映出做這件事情的真正時間,最終影響測試結果。添加檢測函數有時候可以解決這個問題
例:判斷是否登錄成功(以lr自帶web站點為例)
Action2()
{
lr_start_transaction("login");
//打開登錄界面
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t16.inf",
"Mode=HTML",
LAST);
lr_think_time(4);
//注意函數的位置
// jojo1為要查找的文本(實際文本如上圖,jojo,僅在登錄后才出現,這里為了演示故意找不存在的文本)
web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo1", LAST);
//提交登錄頁面的表單
web_submit_form("login.pl",
"Snapshot=t17.inf",
ITEMDATA,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
lr_think_time(4);
if(atoi(lr_eval_string("{login_times}")) >= 1) {//找到“jojo”,說明登錄成功
lr_end_transaction("login", LR_PASS);}
else{ //未找到,說明登錄失敗
lr_end_transaction("login", LR_FAIL);}
return 0;
}
運行結果:
2) LR_PASS
指事務是以PASS狀態通過的,說明改事務正確地完成了,並且記錄下對應的時間,這個時間就是指做這件事情所需要消耗的時間。
3) LR_FAIL
LR_FAIL是指事務以FAIL狀態結束,該事務是一個失敗的事務,沒有完成事務中腳本應該達到的效果,得到的時間不是正確操作的時間,這個時間在后期的統計中將被獨立統計。
4) LR_STOP
LR_STOP將事務以STOP狀態停止。
說明:
事務的PASS和FAIL狀態會在場景的對應計數器中記錄,包括通過的次數和事務的響應時間,方便后期分析改事務的吞吐量以及響應時間的變化情況
4.事務相關的函數
//獲得對應事務達到該函數運行位置時持續的時間,返回double類型
lr_get_transaction_duration(“事務名”);
//獲得對應事務達到該函數運行位置時的wasted時間,返回double類型。
lr_get_transaction_wasted_time(“事務名”);
//為一個事務添加wasted時間,無返回值
lr_wasted_time(毫秒)
//將一個事務暫停,該函數后的操作都不會被記錄事務時間
lr_stop_transaction(“事務名”);
Action2()
{
double duration = 0;
double wastedtime = 0;
lr_start_transaction("login");
//打開登錄界面
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t16.inf",
"Mode=HTML",
LAST);
lr_think_time(4);
//事務達到該函數運行位置時持續的時間
duration = lr_get_transaction_duration("login");
lr_output_message("duration %f", duration);
//事務達到該函數運行位置時浪費的時間
wastedtime = lr_get_transaction_wasted_time("login");
lr_output_message("wastedtime %f", wastedtime);
//為事務添加一個浪費時間 5s//該浪費時間無法直接通過lr_get_transaction_wasted_time獲得
lr_wasted_time(5);
wastedtime = lr_get_transaction_wasted_time("login");
lr_output_message("wastedtime %f", wastedtime);
//暫停事務
lr_stop_transaction("login");
//注意函數的位置
web_reg_find("Search=Body", "SaveCount=login_times", "Text=jojo", LAST);
//提交登錄頁面的表單
web_submit_form("login.pl",
"Snapshot=t17.inf",
ITEMDATA,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=0", ENDITEM,
"Name=login.y", "Value=0", ENDITEM,
LAST);
lr_think_time(4);
//事務達到該函數運行位置時浪費的時間
wastedtime = lr_get_transaction_wasted_time("login");
lr_output_message("wastedtime %f", wastedtime);
if(atoi(lr_eval_string("{login_times}")) >= 1)
lr_end_transaction("login", LR_PASS);
else
lr_end_transaction("login", LR_FAIL);
return 0;
}
注意:通過代碼stop事務后可以重新通過lr_start_transaction函數恢復被暫停的事務
5.包含“資源下載”的事務處理
一般情況都可以十分簡單地獲得請求的響應時間,但是對於下載操作來說就並不是那么方便了,這個時候需要利用一個web_get_int_property()函數來解決。
Action()
{
int i;
lr_start_transaction(“download”);
web_url(“LoadRunner”,”RUL=http://127.0.0.1/loadrunner.iso”,LAST); //下載操作請求
i=web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
if(i>5000) //當下載的文件大小大於5000個字節時認為下載成功,否則失敗。
lr_end_transaction(“download”,LR_PASS);
else
lr_end_transaction(“download”,LR_FAIL);
}
一般來說,對於下載操作的性能測試集中在需要多少時間彈出下載對話框,而后面的內容其實屬於網絡帶寬的問題了,另一個方面現在很少使用IE進行直接下載,而采用迅雷一類的p2p下載工具,所以很少考慮具體下載文件操作對網絡和服務器讀寫操作的影響。