第一篇:loadrunner使用cookie模擬
loadrunner使用cookie模擬
自己的工作總結,大家討論討論
1為什么要使用cookie模擬
從日常項目測試過程中的問題說起。
比如要進行論壇中的文件下載功能的測試。我們都知道只有登錄用戶才能進行下載操作,這樣我們的測試過程可能就變成了先登錄系統,然后再進行下載操作。在使用loadrunner設計腳本時就要先在初始化部分寫登錄腳本,然后再action中寫下載操作,當單個用戶運行時我們可能看不到什么問題。當用戶并發量較多時,問題馬上暴露出來了。大部分用戶可能很長時間也沒有下載成功,大量的初始化登錄操作已經給系統造成了很大的壓力,而在日常訪問中,這種大量短時間登錄的壓力是不容易出現的。這樣的測試結果可能無法達到我們的測試目標。的確,不能處理較大的登錄吞吐可能已經是系統的瓶頸了,我們可以通過這種全流程的測試方式發現登錄的問題。但是后續的測試我們可能就無法進行下去了。當項目組解決了登錄的吞吐問題時,可能項目工期已經十分緊張了,再進行重要的下載功能測試可能已經太晚了。
這種情況在測試過程中經常會出現,我們要如何繞過登錄盡早的進行后續的下載操作呢?如果網站使用了cookie的機制,則我們可以嘗試使用下面的方法。
2怎么使用loadrunner模擬
Loadrunner的web函數中提供了幾個關于cookie的函數。
web_remove_cookie()
web_add_cookie()
web_cleanup_cookies();
web_reg_add_cookie();
這里我們為了模擬cookie繞過登錄使用web_add_cookie();
首先獲取網站留在客戶端上的cookie都存儲了什么。通常主要內容包括名字,值,過期時間,作用域和路徑,分為會話cookie和文件cookie。會話cookie存儲在內存里,關閉瀏覽器后就沒有了,這種很難模擬。文件cookie是將cookie信息寫到硬盤上,關閉瀏覽器再次打開后仍可以使用。我們要模擬的就是這種存儲在硬盤文件里的cookie。我們觀察cookie文件的內容,如果使用ie的話,在“C:Documents and Settings用戶名Local SettingsTemporary Internet Files”中的用戶名@域名的文件里,cookie存儲都是加密的,所以我們直接看并看不出什么特別的東西,也搞不清楚具體是什么。這時我們借助IE webdeveloper 工具獲取cookie值如下所示:
cdb_cookietime=2592000;cdb_smile=1D1;cdb_sid=71WKOd;cdb_auth=TzsVl16XRFahjqkfuWyoF5OzI%2BrekHgiy0YXJd8m1y9vq6aV4bg3GGMsa9s;cdb_visitedfid=20;cdb_onlineusernum=28
獲得了cookie信息后,我們進行編輯loadrunner腳本。將cookie每個分號分行,使用UltraEdit進行列模式操作,在每句后面加上域名。(域名在webdeveloper的Attributes下也可以找到domain對應值),修改完成后如下。
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函數之前,你就可以繞過登錄進行后續操作了。如:
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錄制功能是自動的增加cookie的,只要在cookie不過期的情況下,我們不需要手工的增加cookie,當出現錄制不上或錄制的值發生變化時可以手工進行添加。
在loadrunner場景設計使用其他負載機器時,同樣可以使用你本機的這個cookie值進行,不會因為客戶端機器發生變化而產生影響。
第二篇:LoadRunner檢查點使用小結
LoadRunner檢查點使用小結
LR中檢查點有兩種:圖片和文字。這兩種檢查點可用以下三個函數實現:web_find()、web_reg_find()和web_image_check()下面分別介紹三種函數的用法
1、web_find()函數
函數作用:在頁面中查找相應的內容
參數舉例:web_find(“web_find”,“RighOf=a”,“LeftOf=b”,“What=name”,LAST);參數解釋:“web_find”定義該查找函數的名稱;“LeftOf”和“RighOf=”用來定義查找字符的左右邊界;“What=”定義查找內容。
例如上述參數舉例中的意思就是在頁面中查找左邊界為b,右邊界為a,內容為name的信息 函數用法:該函數是在查找頁面中的內容,所以要放在要查找的內容的后面。注意事項:使用該函數時,要在Vuser->Run-Tme Settings中更改下設置
勾選Enable Image and text check
系統默認是不勾選該選項的。
2、web_reg_find()函數
函數作用:在緩存中查找相應的內容
參數舉例:web_reg_find(“Search=Body”,“SaveCount=ddd”,“Test=aaa”,LAST);參數解釋: Search用來定義查找范圍,SaveCount定義查找計數變量名稱,該參數可以記錄在緩存中查找內容出現的次數,可以使用該值,來判斷要查找的內容是否被找到
例如上述參數舉例中的意思就是Body中查找內容為aaa的信息,并將出現次數記錄在變量ddd中。函數用法:該函數是在緩存中查找相應的內容,所以要放在查找內容之前。
注:在錄制過程中添加的檢查點,用到的函數是web_reg_find(),且參數只有“Text=”
3、web_image_check()函數
函數作用:在頁面中查找一個具體的圖片。
參數說明:web_image_check(“web_image_check”,“Alt=”,“Src=”,LAST);;參數解釋:“Alt”和“Src”的值直接取該圖片在網頁源代碼中相應參數的值。函數用法:該函數是在緩存中查找相應的內容,所以要放在查找內容之前。
注意事項:使用該函數時,要在Vuser->Run-Tme Settings中勾選Enable Image and text check,具體操作請看web_find()中的注意事項。
經過測試,該函數用到查找內容前面或后面,都不影響查找結果。舉例說明(腳本)
該腳本記錄的是登陸系統后退出的操作,在腳本中用到atoi()函數和lr_eval_string(”{SaveCount定義的變量}”)兩個函數結合使用,判斷查找內容出現的次數是否大于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);
//檢查是否登錄成功
//如果“歡迎您”這個字符出現次數大于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()函數的作用是將一個ASCII字符串轉換為整型
//lr_eval_string()函數作用是取得參數值,將字符串變量中的參數值替換為當前的參數值并將這個字符串返
回 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()函數的日志信息(這兩個日志信息是上一樣的,只是輸出的函數名和參數不同)
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] 出現該信息,說明沒有勾選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] 出現該信息,說明檢查點設置成功,且已經查找到信息
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] 出現該信息,說明要查找的內容沒有找到。這時依次嘗試以下操作:(1)檢查參數的信息是否寫錯;
(2)如果是web_find(),檢查函數的位置是否在要查找內容的后面;
(3)如果是web_image_check(),查看該圖片的源代碼,看其是否是這個頁面上的圖片,很可能是圖片選擇錯誤,即所選圖片不屬于該頁面。
2、web_reg_find()函數的日志信息
1)信息1Action.c(15): Registering web_reg_find was successful [MsgId: MMSG-26390] 出現該信息,說明內容已查找到
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頁面是紅色顯示的,說明沒有找到內容,出現此情況嘗試以下兩個操作:(1)參數的信息是否正確;
(2)查看該函數是否在查找內容的前面。
第三篇:LoadRunner檢查點使用小結
LR中檢查點有兩種:圖片和文字。常用檢查點函數如下:
1)web_find()函數用于從 HTML 頁中搜索指定的文本字符串;
2)web_reg_find()函數注冊一個請求,以在下一個操作函數(如 web_url)檢索到的HTML網頁上搜索指定的文本字符串;
3)web_image_check()函數用于從HTML頁面中查找指定的圖片;
4)web_global_verfication()屬于注冊函數,注冊一個在web頁面中搜索文本字符串的請求,與web_reg_find只在下一個Action函數中執行搜索不同的是它在之后所有的Action類函數中執行搜索指定的文本字符串; 下面分別介紹以上函數的用法:
1、web_find()函數參數舉例:
web_find(“web_find”,“RighOf=a”,“LeftOf=b”,“What=name”,LAST);參數解釋:“web_find”定義該查找函數的名稱;“LeftOf”和“RighOf=”用來定義查找字符的左右邊界;“What=”定義查找內容;
例如上述參數舉例中的意思就是在頁面中查找左邊界為b,右邊界為a,內容為name的信息;
使用該函數注意事項:該函數是在查找頁面中的內容,所以要放在要查找的內容的后面;該函數只能在基于HTML模式錄制的腳本中進行查找
注意事項:使用該函數時,要在Vuser->Run-Tme Settings中更改下設置
勾選Enable Image and text check
系統默認是不勾選該選項的。
2、web_reg_find()函數參數舉例: web_reg_find(“Search=Body”,“SaveCount=ddd”,“Test=aaa”,LAST);參數解釋: Search用來定義查找范圍,SaveCount定義查找計數變量名稱,該參數可以記錄在緩存中查找內容出現的次數,可以使用該值,來判斷要查找的內容是否被找到;
例如上述參數舉例中的意思就是Body中查找內容為aaa的信息,并將出現次數記錄在變量ddd中;
【代碼一:web_reg_find(“Text=Payment Details”,LAST);代碼思路:1.“Payment Details” 為你要檢查的文本;
2.腳本執行到此處,若在頁面上找到了這幾個字符串,那腳本繼續執行下去;若沒有找到,腳本將在此報錯并且結束?!?/p>
【代碼二:web_reg_find(“Text=Payment Details”, “SaveCount=para_count”, LAST);//check 的函數
web_submit_form(“reservations.pl_2”, //要check的頁面的錄制時的代碼 “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)//驗證是否找到了頁面上的要檢查的字符串
lr_output_message(“we find the string!”);else lr_output_message(“sorry,don't find the string!”);代碼思路:1.“Payment Details” 為你要檢查的文本;
2.腳本執行到此處,不管頁面上是否存在你要檢查的字符串,腳本都不會報錯,而是執行下去。3.此段代碼將找到的你要檢查的字符串的個數,存為一個參數。然后在頁面代碼的后面,通過檢查這個參數的值是否大于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代碼:腳本執行到此處,若沒有找到check的字符串,腳本將FAIL,并且停止執行下去。反之,則一直執行下去。
3.若是B代碼:腳本執行到此處,若找到check的字符串,腳本將FAIL,并且停止執行下去。反之,則一直執行下去】
使用該函數注意事項:該函數是在緩存中查找相應的內容,所以要放在查找內容之前;通常情況下寫在如下六個函數之前:Web_castom_request();web_image();web_link();web_submit_data();web_submit_form();web_url(); 使用技巧:在該函數的參數中有個“SaveCount”,該參數可以記錄在緩存中查找內容出現的次數,我們可以使用該值,來判斷要查找的內容是否被找到,下面舉個例子來說明:(引用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(“login.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字符串出現次數大于0 lr_output_message(”Log on successful.“);}//在日志中輸出Log on successful else{ //如果出現次數小于等于
lr_error_message(”Log on failed“);//在日志中輸出Log on failed return(0);} 我覺得這個方法非常有用,我們可以舉一反三,應用到我們實際的項目 注:在錄制過程中添加的檢查點,用到的函數是web_reg_find(),且參數只有“Text=”
3、web_image_check()函數參數說明: web_image_check(”web_image_check“,”Alt=“,”Src=“,LAST);參數解釋:“Alt”和“Src”的值直接取該圖片在網頁源代碼中相應參數的值; 注意事項:使用該函數時,要在Vuser->Run-Tme Settings中勾選Enable Image and text check,具體操作請看web_find()中的注意事項。經過測試,該函數用到查找內容前面或后面,都不影響查找結果。舉例說明(腳本)
該腳本記錄的是登陸系統后退出的操作,在腳本中用到atoi()函數和lr_eval_string(”{SaveCount定義的變量}”)兩個函數結合使用,判斷查找內容出現的次數是否大于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);//檢查是否登錄成功
//如果“歡迎您”這個字符出現次數大于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()函數的作用是將一個ASCII字符串轉換為整型
//lr_eval_string()函數作用是取得參數值,將字符串變量中的參數值替換為當前的參數值并將這個字符串返回 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()函數的日志信息(這兩個日志信息實際上是一樣的,只是輸出的函數名和參數不同)
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] 出現該信息,說明沒有勾選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] 出現該信息,說明檢查點設置成功,且已經查找到信息
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] 出現該信息,說明要查找的內容沒有找到。這時依次嘗試以下操作:(1)檢查參數的信息是否寫錯;
(2)如果是web_find(),檢查函數的位置是否在要查找內容的后面;(3)如果是web_image_check(),查看該圖片的源代碼,看其是否是這個頁面上的圖片,很可能是圖片選擇錯誤,即所選圖片不屬于該頁面。
2、web_reg_find()函數的日志信息
1)信息1Action.c(15): Registering web_reg_find was successful [MsgId: MMSG-26390] 出現該信息,說明內容已查找到
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頁面是紅色顯示的,說明沒有找到內容,出現此情況嘗試以下兩個操作:
(1)參數的信息是否正確;
(2)查看該函數是否在查找內容的前面。插入函數的方法:
1、手工寫入,在需要插入函數的位置手工寫入該函數;
2、光標停留在要插入函數的位置,在INSERT菜單中,選擇new step,在列表中選擇或查找要插入的函數,根據提示填寫必要的參數;
3、在tree view模式下,在樹狀菜單中選中要插入函數的位置,右鍵,選擇insert after或insert before,根據提示填寫必要的參數; 總結:
1、這兩個函數函數類型不同,WEB_FIND是普通函數,WEB_REG_FIND是注冊函數;
2、WEB_FIND使用時必須開啟內容檢查選項,而WEB_REG_FIND則不沒有此限制;
3、WEB_FIND只能用在基于HTML模式錄制的腳本中,而WEB_REG_FIND沒有此限制;
4、WEB_FIND是在返回的頁面中進行內容查找,WEB_REG_FIND是在緩存中進行查找;
5、WEB_FIND在執行效率上不如WEB_REG_FIND;
第四篇:LoadRunner測試總結
性能測試(并發負載壓力)測試分析-簡要篇
在論壇混了多日,發現越來越多的性能測試工程師基本上都能夠掌握利用測試工具來作負載壓力測試,但多數人對怎樣去分析工具收集到的測試結果感到無從下手,下面我就把個人工作中的體會和收集到的有關資料整理出來,希望能對大家分析測試結果有所幫助。
分析原則:
? 具體問題具體分析(這是由于不同的應用系統,不同的測試目的,不同的性能關注點)? 查找瓶頸時按以下順序,由易到難。
服務器硬件瓶頸-〉網絡瓶頸(對局域網,可以不考慮)-〉服務器操作系統瓶頸(參數配置)-〉中間件瓶頸(參數配置,數據庫,web服務器等)-〉應用瓶頸(SQL語句、數據庫設計、業務邏輯、算法等)注:以上過程并不是每個分析中都需要的,要根據測試目的和要求來確定分析的深度。對一些要求低的,我們分析到應用系統在將來大的負載壓力(并發用戶數、數據量)下,系統的硬件瓶頸在哪兒就夠了。? 分段排除法 很有效
分析的信息來源:
?1 根據場景運行過程中的錯誤提示信息
?2 根據測試結果收集到的監控指標數據
一.錯誤提示分析
分析實例:?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、應用服務死掉。
(小用戶時:程序上的問題。程序上處理數據庫的問題)
?B、應用服務沒有死
(應用服務參數設置問題)
例:在許多客戶端連接Weblogic應用服務器被拒絕,而在服務器端沒有錯誤顯示,則有可能是Weblogic中的server元素的AcceptBacklog屬性值設得過低。如果連接時收到connection refused消息,說明應提高該值,每次增加25%
?C、數據庫的連接
(1、在應用服務的性能參數可能太小了
2、數據庫啟動的最大連接數(跟硬件的內存有關))
2Error: Page download timeout(120 seconds)has expired
分析:可能是以下原因造成?A、應用服務參數設置太大導致服務器的瓶頸
?B、頁面中圖片太多
?C、在程序處理表的時候檢查字段太大多
二.監控指標數據分析
1.最大并發用戶數:
應用系統在當前環境(硬件環境、網絡環境、軟件環境(參數配置))下能承受的最大并發用戶數。在方案運行中,如果出現了大于3個用戶的業務操作失敗,或出現了服務器shutdown的情況,則說明在當前環境下,系統承受不了當前并發用戶的負載壓力,那么最大并發用戶數就是前一個沒有出現這種現象的并發用戶數。
如果測得的最大并發用戶數到達了性能要求,且各服務器資源情況良好,業務操作響應時間也達到了用戶要求,那么OK。否則,再根據各服務器的資源情況和業務操作響應時間進一步分析原因所在。
2.業務操作響應時間:
? 分析方案運行情況應從平均事務響應時間圖和事務性能摘要圖開始。使用“事務性能摘要”圖,可以確定在方案執行期間響應時間過長的事務。
? 細分事務并分析每個頁面組件的性能。查看過長的事務響應時間是由哪些頁面組件引起的?問題是否與網絡或服務器有關?
? 如果服務器耗時過長,請使用相應的服務器圖確定有問題的服務器度量并查明服務器性能下降的原因。如果網絡耗時過長,請使用“網絡監視器”圖確定導致性能瓶頸的網絡問題
3.服務器資源監控指標:
內存:UNIX資源監控中指標內存頁交換速率(Paging rate),如果該值偶爾走高,表明當時有線程競爭內存。如果持續很高,則內存可能是瓶頸。也可能是內存訪問命中率低。Windows資源監控中,如果ProcessPrivate Bytes計數器和ProcessWorking Set計數器的值在長時間內持續升高,同時MemoryAvailable bytes計數器的值持續降低,則很可能存在內存泄漏。
內存資源成為系統性能的瓶頸的征兆:
很高的換頁率(high pageout rate);
進程進入不活動狀態;
交換區所有磁盤的活動次數可高;
可高的全局系統CPU利用率;
內存不夠出錯(out of memory errors)
處理器:UNIX資源監控(Windows操作系統同理)中指標CPU占用率(CPU utilization),如果該值持續超過95%,表明瓶頸是CPU??梢钥紤]增加一個處理器或換一個更快的處理器。如果服務器專用于SQL Server,可接受的最大上限是80-85%
合理使用的范圍在60%至70%。Windows資源監控中,如果SystemProcessor Queue Length大于2,而處理器利用率(Processor Time)一直很低,則存在著處理器阻塞。
CPU資源成為系統性能的瓶頸的征兆:
很慢的響應時間(slow response time)
CPU空閑時間為零(zero percent idle CPU)
過高的用戶占用CPU時間(high percent user CPU)
過高的系統占用CPU時間(high percent system CPU)
長時間的有很長的運行進程隊列(large run queue size sustained over time)
磁盤I/O:UNIX資源監控(Windows操作系統同理)中指標磁盤交換率(Disk rate),如果該參數值一直很高,表明I/O有問題??煽紤]更換更快的硬盤系統。Windows資源監控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec頁面讀取操作速率很低,則可能存在磁盤瓶徑。
I/O資源成為系統性能的瓶頸的征兆 :
過高的磁盤利用率(high disk utilization)
太長的磁盤等待隊列(large disk queue length)
等待磁盤I/O的時間所占的百分率太高(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))
太長的運行進程隊列,但CPU卻空閑(large run queue with idle CPU)
4.數據庫服務器:
SQL Server數據庫:SQLServer資源監控中指標緩存點擊率(Cache Hit Ratio),該值越高越好。如果持續低于80%,應考慮增加內存。如果Full Scans/sec(全表掃描/秒)計數器顯示的值比1或2高,則應分析你的查詢以確定是否確實需要全表掃描,以及SQL查詢是否可以被優化。Number of Deadlocks/sec(死鎖的數量/秒):死鎖對應用程序的可伸縮性非常有害,并且會導致惡劣的用戶體驗。該計數器的值必須為0。Lock Requests/sec(鎖請求/秒),通過優化查詢來減少讀取次數,可以減少該計數器的值。
Oracle數據庫:如果自由內存接近于0而且庫快存或數據字典快存的命中率小于0.90,那么需要增加
SHARED_POOL_SIZE的大小。
快存(共享SQL區)和數據字典快存的命中率:
select(sum(pins-reloads))/sum(pins)from v$librarycache;
select(sum(gets-getmisses))/sum(gets)from v$rowcache;
自由內存:select * from v$sgastat where name=’free memory’;如果數據的緩存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS參數的值(單位:塊)。緩沖區高速緩存命中率:
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))如果日志緩沖區申請的值較大,則應加大LOG_BUFFER參數的值。
日志緩沖區的申請情況 :
select name,value from v$sysstat where name = 'redo log space requests';如果內存排序命中率小于0.95,則應加大SORT_AREA_SIZE以避免磁盤排序。
內存排序命中率 :
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數據庫分析,只是一些簡單、基本的分析,特別是Oracle數據庫的分析和優化,是一門專門的技術,進一步的分析可查相關資料。
說明:
以上只是個人的體會和部分資料的整理,并不代表專家之言。算拋磚引玉,有不同看法和更深入的分析的,希望大家勇要發言,以推動我們國內的性能測試工作。
第五篇:LoadRunner學習總結
LoadRunner學習小結
今年十月份我到北京跟張坤學習性能測試知識,共花了三個星期學習LoadRunner。以下是我的學習小結。
一. 什么是LoadRunner LoadRunner是一種預測系統行為和性能的工業標準級負載測試工具。通過以模擬多個用戶實施并發負載測試及實時性能檢測的方式來確認和查找問題,能對整個企業架構進行測試。
二. LoadRunner的優點
1.輕松創建虛擬用戶:通過記錄下業務流程轉為測試腳本,在機器上產生多個用戶訪問,減少負載測試需要的硬件和人力資源。
2.創建真實的負載:可以通過Controller設定負載方案,如定義用戶在什么時候訪問系統以產生負載,所有用戶同時執行一個動作來模擬峰值負載情況等。3.實時監測器:可以實時顯示交易性能數據(如響應時間)和其他系統組件如數據庫,網絡等的實時性能。
4.分析結果以精確定位問題所在:LoadRunner能收集匯總所有測試數據,提供高級的分析和報告工具。
三. LoadRunner的安裝與使用
1.安裝過程詳見上傳的LoadRunner使用手冊,在此不再詳細介紹。2.具體使用:
點擊File新建錄制文件,也可以點擊下面的NEW快捷鍵進行新建。使用File新建,會彈出協議選擇窗口,選擇新的單協議腳本(New Single Protocol Script)的Web(HTTP/HTML)項,確定即可(選擇Web項是因為我們測試的是Web應用)。接著會彈出開始錄制的設置項,需要寫入錄入系統的地址,點擊確定后就會根據錄入地址展現系統頁面,開始錄制腳本,出現小工具條:
第一個按鈕為錄制鍵 第二個為回放腳本鍵 第三個為停止錄制鍵 第四個為暫停錄制鍵 第五個為編譯腳本鍵
第六個為創建新的Action鍵。LR的錄制腳本分為三個部分,vuser_init、vuser_end和 Action。腳本循環執行時,只執行一次vuser_init和vuser_end,而多次循環Action部分。比如錄制投保業務時,登陸系統部分放入vuser_init,退出登陸放到vuser_end,中間的投保操作放到Action中,則循環執行時就會登陸一次投保系統開始反復執行投保操作直到結束退出系統。
第七個為用來改變錄制的options設置按鈕
第八個和第九個為插入事務的起始點和結束點鍵,結合起來構成一個完整事物,用來衡量服務器的性能。比如錄制腳本過程中,投保系統的查詢投保單號操作,可以在輸入完查詢信息后點擊查詢按鈕前插入事務的起始點,查詢出數據后插入事務的結束點,這樣在運行測試腳本時,Loadrunner在運行到該事務時,便會計算出這個查詢操作所花時間,便于衡量服務器執行查詢操作的性能。
第十個為插入集合點鍵,可用于衡量在加重負載的情況下服務器的性能。比如要驗證系統是否能承受100人同時進行報案操作,便可在腳本錄入過程中,點擊報案確認鍵操作前插入集合點,這樣當腳本運行到集合點時,Loadrunner會讓100個虛擬用戶同時點擊報案確認按鈕(如果有的用戶還沒運行到集合點,先到用戶要等未到用戶一起操作)進行報案,從而達到測試目的。
最后一個為設置驗證點鍵,在創建事物后,設置一個驗證點可以用來確認事物執行是否成功。比如進行查詢事務操作時,LR只要檢測到網頁的響應,就認為事務pass,而不管顯示頁面內容是否正確。因此為了檢查Web服務器返回的網頁是否正確,可以插入Text/Image檢查點,驗證網頁上是否存在指定的Text或Image。
設置驗證點時,如果我們驗證的文本內容是中文,有時會返回無法找到驗證內容的報錯信息,而頁面顯示又是正確的,出現問題的原因可能是因為LR對中文的支持部好,盡量選擇驗證信息為數字或字母;也可能是設置問題,可以嘗試將Tools->Recording Options->HTTP Properties下的Advanced選項里設置支持UTF-8,再檢查開發人員有沒有設置支持中文。
錄制結束后,先點擊保存腳本,同時為腳本命名。然后編譯腳本,看是否存在語法錯誤,編譯成功后,即可回放,看錄制腳本是否成功。
LoadRunner錄制得到的腳本基本沒有錯誤,不像robot會有錄入數據的缺失,只是會錄入一些非錄入系統的網頁信息,根據地址可以識別并刪除掉。
四. LoadRunner腳本錄制學習小結
1.LoadRunner錄制腳本,主要是為了進行壓力測試,所以跑流程時,跑了主要流程即可,也就是系統必須的信息錄入就可以了。2.LoadRunner的腳本運行過程中,只能用于一次業務辦理的數據需要做參數化,如車輛車架號,車牌,報案號等,以免出現重復投保或報案無法立案現象,不能繼續進行下去。參數化步驟:
1)將需要做參數化的數據右鍵點擊,選擇Replace with a parameter,進行設置。2)在彈出編輯框里,設置易懂的參數名稱,再點擊Properties進行屬性設置。3)點擊Create Table 按鈕,生成參數表格,再點擊Edit with Notepad按鈕,即可在記事本里添加新的參數,添加完后再次回車(不回車可能最后條數據讀取不到)關閉,參數化操作完成。
4)使用Ctrl +H鍵可以找到替換同樣的需要參數化的數據。
3.腳本跑流程過程中,因為業務運轉,前面生成的投保單要接著進行提交核保業務,而每次生成的投保單號不一樣,用于進行提交核保的單號也要與之前的保持一致,因此需要做關聯處理,讀取到生成的新投保單號給提交核保流程。關聯步驟:
1).查找關聯數據第一次出現的位置,判斷該數據是由什么函數返回的。
2).在樹形結構里點擊返回該數據值的函數,看它的Server Response信息,用復制的關聯數據進行查找它的返回語句,找到區分度明顯的語句(不一定要是第一個返回語句),然后使用web_reg_save_param函數進行關聯。
注:關聯函數一定要寫在第一個返回該數據值的函數前。
3).web_reg_save_param(const char *ParamName, , LAST);
函數的第一個參數是用來對關聯數據進行定義的,取名最好可讀性強;第二個參數是用來標識關聯數據在返回語句里的具體位置的,寫出該數據的左右邊界,程序才能識別;LAST表示屬性列的結束。比如辦理理賠業務的流程號,在服務器的返回語句里是:
做關聯為:
web_reg_save_param(“LogFlowID”,“LB=name=flowID type=”hidden“ value=”,“RB=>”,LAST);定義的參數名就叫LogFlowID,表示流程號,易于明白;左邊界從name取就可以標識了,也可取長點或短點,只要能區分;右邊界只有>,寫上就好;最后寫上LAST。
在定義的左右邊界中,如果有雙引號,在腳本中是需要轉義的,因為雙引號在C中是有意義的,這里只要表示語句信息,加上右斜杠。尖括號直寫。
左右邊界也需要用雙引號括起來。定義好的參數寫在程序中,需要在加上單尖括號:swfLogFlowID={LogFlowID} 五. 腳本執行過程中的報錯處理
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]
兩個錯誤一起出現,出錯語句都是在關聯函數下的提交數據函數位置,但是具體出錯有可能是:
1).關聯函數左右邊界沒寫對,所有信息都要用字符輸入,不能是中文或其他。
2).在關聯函數確認寫對的情況下,看提交數據函數中的業務設置,比如有可能是因為保單查詢語句,設置的查詢時間是過去的時間,新生成的投保單當然查不到,這樣程序也會報這樣的錯。
3.loadrunner 執行理賠的立案處理,錄制好腳本后,回放,報錯:
腳本日志信息提示:
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] 腳本執行過程停止在立案信息提交頁面,錯誤原因:數據問題,可能是有的應該變化的信息沒有變。
在該流程中,一個報案號只能做一次立案,而初始腳本沒有設置參數、關聯,使用保單號進行查詢,錯誤被掩蓋。在立案系統中,一個保單號可以重復報案,但是一個報案號只能一次立案,要跑通流程,需要先將這一保單再重復報案,得到新的報案號。
六. 性能測試的場景設置
腳本錄制完畢后,接著準備測試場景。1.首先準備測試數據。比如車險投保,需要投保人和車架號信息來唯一標識一輛被保車,因此就需要將投保人和車架號做參數化處理,編輯文本框錄入大量數據讓腳本唯一讀?。?/p>
1).錄入投保人參數,車架號參數,過程同腳本錄制的參數化處理
2).因為投保人和車架號一起生成一條投保數據,可設置車架號隨投保人參數一起讀取,設置步驟為:
投保人文件存放路徑--File path
投保人參數數據讀取方式
腳本按列名讀取參數,每行數據讀取一次,每次循環取一次新值。接著設置車架號參數信息:
車架號參數讀取文件路徑設為和投保人文件路徑一樣
腳本按列名讀取參數,行號選擇和讀取的投保人數據同一行
這樣得到所需的投保單生成參數數據
2.設置測試場景
點擊Tools->Create Controller Scenarios,彈出場景類型選擇框:
錄入需要的虛擬用戶數,選擇生成結果存放路徑和組名。確定后進入具體設置頁面:
Quantity表示虛擬用戶個數,group name為組名。
1).設置運行時間選項Run – time Settings
選擇循環次數Run Logic->Iteration Count,設置循環10次,虛擬用戶數為之前設置的5人,則預計一共可生成50張投保單。
設置思考時間,思考時間通常是錄制腳本過程中,填寫頁面信息花費的時間,選擇忽略項,節省跑腳本的時間。
設置網絡連接時間,點擊網絡協議項Internet Protocol 的Options鍵,將彈出頁面里的HTTP-request connect timeout和 HTTP-request receive timeout的數值改為1000。使得能在網絡狀況不太好的情況下向服務器發送接收數據。
2).設置Edit Schedule
選擇虛擬用戶加載方式:
可以一次加載所有用戶,也可以按需要設置,一秒加載一個用戶或其他。
選擇結束方式:
當選擇一秒加載一個用戶時,結束設置為直到跑完所有腳本停止執行。如果選擇選擇一次加載所有用戶可以選擇運行多少時間后停止和不停止選項。
這些設置完成后,一次測試場景布置完成??梢赃M行基線檢查或單點并發測試。
七. 性能測試步驟
一).除測試工具外性能測試必備的系統及業務知識
1、熟悉保險行業業務特點,有助于與開發和客戶討論需求,制定測試用例;
2、熟悉系統的實現特點,開發實現方式,有助于選擇程序處理復雜、消耗系統資源的用例點;
3、熟悉數據結構,了解數據存儲規則,對腳本調試、數據準備、測試執行和監視都有幫助;
4、熟悉系統所使用的數據庫、操作系統、中間件的監視和性能問題查看,有助于測試監視和發現問題;
5、熟悉系統架構及系統集成方式,有助于分析及明確定位性能問題。
二)性能測試執行過程 1.基線檢查
1).目的:驗證環境是否可用;
驗證腳本是否能在場景正常執行。
2).方法:1個人單獨循環5次--沒有其他人干擾,干凈的環境
3).結果:一般一個事物的響應時間超過3秒就可能存在問題,要提報開發人
2.單點并發
1).目的:為了快速的發現問題,如多進程的鎖機制,看是否相互間有影響。2).方法:一般是10人或20人執行10到15分鐘,執行過程忽略思考時間。
忽略思考時間可以減少客戶端時間,加快向服務器傳送數據速度,很大程度上增大了服務器的壓力,20個人單點并發的壓力就相當于200人正常執行帶給服務器的壓力。
3).單點測試的數據可以用來進行混發測試,但是有可能單點測試的數據不足以進行混發,需要自己再準備足夠的數據。
3.方案測試--混發測試
1).目的:模擬生產環境
2).方法:執行1小時左右,加上思考時間
八.資源監控及調優
性能測試執行過程中,需要監控系統各項資源,看是否能滿足用戶實際需要,如內存使用,SQL SERVER等,結合LR生成的分析報告,分析系統哪里可能存在問題,需要改進,進行調優,這也是我之后要接著進行學習的地方。
1.學習使用weblogic,了解weblogic常配參數的意義。通過weblogic自身的監控臺,可以了解到目前的JVM的大小、數據庫連接池的使用情況以及目前連接的客戶端數量以及請求狀況等等。
2.學習oracle使用,熟悉它的體系結構,尤其是oracle10里 的awr,awr能采集與統計數據,并從那些統計數據中導出性能量度,以跟蹤潛在的問題。
3.需要繼續學習LR的理論知識和實際操作,參考書籍《Web性能測試實戰》、《軟件性能測試過程詳解與案例剖析》