第一篇:LoadRunner檢查點(diǎn)使用小結(jié)
LR中檢查點(diǎn)有兩種:圖片和文字。常用檢查點(diǎn)函數(shù)如下:
1)web_find()函數(shù)用于從 HTML 頁中搜索指定的文本字符串;
2)web_reg_find()函數(shù)注冊一個(gè)請求,以在下一個(gè)操作函數(shù)(如 web_url)檢索到的HTML網(wǎng)頁上搜索指定的文本字符串;
3)web_image_check()函數(shù)用于從HTML頁面中查找指定的圖片;
4)web_global_verfication()屬于注冊函數(shù),注冊一個(gè)在web頁面中搜索文本字符串的請求,與web_reg_find只在下一個(gè)Action函數(shù)中執(zhí)行搜索不同的是它在之后所有的Action類函數(shù)中執(zhí)行搜索指定的文本字符串; 下面分別介紹以上函數(shù)的用法:
1、web_find()函數(shù)參數(shù)舉例:
web_find(“web_find”,“RighOf=a”,“LeftOf=b”,“What=name”,LAST);參數(shù)解釋:“web_find”定義該查找函數(shù)的名稱;“LeftOf”和“RighOf=”用來定義查找字符的左右邊界;“What=”定義查找內(nèi)容;
例如上述參數(shù)舉例中的意思就是在頁面中查找左邊界為b,右邊界為a,內(nèi)容為name的信息;
使用該函數(shù)注意事項(xiàng):該函數(shù)是在查找頁面中的內(nèi)容,所以要放在要查找的內(nèi)容的后面;該函數(shù)只能在基于HTML模式錄制的腳本中進(jìn)行查找
注意事項(xiàng):使用該函數(shù)時(shí),要在Vuser->Run-Tme Settings中更改下設(shè)置
勾選Enable Image and text check
系統(tǒng)默認(rèn)是不勾選該選項(xiàng)的。
2、web_reg_find()函數(shù)參數(shù)舉例: web_reg_find(“Search=Body”,“SaveCount=ddd”,“Test=aaa”,LAST);參數(shù)解釋: Search用來定義查找范圍,SaveCount定義查找計(jì)數(shù)變量名稱,該參數(shù)可以記錄在緩存中查找內(nèi)容出現(xiàn)的次數(shù),可以使用該值,來判斷要查找的內(nèi)容是否被找到;
例如上述參數(shù)舉例中的意思就是Body中查找內(nèi)容為aaa的信息,并將出現(xiàn)次數(shù)記錄在變量ddd中;
【代碼一:web_reg_find(“Text=Payment Details”,LAST);代碼思路:1.“Payment Details” 為你要檢查的文本;
2.腳本執(zhí)行到此處,若在頁面上找到了這幾個(gè)字符串,那腳本繼續(xù)執(zhí)行下去;若沒有找到,腳本將在此報(bào)錯(cuò)并且結(jié)束。】
【代碼二:web_reg_find(“Text=Payment Details”, “SaveCount=para_count”, LAST);//check 的函數(shù)
web_submit_form(“reservations.pl_2”, //要check的頁面的錄制時(shí)的代碼 “Snapshot=t22.inf”, ITEMDATA, “Name=outboundFlight”, “Value=003;0;06/23/2007”, ENDITEM, “Name=reserveFlights.x”, “Value=61”, ENDITEM, “Name=reserveFlights.y”, “Value=2”, ENDITEM, LAST);if(atoi(lr_eval_string(“{para_count}”))>0)//驗(yàn)證是否找到了頁面上的要檢查的字符串
lr_output_message(“we find the string!”);else lr_output_message(“sorry,don't find the string!”);代碼思路:1.“Payment Details” 為你要檢查的文本;
2.腳本執(zhí)行到此處,不管頁面上是否存在你要檢查的字符串,腳本都不會報(bào)錯(cuò),而是執(zhí)行下去。3.此段代碼將找到的你要檢查的字符串的個(gè)數(shù),存為一個(gè)參數(shù)。然后在頁面代碼的后面,通過檢查這個(gè)參數(shù)的值是否大于0,來判斷是否找到了你所要檢查的字符串。】 【代碼三:
A.web_reg_find(“Text=Payment Detdils”, “Fail=NotFound”,LAST);或 B.web_reg_find(“Text=Payment Detdils”, “Fail=Found”,LAST);代碼思路:
1.“Payment Details” 為你要檢查的文本;
2.若是A代碼:腳本執(zhí)行到此處,若沒有找到check的字符串,腳本將FAIL,并且停止執(zhí)行下去。反之,則一直執(zhí)行下去。
3.若是B代碼:腳本執(zhí)行到此處,若找到check的字符串,腳本將FAIL,并且停止執(zhí)行下去。反之,則一直執(zhí)行下去】
使用該函數(shù)注意事項(xiàng):該函數(shù)是在緩存中查找相應(yīng)的內(nèi)容,所以要放在查找內(nèi)容之前;通常情況下寫在如下六個(gè)函數(shù)之前:Web_castom_request();web_image();web_link();web_submit_data();web_submit_form();web_url(); 使用技巧:在該函數(shù)的參數(shù)中有個(gè)“SaveCount”,該參數(shù)可以記錄在緩存中查找內(nèi)容出現(xiàn)的次數(shù),我們可以使用該值,來判斷要查找的內(nèi)容是否被找到,下面舉個(gè)例子來說明:(引用LR的幫助中的例子)// Run the Web Tours sample web_url(“MercuryWebTours”, “URL=http://localhost/MercuryWebTours/”, “Resource=0”, “RecContentType=text/html”, “Referer=”, “Snapshot=t1.inf”, “Mode=HTML”, LAST);// Set up check for successful login by looking for “Welcome” web_reg_find(“Text=Welcome”, “SaveCount=Welcome_Count”, LAST);// Now log in web_submit_form(“l(fā)ogin.pl”, “Snapshot=t2.inf”, ITEMDATA, “Name=username”, “Value=jojo”, ENDITEM, Name=password“, ”Value=bean“, ENDITEM, ”Name=login.x“, ”Value=35“, ENDITEM, ”Name=login.y“, ”Value=14“, ENDITEM, LAST);// Check result if(atoi(lr_eval_string(”{Welcome_Count}“))> 0){ //判斷如果Welcome字符串出現(xiàn)次數(shù)大于0 lr_output_message(”Log on successful.“);}//在日志中輸出Log on successful else{ //如果出現(xiàn)次數(shù)小于等于
lr_error_message(”Log on failed“);//在日志中輸出Log on failed return(0);} 我覺得這個(gè)方法非常有用,我們可以舉一反三,應(yīng)用到我們實(shí)際的項(xiàng)目 注:在錄制過程中添加的檢查點(diǎn),用到的函數(shù)是web_reg_find(),且參數(shù)只有“Text=”
3、web_image_check()函數(shù)參數(shù)說明: web_image_check(”web_image_check“,”Alt=“,”Src=“,LAST);參數(shù)解釋:“Alt”和“Src”的值直接取該圖片在網(wǎng)頁源代碼中相應(yīng)參數(shù)的值; 注意事項(xiàng):使用該函數(shù)時(shí),要在Vuser->Run-Tme Settings中勾選Enable Image and text check,具體操作請看web_find()中的注意事項(xiàng)。經(jīng)過測試,該函數(shù)用到查找內(nèi)容前面或后面,都不影響查找結(jié)果。舉例說明(腳本)
該腳本記錄的是登陸系統(tǒng)后退出的操作,在腳本中用到atoi()函數(shù)和lr_eval_string(”{SaveCount定義的變量}”)兩個(gè)函數(shù)結(jié)合使用,判斷查找內(nèi)容出現(xiàn)的次數(shù)是否大于0,若大于0,則輸入登錄成功的信息。vuser_init(){ web_url(”xjcost“, ”URL=http://gczj-server8:9205/xjcost/“, ”Resource=0“, ”RecContentType=text/html“, ”Referer=“, ”Snapshot=t1.inf“, ”Mode=HTML“, EXTRARES, ”Url=jsp/images/index/index.swf“, ENDITEM, ”Url=jsp/images/index/xxfb2.gif“, ENDITEM, ”Url=jsp/images/index/ywpt2.gif“, ENDITEM, LAST);web_url(”userAction.struts“, ”URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin“, ”Resource=0“, ”RecContentType=text/html“, ”Referer=“, ”Snapshot=t2.inf“, ”Mode=HTML“, LAST);return 0;} Action(){ lr_start_transaction(”Log_on“);lr_rendezvous(”Log_on“);web_add_cookie(”userAccount=admin;DOMAIN=gczj-server8“);web_reg_find(”Text=歡迎您“, ”SaveCount=歡迎您_Count“, LAST);web_image_check(”web_image_check“, ”Src=/xjcost/jsp/images/index1/edit_01.gif“, LAST);web_submit_data(”userLogin.struts“, ”Action=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin“, ”Method=POST“, ”RecContentType=text/html“, ”Referer=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin“, ”Snapshot=t3.inf“, ”Mode=HTML“, ITEMDATA, ”Name=userAccount“, ”Value=admin“, ENDITEM, ”Name=pwd“, ”Value=1111“, ENDITEM, EXTRARES, ”Url=jsp/images/index1/edit_01a.gif“, ”Referer=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin“, ENDITEM, LAST);web_find(”web_find“, ”What=歡迎您“, LAST);lr_end_transaction(”Log_on“,LR_AUTO);//檢查是否登錄成功
//如果“歡迎您”這個(gè)字符出現(xiàn)次數(shù)大于0,輸出“Log on successfully!”
if(atoi(lr_eval_string(”{歡迎您_Count}“))>0)lr_output_message(”Log on successfully!“);else lr_error_message(”Log on failed!“);return 0;return 0;} //atoi()函數(shù)的作用是將一個(gè)ASCII字符串轉(zhuǎn)換為整型
//lr_eval_string()函數(shù)作用是取得參數(shù)值,將字符串變量中的參數(shù)值替換為當(dāng)前的參數(shù)值并將這個(gè)字符串返回 vuser_end(){ lr_think_time(4);web_url(”userAction.struts_2“, ”URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin“, ”Resource=0“, ”RecContentType=text/html“, ”Referer=“, ”Snapshot=t4.inf“, ”Mode=HTML“, LAST);return 0;} Global.h:
#ifndef _GLOBALS_H #define _GLOBALS_H //------// Include Files #include ”lrun.h“ #include ”web_api.h“ #include ”lrw_custom_body.h“ //------// Global Variables #endif // _GLOBALS_H Replay Log常見信息說明
1、web_find()和web_image_check()函數(shù)的日志信息(這兩個(gè)日志信息實(shí)際上是一樣的,只是輸出的函數(shù)名和參數(shù)不同)
1)信息1Action.c(22): Verification checks not enabled.web_image_check is skipped.See the 'Run-time settings/Preferences/Checks' [MsgId: MMSG-27197] Action.c(22): web_image_check was successful [MsgId: MMSG-26392] 出現(xiàn)該信息,說明沒有勾選Enable Image and text check 2)信息2Action.c(22): ”web_image_check“ succeeded(1 occurrence(s)found.Alt=”“, Src=”/xjcost/jsp/images/index1/edit_01.gif“)[MsgId: MMSG-27192] Action.c(22): web_image_check was successful [MsgId: MMSG-26392] 出現(xiàn)該信息,說明檢查點(diǎn)設(shè)置成功,且已經(jīng)查找到信息
3)信息3Action.c(22): Error-27191: ”web_image_check“ failed(0 occurrence(s)found.Alt=”“, Src=”/xjcost/jsp/images/index1/edit_1.gif“)[MsgId: MERR-27191] Action.c(22): web_image_check highest severity level was ”ERROR“ [MsgId: MMSG-26391] 出現(xiàn)該信息,說明要查找的內(nèi)容沒有找到。這時(shí)依次嘗試以下操作:(1)檢查參數(shù)的信息是否寫錯(cuò);
(2)如果是web_find(),檢查函數(shù)的位置是否在要查找內(nèi)容的后面;(3)如果是web_image_check(),查看該圖片的源代碼,看其是否是這個(gè)頁面上的圖片,很可能是圖片選擇錯(cuò)誤,即所選圖片不屬于該頁面。
2、web_reg_find()函數(shù)的日志信息
1)信息1Action.c(15): Registering web_reg_find was successful [MsgId: MMSG-26390] 出現(xiàn)該信息,說明內(nèi)容已查找到
2)信息2Action.c(27): Error-26366: ”Text=ABC“ not found for web_reg_find [MsgId: MERR-26366] Action.c(27): web_submit_data(”userLogin.struts“)highest severity level was ”ERROR", 18364 body bytes, 918 header bytes, 13 chunking overhead bytes [MsgId: MMSG-26387] 該信息在replay log頁面是紅色顯示的,說明沒有找到內(nèi)容,出現(xiàn)此情況嘗試以下兩個(gè)操作:
(1)參數(shù)的信息是否正確;
(2)查看該函數(shù)是否在查找內(nèi)容的前面。插入函數(shù)的方法:
1、手工寫入,在需要插入函數(shù)的位置手工寫入該函數(shù);
2、光標(biāo)停留在要插入函數(shù)的位置,在INSERT菜單中,選擇new step,在列表中選擇或查找要插入的函數(shù),根據(jù)提示填寫必要的參數(shù);
3、在tree view模式下,在樹狀菜單中選中要插入函數(shù)的位置,右鍵,選擇insert after或insert before,根據(jù)提示填寫必要的參數(shù); 總結(jié):
1、這兩個(gè)函數(shù)函數(shù)類型不同,WEB_FIND是普通函數(shù),WEB_REG_FIND是注冊函數(shù);
2、WEB_FIND使用時(shí)必須開啟內(nèi)容檢查選項(xiàng),而WEB_REG_FIND則不沒有此限制;
3、WEB_FIND只能用在基于HTML模式錄制的腳本中,而WEB_REG_FIND沒有此限制;
4、WEB_FIND是在返回的頁面中進(jìn)行內(nèi)容查找,WEB_REG_FIND是在緩存中進(jìn)行查找;
5、WEB_FIND在執(zhí)行效率上不如WEB_REG_FIND;
第二篇:LoadRunner檢查點(diǎn)使用小結(jié)
LoadRunner檢查點(diǎn)使用小結(jié)
LR中檢查點(diǎn)有兩種:圖片和文字。這兩種檢查點(diǎn)可用以下三個(gè)函數(shù)實(shí)現(xiàn):web_find()、web_reg_find()和web_image_check()下面分別介紹三種函數(shù)的用法
1、web_find()函數(shù)
函數(shù)作用:在頁面中查找相應(yīng)的內(nèi)容
參數(shù)舉例:web_find(“web_find”,“RighOf=a”,“LeftOf=b”,“What=name”,LAST);參數(shù)解釋:“web_find”定義該查找函數(shù)的名稱;“LeftOf”和“RighOf=”用來定義查找字符的左右邊界;“What=”定義查找內(nèi)容。
例如上述參數(shù)舉例中的意思就是在頁面中查找左邊界為b,右邊界為a,內(nèi)容為name的信息 函數(shù)用法:該函數(shù)是在查找頁面中的內(nèi)容,所以要放在要查找的內(nèi)容的后面。注意事項(xiàng):使用該函數(shù)時(shí),要在Vuser->Run-Tme Settings中更改下設(shè)置
勾選Enable Image and text check
系統(tǒng)默認(rèn)是不勾選該選項(xiàng)的。
2、web_reg_find()函數(shù)
函數(shù)作用:在緩存中查找相應(yīng)的內(nèi)容
參數(shù)舉例:web_reg_find(“Search=Body”,“SaveCount=ddd”,“Test=aaa”,LAST);參數(shù)解釋: Search用來定義查找范圍,SaveCount定義查找計(jì)數(shù)變量名稱,該參數(shù)可以記錄在緩存中查找內(nèi)容出現(xiàn)的次數(shù),可以使用該值,來判斷要查找的內(nèi)容是否被找到
例如上述參數(shù)舉例中的意思就是Body中查找內(nèi)容為aaa的信息,并將出現(xiàn)次數(shù)記錄在變量ddd中。函數(shù)用法:該函數(shù)是在緩存中查找相應(yīng)的內(nèi)容,所以要放在查找內(nèi)容之前。
注:在錄制過程中添加的檢查點(diǎn),用到的函數(shù)是web_reg_find(),且參數(shù)只有“Text=”
3、web_image_check()函數(shù)
函數(shù)作用:在頁面中查找一個(gè)具體的圖片。
參數(shù)說明:web_image_check(“web_image_check”,“Alt=”,“Src=”,LAST);;參數(shù)解釋:“Alt”和“Src”的值直接取該圖片在網(wǎng)頁源代碼中相應(yīng)參數(shù)的值。函數(shù)用法:該函數(shù)是在緩存中查找相應(yīng)的內(nèi)容,所以要放在查找內(nèi)容之前。
注意事項(xiàng):使用該函數(shù)時(shí),要在Vuser->Run-Tme Settings中勾選Enable Image and text check,具體操作請看web_find()中的注意事項(xiàng)。
經(jīng)過測試,該函數(shù)用到查找內(nèi)容前面或后面,都不影響查找結(jié)果。舉例說明(腳本)
該腳本記錄的是登陸系統(tǒng)后退出的操作,在腳本中用到atoi()函數(shù)和lr_eval_string(”{SaveCount定義的變量}”)兩個(gè)函數(shù)結(jié)合使用,判斷查找內(nèi)容出現(xiàn)的次數(shù)是否大于0,若大于0,則輸入登錄成功的信息。
vuser_init()
{
web_url(“xjcost”,“URL=http://gczj-server8:9205/xjcost/”,“Resource=0”,“RecContentType=text/html”,“Referer=”, “Snapshot=t1.inf”, “Mode=HTML”, EXTRARES,“Url=jsp/images/index/index.swf”, ENDITEM, “Url=jsp/images/index/xxfb2.gif”, ENDITEM, “Url=jsp/images/index/ywpt2.gif”, ENDITEM,LAST);
web_url(“userAction.struts”, “URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin”,“Resource=0”,“RecContentType=text/html”,“Referer=”, “Snapshot=t2.inf”, “Mode=HTML”,LAST);return 0;
} Action()
{
lr_start_transaction(“Log_on”);lr_rendezvous(“Log_on”);web_add_cookie(“userAccount=admin;DOMAIN=gczj-server8”);
web_reg_find(“Text=歡迎您”, “SaveCount=歡迎您_Count”,LAST);
web_image_check(“web_image_check”, “Src=/xjcost/jsp/images/index1/edit_01.gif”,LAST);
web_submit_data(“userLogin.struts”, “Action=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin”,“Method=POST”, “RecContentType=text/html”, “Referer=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin”,“Snapshot=t3.inf”, “Mode=HTML”, ITEMDATA, “Name=userAccount”, “Value=admin”, ENDITEM,“Name=pwd”, “Value=1111”, ENDITEM,EXTRARES,“Url=jsp/images/index1/edit_01a.gif”, “Referer=http://gczj-server8:9205/xjcost/userLogin.struts?actionType=userLogin”, ENDITEM,LAST);
web_find(“web_find”, “What=歡迎您”,LAST);
lr_end_transaction(“Log_on”,LR_AUTO);
//檢查是否登錄成功
//如果“歡迎您”這個(gè)字符出現(xiàn)次數(shù)大于0,輸出“Log on successfully!”
if(atoi(lr_eval_string(“{歡迎您_Count}”))>0)lr_output_message(“Log on successfully!”);
else
lr_error_message(“Log on failed!”);
return 0;return 0;
} //atoi()函數(shù)的作用是將一個(gè)ASCII字符串轉(zhuǎn)換為整型
//lr_eval_string()函數(shù)作用是取得參數(shù)值,將字符串變量中的參數(shù)值替換為當(dāng)前的參數(shù)值并將這個(gè)字符串返
回 vuser_end()
{
lr_think_time(4);
web_url(“userAction.struts_2”, “URL=http://gczj-server8:9205/xjcost/userAction.struts?actionType=reLogin”,“Resource=0”,“RecContentType=text/html”,“Referer=”, “Snapshot=t4.inf”, “Mode=HTML”,LAST);return 0;
} Global.h: #ifndef _GLOBALS_H #define _GLOBALS_H //------
// Include Files #include “l(fā)run.h” #include “web_api.h” #include “l(fā)rw_custom_body.h” //------
// Global Variables #endif // _GLOBALS_H Replay Log常見信息說明
1、web_find()和web_image_check()函數(shù)的日志信息(這兩個(gè)日志信息是上一樣的,只是輸出的函數(shù)名和參數(shù)不同)
1)信息1Action.c(22): Verification checks not enabled.web_image_check is skipped.See the 'Run-time settings/Preferences/Checks' [MsgId: MMSG-27197] Action.c(22): web_image_check was successful [MsgId: MMSG-26392] 出現(xiàn)該信息,說明沒有勾選Enable Image and text check 2)信息2Action.c(22): “web_image_check” succeeded(1 occurrence(s)found.Alt=“", Src=”/xjcost/jsp/images/index1/edit_01.gif“)[MsgId: MMSG-27192] Action.c(22): web_image_check was successful [MsgId: MMSG-26392] 出現(xiàn)該信息,說明檢查點(diǎn)設(shè)置成功,且已經(jīng)查找到信息
3)信息3Action.c(22): Error-27191: ”web_image_check“ failed(0 occurrence(s)found.Alt=”“, Src=”/xjcost/jsp/images/index1/edit_1.gif“)[MsgId: MERR-27191] Action.c(22): web_image_check highest severity level was ”ERROR“ [MsgId: MMSG-26391] 出現(xiàn)該信息,說明要查找的內(nèi)容沒有找到。這時(shí)依次嘗試以下操作:(1)檢查參數(shù)的信息是否寫錯(cuò);
(2)如果是web_find(),檢查函數(shù)的位置是否在要查找內(nèi)容的后面;
(3)如果是web_image_check(),查看該圖片的源代碼,看其是否是這個(gè)頁面上的圖片,很可能是圖片選擇錯(cuò)誤,即所選圖片不屬于該頁面。
2、web_reg_find()函數(shù)的日志信息
1)信息1Action.c(15): Registering web_reg_find was successful [MsgId: MMSG-26390] 出現(xiàn)該信息,說明內(nèi)容已查找到
2)信息2Action.c(27): Error-26366: ”Text=ABC“ not found for web_reg_find [MsgId: MERR-26366] Action.c(27): web_submit_data(”userLogin.struts“)highest severity level was ”ERROR", 18364 body bytes, 918 header bytes, 13 chunking overhead bytes [MsgId: MMSG-26387] 該信息在replay log頁面是紅色顯示的,說明沒有找到內(nèi)容,出現(xiàn)此情況嘗試以下兩個(gè)操作:(1)參數(shù)的信息是否正確;
(2)查看該函數(shù)是否在查找內(nèi)容的前面。
第三篇:loadrunner使用cookie模擬
loadrunner使用cookie模擬
自己的工作總結(jié),大家討論討論
1為什么要使用cookie模擬
從日常項(xiàng)目測試過程中的問題說起。
比如要進(jìn)行論壇中的文件下載功能的測試。我們都知道只有登錄用戶才能進(jìn)行下載操作,這樣我們的測試過程可能就變成了先登錄系統(tǒng),然后再進(jìn)行下載操作。在使用loadrunner設(shè)計(jì)腳本時(shí)就要先在初始化部分寫登錄腳本,然后再action中寫下載操作,當(dāng)單個(gè)用戶運(yùn)行時(shí)我們可能看不到什么問題。當(dāng)用戶并發(fā)量較多時(shí),問題馬上暴露出來了。大部分用戶可能很長時(shí)間也沒有下載成功,大量的初始化登錄操作已經(jīng)給系統(tǒng)造成了很大的壓力,而在日常訪問中,這種大量短時(shí)間登錄的壓力是不容易出現(xiàn)的。這樣的測試結(jié)果可能無法達(dá)到我們的測試目標(biāo)。的確,不能處理較大的登錄吞吐可能已經(jīng)是系統(tǒng)的瓶頸了,我們可以通過這種全流程的測試方式發(fā)現(xiàn)登錄的問題。但是后續(xù)的測試我們可能就無法進(jìn)行下去了。當(dāng)項(xiàng)目組解決了登錄的吞吐問題時(shí),可能項(xiàng)目工期已經(jīng)十分緊張了,再進(jìn)行重要的下載功能測試可能已經(jīng)太晚了。
這種情況在測試過程中經(jīng)常會出現(xiàn),我們要如何繞過登錄盡早的進(jìn)行后續(xù)的下載操作呢?如果網(wǎng)站使用了cookie的機(jī)制,則我們可以嘗試使用下面的方法。
2怎么使用loadrunner模擬
Loadrunner的web函數(shù)中提供了幾個(gè)關(guān)于cookie的函數(shù)。
web_remove_cookie()
web_add_cookie()
web_cleanup_cookies();
web_reg_add_cookie();
這里我們?yōu)榱四Mcookie繞過登錄使用web_add_cookie();
首先獲取網(wǎng)站留在客戶端上的cookie都存儲了什么。通常主要內(nèi)容包括名字,值,過期時(shí)間,作用域和路徑,分為會話cookie和文件cookie。會話cookie存儲在內(nèi)存里,關(guān)閉瀏覽器后就沒有了,這種很難模擬。文件cookie是將cookie信息寫到硬盤上,關(guān)閉瀏覽器再次打開后仍可以使用。我們要模擬的就是這種存儲在硬盤文件里的cookie。我們觀察cookie文件的內(nèi)容,如果使用ie的話,在“C:Documents and Settings用戶名Local SettingsTemporary Internet Files”中的用戶名@域名的文件里,cookie存儲都是加密的,所以我們直接看并看不出什么特別的東西,也搞不清楚具體是什么。這時(shí)我們借助IE webdeveloper 工具獲取cookie值如下所示:
cdb_cookietime=2592000;cdb_smile=1D1;cdb_sid=71WKOd;cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s;cdb_visitedfid=20;cdb_onlineusernum=28
獲得了cookie信息后,我們進(jìn)行編輯loadrunner腳本。將cookie每個(gè)分號分行,使用UltraEdit進(jìn)行列模式操作,在每句后面加上域名。(域名在webdeveloper的Attributes下也可以找到domain對應(yīng)值),修改完成后如下。
web_add_cookie(“cdb_cookietime=2592000;domain=172.16.1.3”);
web_add_cookie(“cdb_smile=1D1;domain=172.16.1.3”);
web_add_cookie(“cdb_sid=71WKOd;domain=172.16.1.3”);
web_add_cookie(“cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4b
g3GGMsa9s;domain=172.16.1.3”);
web_add_cookie(“cdb_visitedfid=20;domain=172.16.1.3”);
web_add_cookie(“cdb_onlineusernum=28;domain=172.16.1.3”);
把這些值放在要訪問的url的web函數(shù)之前,你就可以繞過登錄進(jìn)行后續(xù)操作了。如:
Action()
{
web_add_cookie(“cdb_cookietime=2592000;DOMAIN=172.16.1.3”);
web_add_cookie(“cdb_smile=1D1;DOMAIN=172.16.1.3”);
web_add_cookie(“cdb_oldtopics=D280D39523D39418D;DOMAIN=172.16.1.3”);
web_add_cookie(“cdb_sid=eSuWgw;DOMAIN=172.16.1.3”);
web_add_cookie(“cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s;DOMAIN=172.16.1.3”);
web_add_cookie(“cdb_visitedfid=20;DOMAIN=172.16.1.3”);
web_url(“cookies”,“URL=http://172.16.1.3:8080/bbs/index.php”,“referer=http://172.16.1.3/newiweb/index/dealIndex.do?action=Index”,“Mode=HTML”,“RecContentType=text/html”,LAST);
return 0;
}
最后注明一下:loadrunner的web錄制功能是自動(dòng)的增加cookie的,只要在cookie不過期的情況下,我們不需要手工的增加cookie,當(dāng)出現(xiàn)錄制不上或錄制的值發(fā)生變化時(shí)可以手工進(jìn)行添加。
在loadrunner場景設(shè)計(jì)使用其他負(fù)載機(jī)器時(shí),同樣可以使用你本機(jī)的這個(gè)cookie值進(jìn)行,不會因?yàn)榭蛻舳藱C(jī)器發(fā)生變化而產(chǎn)生影響。
第四篇:LoadRunner測試總結(jié)
性能測試(并發(fā)負(fù)載壓力)測試分析-簡要篇
在論壇混了多日,發(fā)現(xiàn)越來越多的性能測試工程師基本上都能夠掌握利用測試工具來作負(fù)載壓力測試,但多數(shù)人對怎樣去分析工具收集到的測試結(jié)果感到無從下手,下面我就把個(gè)人工作中的體會和收集到的有關(guān)資料整理出來,希望能對大家分析測試結(jié)果有所幫助。
分析原則:
? 具體問題具體分析(這是由于不同的應(yīng)用系統(tǒng),不同的測試目的,不同的性能關(guān)注點(diǎn))? 查找瓶頸時(shí)按以下順序,由易到難。
服務(wù)器硬件瓶頸-〉網(wǎng)絡(luò)瓶頸(對局域網(wǎng),可以不考慮)-〉服務(wù)器操作系統(tǒng)瓶頸(參數(shù)配置)-〉中間件瓶頸(參數(shù)配置,數(shù)據(jù)庫,web服務(wù)器等)-〉應(yīng)用瓶頸(SQL語句、數(shù)據(jù)庫設(shè)計(jì)、業(yè)務(wù)邏輯、算法等)注:以上過程并不是每個(gè)分析中都需要的,要根據(jù)測試目的和要求來確定分析的深度。對一些要求低的,我們分析到應(yīng)用系統(tǒng)在將來大的負(fù)載壓力(并發(fā)用戶數(shù)、數(shù)據(jù)量)下,系統(tǒng)的硬件瓶頸在哪兒就夠了。? 分段排除法 很有效
分析的信息來源:
?1 根據(jù)場景運(yùn)行過程中的錯(cuò)誤提示信息
?2 根據(jù)測試結(jié)果收集到的監(jiān)控指標(biāo)數(shù)據(jù)
一.錯(cuò)誤提示分析
分析實(shí)例:?Error: Failed to connect to server “10.10.10.30:8080”: [10060] Connection
?Error: timed out Error: Server “10.10.10.30” has shut down the connection prematurely
分析:
?A、應(yīng)用服務(wù)死掉。
(小用戶時(shí):程序上的問題。程序上處理數(shù)據(jù)庫的問題)
?B、應(yīng)用服務(wù)沒有死
(應(yīng)用服務(wù)參數(shù)設(shè)置問題)
例:在許多客戶端連接Weblogic應(yīng)用服務(wù)器被拒絕,而在服務(wù)器端沒有錯(cuò)誤顯示,則有可能是Weblogic中的server元素的AcceptBacklog屬性值設(shè)得過低。如果連接時(shí)收到connection refused消息,說明應(yīng)提高該值,每次增加25%
?C、數(shù)據(jù)庫的連接
(1、在應(yīng)用服務(wù)的性能參數(shù)可能太小了
2、數(shù)據(jù)庫啟動(dòng)的最大連接數(shù)(跟硬件的內(nèi)存有關(guān)))
2Error: Page download timeout(120 seconds)has expired
分析:可能是以下原因造成?A、應(yīng)用服務(wù)參數(shù)設(shè)置太大導(dǎo)致服務(wù)器的瓶頸
?B、頁面中圖片太多
?C、在程序處理表的時(shí)候檢查字段太大多
二.監(jiān)控指標(biāo)數(shù)據(jù)分析
1.最大并發(fā)用戶數(shù):
應(yīng)用系統(tǒng)在當(dāng)前環(huán)境(硬件環(huán)境、網(wǎng)絡(luò)環(huán)境、軟件環(huán)境(參數(shù)配置))下能承受的最大并發(fā)用戶數(shù)。在方案運(yùn)行中,如果出現(xiàn)了大于3個(gè)用戶的業(yè)務(wù)操作失敗,或出現(xiàn)了服務(wù)器shutdown的情況,則說明在當(dāng)前環(huán)境下,系統(tǒng)承受不了當(dāng)前并發(fā)用戶的負(fù)載壓力,那么最大并發(fā)用戶數(shù)就是前一個(gè)沒有出現(xiàn)這種現(xiàn)象的并發(fā)用戶數(shù)。
如果測得的最大并發(fā)用戶數(shù)到達(dá)了性能要求,且各服務(wù)器資源情況良好,業(yè)務(wù)操作響應(yīng)時(shí)間也達(dá)到了用戶要求,那么OK。否則,再根據(jù)各服務(wù)器的資源情況和業(yè)務(wù)操作響應(yīng)時(shí)間進(jìn)一步分析原因所在。
2.業(yè)務(wù)操作響應(yīng)時(shí)間:
? 分析方案運(yùn)行情況應(yīng)從平均事務(wù)響應(yīng)時(shí)間圖和事務(wù)性能摘要圖開始。使用“事務(wù)性能摘要”圖,可以確定在方案執(zhí)行期間響應(yīng)時(shí)間過長的事務(wù)。
? 細(xì)分事務(wù)并分析每個(gè)頁面組件的性能。查看過長的事務(wù)響應(yīng)時(shí)間是由哪些頁面組件引起的?問題是否與網(wǎng)絡(luò)或服務(wù)器有關(guān)?
? 如果服務(wù)器耗時(shí)過長,請使用相應(yīng)的服務(wù)器圖確定有問題的服務(wù)器度量并查明服務(wù)器性能下降的原因。如果網(wǎng)絡(luò)耗時(shí)過長,請使用“網(wǎng)絡(luò)監(jiān)視器”圖確定導(dǎo)致性能瓶頸的網(wǎng)絡(luò)問題
3.服務(wù)器資源監(jiān)控指標(biāo):
內(nèi)存:UNIX資源監(jiān)控中指標(biāo)內(nèi)存頁交換速率(Paging rate),如果該值偶爾走高,表明當(dāng)時(shí)有線程競爭內(nèi)存。如果持續(xù)很高,則內(nèi)存可能是瓶頸。也可能是內(nèi)存訪問命中率低。Windows資源監(jiān)控中,如果ProcessPrivate Bytes計(jì)數(shù)器和ProcessWorking Set計(jì)數(shù)器的值在長時(shí)間內(nèi)持續(xù)升高,同時(shí)MemoryAvailable bytes計(jì)數(shù)器的值持續(xù)降低,則很可能存在內(nèi)存泄漏。
內(nèi)存資源成為系統(tǒng)性能的瓶頸的征兆:
很高的換頁率(high pageout rate);
進(jìn)程進(jìn)入不活動(dòng)狀態(tài);
交換區(qū)所有磁盤的活動(dòng)次數(shù)可高;
可高的全局系統(tǒng)CPU利用率;
內(nèi)存不夠出錯(cuò)(out of memory errors)
處理器:UNIX資源監(jiān)控(Windows操作系統(tǒng)同理)中指標(biāo)CPU占用率(CPU utilization),如果該值持續(xù)超過95%,表明瓶頸是CPU。可以考慮增加一個(gè)處理器或換一個(gè)更快的處理器。如果服務(wù)器專用于SQL Server,可接受的最大上限是80-85%
合理使用的范圍在60%至70%。Windows資源監(jiān)控中,如果SystemProcessor Queue Length大于2,而處理器利用率(Processor Time)一直很低,則存在著處理器阻塞。
CPU資源成為系統(tǒng)性能的瓶頸的征兆:
很慢的響應(yīng)時(shí)間(slow response time)
CPU空閑時(shí)間為零(zero percent idle CPU)
過高的用戶占用CPU時(shí)間(high percent user CPU)
過高的系統(tǒng)占用CPU時(shí)間(high percent system CPU)
長時(shí)間的有很長的運(yùn)行進(jìn)程隊(duì)列(large run queue size sustained over time)
磁盤I/O:UNIX資源監(jiān)控(Windows操作系統(tǒng)同理)中指標(biāo)磁盤交換率(Disk rate),如果該參數(shù)值一直很高,表明I/O有問題。可考慮更換更快的硬盤系統(tǒng)。Windows資源監(jiān)控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec頁面讀取操作速率很低,則可能存在磁盤瓶徑。
I/O資源成為系統(tǒng)性能的瓶頸的征兆 :
過高的磁盤利用率(high disk utilization)
太長的磁盤等待隊(duì)列(large disk queue length)
等待磁盤I/O的時(shí)間所占的百分率太高(large percentage of time waiting for disk I/O)太高的物理I/O速率:large physical I/O rate(not sufficient in itself)
過低的緩存命中率(low buffer cache hit ratio(not sufficient in itself))
太長的運(yùn)行進(jìn)程隊(duì)列,但CPU卻空閑(large run queue with idle CPU)
4.?dāng)?shù)據(jù)庫服務(wù)器:
SQL Server數(shù)據(jù)庫:SQLServer資源監(jiān)控中指標(biāo)緩存點(diǎn)擊率(Cache Hit Ratio),該值越高越好。如果持續(xù)低于80%,應(yīng)考慮增加內(nèi)存。如果Full Scans/sec(全表掃描/秒)計(jì)數(shù)器顯示的值比1或2高,則應(yīng)分析你的查詢以確定是否確實(shí)需要全表掃描,以及SQL查詢是否可以被優(yōu)化。Number of Deadlocks/sec(死鎖的數(shù)量/秒):死鎖對應(yīng)用程序的可伸縮性非常有害,并且會導(dǎo)致惡劣的用戶體驗(yàn)。該計(jì)數(shù)器的值必須為0。Lock Requests/sec(鎖請求/秒),通過優(yōu)化查詢來減少讀取次數(shù),可以減少該計(jì)數(shù)器的值。
Oracle數(shù)據(jù)庫:如果自由內(nèi)存接近于0而且?guī)炜齑婊驍?shù)據(jù)字典快存的命中率小于0.90,那么需要增加
SHARED_POOL_SIZE的大小。
快存(共享SQL區(qū))和數(shù)據(jù)字典快存的命中率:
select(sum(pins-reloads))/sum(pins)from v$librarycache;
select(sum(gets-getmisses))/sum(gets)from v$rowcache;
自由內(nèi)存:select * from v$sgastat where name=’free memory’;如果數(shù)據(jù)的緩存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS參數(shù)的值(單位:塊)。緩沖區(qū)高速緩存命中率:
select name,value from v$sysstat where name in('db block gets’,'consistent gets','physical reads');
Hit Ratio = 1-(physical reads /(db block gets + consistent gets))如果日志緩沖區(qū)申請的值較大,則應(yīng)加大LOG_BUFFER參數(shù)的值。
日志緩沖區(qū)的申請情況 :
select name,value from v$sysstat where name = 'redo log space requests';如果內(nèi)存排序命中率小于0.95,則應(yīng)加大SORT_AREA_SIZE以避免磁盤排序。
內(nèi)存排序命中率 :
select round((100*b.value)/decode((a.value+b.value), 0, 1,(a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name='sorts(disk)' and b.name='sorts(memory)'
注:上述SQL Server和Oracle數(shù)據(jù)庫分析,只是一些簡單、基本的分析,特別是Oracle數(shù)據(jù)庫的分析和優(yōu)化,是一門專門的技術(shù),進(jìn)一步的分析可查相關(guān)資料。
說明:
以上只是個(gè)人的體會和部分資料的整理,并不代表專家之言。算拋磚引玉,有不同看法和更深入的分析的,希望大家勇要發(fā)言,以推動(dòng)我們國內(nèi)的性能測試工作。
第五篇:LoadRunner學(xué)習(xí)總結(jié)
LoadRunner學(xué)習(xí)小結(jié)
今年十月份我到北京跟張坤學(xué)習(xí)性能測試知識,共花了三個(gè)星期學(xué)習(xí)LoadRunner。以下是我的學(xué)習(xí)小結(jié)。
一. 什么是LoadRunner LoadRunner是一種預(yù)測系統(tǒng)行為和性能的工業(yè)標(biāo)準(zhǔn)級負(fù)載測試工具。通過以模擬多個(gè)用戶實(shí)施并發(fā)負(fù)載測試及實(shí)時(shí)性能檢測的方式來確認(rèn)和查找問題,能對整個(gè)企業(yè)架構(gòu)進(jìn)行測試。
二. LoadRunner的優(yōu)點(diǎn)
1.輕松創(chuàng)建虛擬用戶:通過記錄下業(yè)務(wù)流程轉(zhuǎn)為測試腳本,在機(jī)器上產(chǎn)生多個(gè)用戶訪問,減少負(fù)載測試需要的硬件和人力資源。
2.創(chuàng)建真實(shí)的負(fù)載:可以通過Controller設(shè)定負(fù)載方案,如定義用戶在什么時(shí)候訪問系統(tǒng)以產(chǎn)生負(fù)載,所有用戶同時(shí)執(zhí)行一個(gè)動(dòng)作來模擬峰值負(fù)載情況等。3.實(shí)時(shí)監(jiān)測器:可以實(shí)時(shí)顯示交易性能數(shù)據(jù)(如響應(yīng)時(shí)間)和其他系統(tǒng)組件如數(shù)據(jù)庫,網(wǎng)絡(luò)等的實(shí)時(shí)性能。
4.分析結(jié)果以精確定位問題所在:LoadRunner能收集匯總所有測試數(shù)據(jù),提供高級的分析和報(bào)告工具。
三. LoadRunner的安裝與使用
1.安裝過程詳見上傳的LoadRunner使用手冊,在此不再詳細(xì)介紹。2.具體使用:
點(diǎn)擊File新建錄制文件,也可以點(diǎn)擊下面的NEW快捷鍵進(jìn)行新建。使用File新建,會彈出協(xié)議選擇窗口,選擇新的單協(xié)議腳本(New Single Protocol Script)的Web(HTTP/HTML)項(xiàng),確定即可(選擇Web項(xiàng)是因?yàn)槲覀儨y試的是Web應(yīng)用)。接著會彈出開始錄制的設(shè)置項(xiàng),需要寫入錄入系統(tǒng)的地址,點(diǎn)擊確定后就會根據(jù)錄入地址展現(xiàn)系統(tǒng)頁面,開始錄制腳本,出現(xiàn)小工具條:
第一個(gè)按鈕為錄制鍵 第二個(gè)為回放腳本鍵 第三個(gè)為停止錄制鍵 第四個(gè)為暫停錄制鍵 第五個(gè)為編譯腳本鍵
第六個(gè)為創(chuàng)建新的Action鍵。LR的錄制腳本分為三個(gè)部分,vuser_init、vuser_end和 Action。腳本循環(huán)執(zhí)行時(shí),只執(zhí)行一次vuser_init和vuser_end,而多次循環(huán)Action部分。比如錄制投保業(yè)務(wù)時(shí),登陸系統(tǒng)部分放入vuser_init,退出登陸放到vuser_end,中間的投保操作放到Action中,則循環(huán)執(zhí)行時(shí)就會登陸一次投保系統(tǒng)開始反復(fù)執(zhí)行投保操作直到結(jié)束退出系統(tǒng)。
第七個(gè)為用來改變錄制的options設(shè)置按鈕
第八個(gè)和第九個(gè)為插入事務(wù)的起始點(diǎn)和結(jié)束點(diǎn)鍵,結(jié)合起來構(gòu)成一個(gè)完整事物,用來衡量服務(wù)器的性能。比如錄制腳本過程中,投保系統(tǒng)的查詢投保單號操作,可以在輸入完查詢信息后點(diǎn)擊查詢按鈕前插入事務(wù)的起始點(diǎn),查詢出數(shù)據(jù)后插入事務(wù)的結(jié)束點(diǎn),這樣在運(yùn)行測試腳本時(shí),Loadrunner在運(yùn)行到該事務(wù)時(shí),便會計(jì)算出這個(gè)查詢操作所花時(shí)間,便于衡量服務(wù)器執(zhí)行查詢操作的性能。
第十個(gè)為插入集合點(diǎn)鍵,可用于衡量在加重負(fù)載的情況下服務(wù)器的性能。比如要驗(yàn)證系統(tǒng)是否能承受100人同時(shí)進(jìn)行報(bào)案操作,便可在腳本錄入過程中,點(diǎn)擊報(bào)案確認(rèn)鍵操作前插入集合點(diǎn),這樣當(dāng)腳本運(yùn)行到集合點(diǎn)時(shí),Loadrunner會讓100個(gè)虛擬用戶同時(shí)點(diǎn)擊報(bào)案確認(rèn)按鈕(如果有的用戶還沒運(yùn)行到集合點(diǎn),先到用戶要等未到用戶一起操作)進(jìn)行報(bào)案,從而達(dá)到測試目的。
最后一個(gè)為設(shè)置驗(yàn)證點(diǎn)鍵,在創(chuàng)建事物后,設(shè)置一個(gè)驗(yàn)證點(diǎn)可以用來確認(rèn)事物執(zhí)行是否成功。比如進(jìn)行查詢事務(wù)操作時(shí),LR只要檢測到網(wǎng)頁的響應(yīng),就認(rèn)為事務(wù)pass,而不管顯示頁面內(nèi)容是否正確。因此為了檢查Web服務(wù)器返回的網(wǎng)頁是否正確,可以插入Text/Image檢查點(diǎn),驗(yàn)證網(wǎng)頁上是否存在指定的Text或Image。
設(shè)置驗(yàn)證點(diǎn)時(shí),如果我們驗(yàn)證的文本內(nèi)容是中文,有時(shí)會返回?zé)o法找到驗(yàn)證內(nèi)容的報(bào)錯(cuò)信息,而頁面顯示又是正確的,出現(xiàn)問題的原因可能是因?yàn)長R對中文的支持部好,盡量選擇驗(yàn)證信息為數(shù)字或字母;也可能是設(shè)置問題,可以嘗試將Tools->Recording Options->HTTP Properties下的Advanced選項(xiàng)里設(shè)置支持UTF-8,再檢查開發(fā)人員有沒有設(shè)置支持中文。
錄制結(jié)束后,先點(diǎn)擊保存腳本,同時(shí)為腳本命名。然后編譯腳本,看是否存在語法錯(cuò)誤,編譯成功后,即可回放,看錄制腳本是否成功。
LoadRunner錄制得到的腳本基本沒有錯(cuò)誤,不像robot會有錄入數(shù)據(jù)的缺失,只是會錄入一些非錄入系統(tǒng)的網(wǎng)頁信息,根據(jù)地址可以識別并刪除掉。
四. LoadRunner腳本錄制學(xué)習(xí)小結(jié)
1.LoadRunner錄制腳本,主要是為了進(jìn)行壓力測試,所以跑流程時(shí),跑了主要流程即可,也就是系統(tǒng)必須的信息錄入就可以了。2.LoadRunner的腳本運(yùn)行過程中,只能用于一次業(yè)務(wù)辦理的數(shù)據(jù)需要做參數(shù)化,如車輛車架號,車牌,報(bào)案號等,以免出現(xiàn)重復(fù)投保或報(bào)案無法立案現(xiàn)象,不能繼續(xù)進(jìn)行下去。參數(shù)化步驟:
1)將需要做參數(shù)化的數(shù)據(jù)右鍵點(diǎn)擊,選擇Replace with a parameter,進(jìn)行設(shè)置。2)在彈出編輯框里,設(shè)置易懂的參數(shù)名稱,再點(diǎn)擊Properties進(jìn)行屬性設(shè)置。3)點(diǎn)擊Create Table 按鈕,生成參數(shù)表格,再點(diǎn)擊Edit with Notepad按鈕,即可在記事本里添加新的參數(shù),添加完后再次回車(不回車可能最后條數(shù)據(jù)讀取不到)關(guān)閉,參數(shù)化操作完成。
4)使用Ctrl +H鍵可以找到替換同樣的需要參數(shù)化的數(shù)據(jù)。
3.腳本跑流程過程中,因?yàn)闃I(yè)務(wù)運(yùn)轉(zhuǎn),前面生成的投保單要接著進(jìn)行提交核保業(yè)務(wù),而每次生成的投保單號不一樣,用于進(jìn)行提交核保的單號也要與之前的保持一致,因此需要做關(guān)聯(lián)處理,讀取到生成的新投保單號給提交核保流程。關(guān)聯(lián)步驟:
1).查找關(guān)聯(lián)數(shù)據(jù)第一次出現(xiàn)的位置,判斷該數(shù)據(jù)是由什么函數(shù)返回的。
2).在樹形結(jié)構(gòu)里點(diǎn)擊返回該數(shù)據(jù)值的函數(shù),看它的Server Response信息,用復(fù)制的關(guān)聯(lián)數(shù)據(jù)進(jìn)行查找它的返回語句,找到區(qū)分度明顯的語句(不一定要是第一個(gè)返回語句),然后使用web_reg_save_param函數(shù)進(jìn)行關(guān)聯(lián)。
注:關(guān)聯(lián)函數(shù)一定要寫在第一個(gè)返回該數(shù)據(jù)值的函數(shù)前。
3).web_reg_save_param(const char *ParamName, , LAST);
函數(shù)的第一個(gè)參數(shù)是用來對關(guān)聯(lián)數(shù)據(jù)進(jìn)行定義的,取名最好可讀性強(qiáng);第二個(gè)參數(shù)是用來標(biāo)識關(guān)聯(lián)數(shù)據(jù)在返回語句里的具體位置的,寫出該數(shù)據(jù)的左右邊界,程序才能識別;LAST表示屬性列的結(jié)束。比如辦理理賠業(yè)務(wù)的流程號,在服務(wù)器的返回語句里是:
做關(guān)聯(lián)為:
web_reg_save_param(“LogFlowID”,“LB=name=flowID type=”hidden“ value=”,“RB=>”,LAST);定義的參數(shù)名就叫LogFlowID,表示流程號,易于明白;左邊界從name取就可以標(biāo)識了,也可取長點(diǎn)或短點(diǎn),只要能區(qū)分;右邊界只有>,寫上就好;最后寫上LAST。
在定義的左右邊界中,如果有雙引號,在腳本中是需要轉(zhuǎn)義的,因?yàn)殡p引號在C中是有意義的,這里只要表示語句信息,加上右斜杠。尖括號直寫。
左右邊界也需要用雙引號括起來。定義好的參數(shù)寫在程序中,需要在加上單尖括號:swfLogFlowID={LogFlowID} 五. 腳本執(zhí)行過程中的報(bào)錯(cuò)處理
1.vuser_init.c(3051): Error-26377: No match found for the requested parameter “proposalNo”.Check whether the requested boundaries exist in the response data.Also, if the data you want to save exceeds 256 bytes, use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-26377] 2.vuser_init.c(3051): web_submit_data(“UIPrPoEnInputNext.jsp”)highest severity level was “ERROR”, 4312 body bytes, 258 header bytes [MsgId: MMSG-26388]
兩個(gè)錯(cuò)誤一起出現(xiàn),出錯(cuò)語句都是在關(guān)聯(lián)函數(shù)下的提交數(shù)據(jù)函數(shù)位置,但是具體出錯(cuò)有可能是:
1).關(guān)聯(lián)函數(shù)左右邊界沒寫對,所有信息都要用字符輸入,不能是中文或其他。
2).在關(guān)聯(lián)函數(shù)確認(rèn)寫對的情況下,看提交數(shù)據(jù)函數(shù)中的業(yè)務(wù)設(shè)置,比如有可能是因?yàn)楸尾樵冋Z句,設(shè)置的查詢時(shí)間是過去的時(shí)間,新生成的投保單當(dāng)然查不到,這樣程序也會報(bào)這樣的錯(cuò)。
3.loadrunner 執(zhí)行理賠的立案處理,錄制好腳本后,回放,報(bào)錯(cuò):
腳本日志信息提示:
1.Action.c(400): Error-26366: “Text=立案信息提交成功” not found for web_reg_find [MsgId: MERR-26366] 2.Action.c(400): web_submit_data(“claimSave.do”)highest severity level was “ERROR”, 4424 body bytes, 258 header bytes [MsgId: MMSG-26388] 腳本執(zhí)行過程停止在立案信息提交頁面,錯(cuò)誤原因:數(shù)據(jù)問題,可能是有的應(yīng)該變化的信息沒有變。
在該流程中,一個(gè)報(bào)案號只能做一次立案,而初始腳本沒有設(shè)置參數(shù)、關(guān)聯(lián),使用保單號進(jìn)行查詢,錯(cuò)誤被掩蓋。在立案系統(tǒng)中,一個(gè)保單號可以重復(fù)報(bào)案,但是一個(gè)報(bào)案號只能一次立案,要跑通流程,需要先將這一保單再重復(fù)報(bào)案,得到新的報(bào)案號。
六. 性能測試的場景設(shè)置
腳本錄制完畢后,接著準(zhǔn)備測試場景。1.首先準(zhǔn)備測試數(shù)據(jù)。比如車險(xiǎn)投保,需要投保人和車架號信息來唯一標(biāo)識一輛被保車,因此就需要將投保人和車架號做參數(shù)化處理,編輯文本框錄入大量數(shù)據(jù)讓腳本唯一讀取:
1).錄入投保人參數(shù),車架號參數(shù),過程同腳本錄制的參數(shù)化處理
2).因?yàn)橥侗H撕蛙嚰芴栆黄鹕梢粭l投保數(shù)據(jù),可設(shè)置車架號隨投保人參數(shù)一起讀取,設(shè)置步驟為:
投保人文件存放路徑--File path
投保人參數(shù)數(shù)據(jù)讀取方式
腳本按列名讀取參數(shù),每行數(shù)據(jù)讀取一次,每次循環(huán)取一次新值。接著設(shè)置車架號參數(shù)信息:
車架號參數(shù)讀取文件路徑設(shè)為和投保人文件路徑一樣
腳本按列名讀取參數(shù),行號選擇和讀取的投保人數(shù)據(jù)同一行
這樣得到所需的投保單生成參數(shù)數(shù)據(jù)
2.設(shè)置測試場景
點(diǎn)擊Tools->Create Controller Scenarios,彈出場景類型選擇框:
錄入需要的虛擬用戶數(shù),選擇生成結(jié)果存放路徑和組名。確定后進(jìn)入具體設(shè)置頁面:
Quantity表示虛擬用戶個(gè)數(shù),group name為組名。
1).設(shè)置運(yùn)行時(shí)間選項(xiàng)Run – time Settings
選擇循環(huán)次數(shù)Run Logic->Iteration Count,設(shè)置循環(huán)10次,虛擬用戶數(shù)為之前設(shè)置的5人,則預(yù)計(jì)一共可生成50張投保單。
設(shè)置思考時(shí)間,思考時(shí)間通常是錄制腳本過程中,填寫頁面信息花費(fèi)的時(shí)間,選擇忽略項(xiàng),節(jié)省跑腳本的時(shí)間。
設(shè)置網(wǎng)絡(luò)連接時(shí)間,點(diǎn)擊網(wǎng)絡(luò)協(xié)議項(xiàng)Internet Protocol 的Options鍵,將彈出頁面里的HTTP-request connect timeout和 HTTP-request receive timeout的數(shù)值改為1000。使得能在網(wǎng)絡(luò)狀況不太好的情況下向服務(wù)器發(fā)送接收數(shù)據(jù)。
2).設(shè)置Edit Schedule
選擇虛擬用戶加載方式:
可以一次加載所有用戶,也可以按需要設(shè)置,一秒加載一個(gè)用戶或其他。
選擇結(jié)束方式:
當(dāng)選擇一秒加載一個(gè)用戶時(shí),結(jié)束設(shè)置為直到跑完所有腳本停止執(zhí)行。如果選擇選擇一次加載所有用戶可以選擇運(yùn)行多少時(shí)間后停止和不停止選項(xiàng)。
這些設(shè)置完成后,一次測試場景布置完成。可以進(jìn)行基線檢查或單點(diǎn)并發(fā)測試。
七. 性能測試步驟
一).除測試工具外性能測試必備的系統(tǒng)及業(yè)務(wù)知識
1、熟悉保險(xiǎn)行業(yè)業(yè)務(wù)特點(diǎn),有助于與開發(fā)和客戶討論需求,制定測試用例;
2、熟悉系統(tǒng)的實(shí)現(xiàn)特點(diǎn),開發(fā)實(shí)現(xiàn)方式,有助于選擇程序處理復(fù)雜、消耗系統(tǒng)資源的用例點(diǎn);
3、熟悉數(shù)據(jù)結(jié)構(gòu),了解數(shù)據(jù)存儲規(guī)則,對腳本調(diào)試、數(shù)據(jù)準(zhǔn)備、測試執(zhí)行和監(jiān)視都有幫助;
4、熟悉系統(tǒng)所使用的數(shù)據(jù)庫、操作系統(tǒng)、中間件的監(jiān)視和性能問題查看,有助于測試監(jiān)視和發(fā)現(xiàn)問題;
5、熟悉系統(tǒng)架構(gòu)及系統(tǒng)集成方式,有助于分析及明確定位性能問題。
二)性能測試執(zhí)行過程 1.基線檢查
1).目的:驗(yàn)證環(huán)境是否可用;
驗(yàn)證腳本是否能在場景正常執(zhí)行。
2).方法:1個(gè)人單獨(dú)循環(huán)5次--沒有其他人干擾,干凈的環(huán)境
3).結(jié)果:一般一個(gè)事物的響應(yīng)時(shí)間超過3秒就可能存在問題,要提報(bào)開發(fā)人
2.單點(diǎn)并發(fā)
1).目的:為了快速的發(fā)現(xiàn)問題,如多進(jìn)程的鎖機(jī)制,看是否相互間有影響。2).方法:一般是10人或20人執(zhí)行10到15分鐘,執(zhí)行過程忽略思考時(shí)間。
忽略思考時(shí)間可以減少客戶端時(shí)間,加快向服務(wù)器傳送數(shù)據(jù)速度,很大程度上增大了服務(wù)器的壓力,20個(gè)人單點(diǎn)并發(fā)的壓力就相當(dāng)于200人正常執(zhí)行帶給服務(wù)器的壓力。
3).單點(diǎn)測試的數(shù)據(jù)可以用來進(jìn)行混發(fā)測試,但是有可能單點(diǎn)測試的數(shù)據(jù)不足以進(jìn)行混發(fā),需要自己再準(zhǔn)備足夠的數(shù)據(jù)。
3.方案測試--混發(fā)測試
1).目的:模擬生產(chǎn)環(huán)境
2).方法:執(zhí)行1小時(shí)左右,加上思考時(shí)間
八.資源監(jiān)控及調(diào)優(yōu)
性能測試執(zhí)行過程中,需要監(jiān)控系統(tǒng)各項(xiàng)資源,看是否能滿足用戶實(shí)際需要,如內(nèi)存使用,SQL SERVER等,結(jié)合LR生成的分析報(bào)告,分析系統(tǒng)哪里可能存在問題,需要改進(jìn),進(jìn)行調(diào)優(yōu),這也是我之后要接著進(jìn)行學(xué)習(xí)的地方。
1.學(xué)習(xí)使用weblogic,了解weblogic常配參數(shù)的意義。通過weblogic自身的監(jiān)控臺,可以了解到目前的JVM的大小、數(shù)據(jù)庫連接池的使用情況以及目前連接的客戶端數(shù)量以及請求狀況等等。
2.學(xué)習(xí)oracle使用,熟悉它的體系結(jié)構(gòu),尤其是oracle10里 的awr,awr能采集與統(tǒng)計(jì)數(shù)據(jù),并從那些統(tǒng)計(jì)數(shù)據(jù)中導(dǎo)出性能量度,以跟蹤潛在的問題。
3.需要繼續(xù)學(xué)習(xí)LR的理論知識和實(shí)際操作,參考書籍《Web性能測試實(shí)戰(zhàn)》、《軟件性能測試過程詳解與案例剖析》