测试最大在线用户数
背景介紹
在性能測試工作中,有時需要對業(yè)務(wù)系統(tǒng)所能支持的最大在線用戶數(shù)目進(jìn)行評估。這與我們接觸最多的壓力測試不一樣,因?yàn)橛脩粼诰€時只是與服務(wù)器保持連接,并不一定對服務(wù)器有業(yè)務(wù)請求,從而對服務(wù)器不一定會產(chǎn)生壓力。然而,在線用戶數(shù)目并非可以無限增長,當(dāng)在線用戶數(shù)目達(dá)到應(yīng)用服務(wù)器(或者WebLogic等中間件,或者數(shù)據(jù)庫連接池等)的連接數(shù)設(shè)置的極限時,業(yè)務(wù)系統(tǒng)同樣可能會發(fā)生異常,出現(xiàn)新用戶無法登錄,或者老用戶被擠出系統(tǒng),甚至業(yè)務(wù)系統(tǒng)宕機(jī)的情況。因此,對業(yè)務(wù)系統(tǒng)的最大在線用戶數(shù)指標(biāo)進(jìn)行測試是極其必要的。
現(xiàn)有一OA系統(tǒng),需要測試其支持的最大在線用戶數(shù)目。已知當(dāng)使用瀏覽器登錄該系統(tǒng)后,登錄用戶可持續(xù)地保持登錄狀態(tài),即使長時間不做任何操作也不會自動退出系統(tǒng);通過該OA系統(tǒng)的在線用戶數(shù)統(tǒng)計模塊可以詳細(xì)地查看到當(dāng)前在線的用戶。
測試方法分析
為了測試被測系統(tǒng)所能支持的最大在線用戶數(shù),需要不斷地使用新用戶帳號進(jìn)行登錄操作,在此同時查看被測系統(tǒng)的在線用戶數(shù)目以及系統(tǒng)的響應(yīng)情況。
在新增登錄用戶時需要注意,由于考察的是系統(tǒng)在正常情況下所能支持的在線用戶數(shù)目,而不是系統(tǒng)在并發(fā)壓力下的性能響應(yīng)情況,因此登錄用戶時最好采用單個用戶或少量并發(fā)用戶(如兩個或三個)逐步登錄的形式,不同登錄批次之間最好能有一定時間間隔,務(wù)必使新增登錄用戶的操作對服務(wù)器產(chǎn)生盡可能小的業(yè)務(wù)壓力。
在新增登錄用戶的過程中,需要對被測系統(tǒng)的在線用戶數(shù)目進(jìn)行查看,并著重關(guān)注以下幾個方面:
- 持續(xù)新增登錄用戶的同時,業(yè)務(wù)系統(tǒng)中的在線用戶數(shù)目是否相應(yīng)地進(jìn)行增長
- 持續(xù)新增登錄用戶的過程中,系統(tǒng)登錄操作是否產(chǎn)生連接超時的情況,事務(wù)的響應(yīng)時間是否出現(xiàn)大幅度上升的情況,系統(tǒng)登錄事務(wù)是否出現(xiàn)失敗的情況(這需要在腳本中對登錄事務(wù)做檢查點(diǎn)設(shè)置)
- 持續(xù)新增登錄用戶的過程中,定期地在瀏覽器中手動刷新業(yè)務(wù)系統(tǒng)界面,查看業(yè)務(wù)系統(tǒng)是否出現(xiàn)不可訪問的情況(如內(nèi)部服務(wù)器錯誤、宕機(jī)等)
相應(yīng)地,測試腳本需符合如下形式:
lr_start_transaction("進(jìn)入登錄頁面"); /*此處為進(jìn)入系統(tǒng)登錄界面的腳本*/ lr_end_transaction("進(jìn)入登錄頁面", LR_AUTO);lr_start_transaction("登錄系統(tǒng)");/*登錄腳本--部分1*//*對系統(tǒng)登錄進(jìn)行校驗(yàn)*若成功,即新頁面中包含"重新登錄",reLogin_Count>0*若失敗,reLogin_Count=0*/ web_reg_find("Text=重新登錄", "SaveCount=reLogin_Count",LAST );/*登錄腳本--部分2(包含檢查點(diǎn)內(nèi)容部分)*///對系統(tǒng)登錄結(jié)果進(jìn)行檢查 if (atoi(lr_eval_string("{reLogin_Count}")) == 0) { //登錄失敗lr_error_message("登錄失敗!!!--UserName:%s",lr_eval_string("{UserName}"));//勾選Fail Open Transations on lr_error_message//當(dāng)執(zhí)到該lr_error_message時,"登錄系統(tǒng)"的Transaction失敗 }lr_end_transaction("登錄系統(tǒng)", LR_AUTO);
?
以上腳本調(diào)試成功后,通過檢查點(diǎn)函數(shù)及日志信息可以判斷出系統(tǒng)登錄操作已通過腳本回放成功完成。
理論上,只要VuGen采用不同帳號迭代運(yùn)行該腳本,由于只是進(jìn)行系統(tǒng)登錄操作而未進(jìn)行系統(tǒng)注銷或退出操作,業(yè)務(wù)系統(tǒng)中的在線用戶數(shù)將持續(xù)增加。
然而在該OA系統(tǒng)中采用此方法時發(fā)現(xiàn),雖然腳本成功運(yùn)行,但業(yè)務(wù)系統(tǒng)中的在線用戶數(shù)并未增長。這說明LoadRunner與瀏覽器在訪問系統(tǒng)的過程中存在差異性。
腳本及場景設(shè)計
針對上面的問題,通過抓包工具Fiddler2對系統(tǒng)進(jìn)行網(wǎng)絡(luò)流量抓包分析可知:用戶登錄系統(tǒng)后,在未進(jìn)行任何操作的情況下,瀏覽器與服務(wù)器會定期(間隔30秒)進(jìn)行通訊交互。如下圖所示:
這就解釋了為什么用戶在瀏覽器中登錄系統(tǒng)后可以長期地保持在線,而通過腳本成功地進(jìn)行系統(tǒng)登錄后卻無法保持在線狀態(tài);因?yàn)閂uGen不會像瀏覽器那樣定期地與服務(wù)器進(jìn)行通訊交互。
找出其中的差異后,我們便可在VuGen中用腳本模擬瀏覽器的定期交互功能,簡單的實(shí)現(xiàn)方法如下所示。
while(1){web_url("userAction.struts", "URL=http://10.147.15.28:9001/userAction.struts?actionType=refreshDynaInfo","Resource=0","RecContentType=text/html","Referer=http://10.147.15.28:9001/jsp/oa/infocomm/sms/sysShortMsg/sysShortMsgReflesh.jsp", "Snapshot=t4.inf", "Mode=HTML", LAST);web_url("userAction.struts_2", "URL=http://10.147.15.28:9001/userAction.struts?actionType=refreshDynaInfo&time=Mon%20Aug%2012%2015:42:04%20UTC+0800%202013", "Resource=0", "RecContentType=text/html", "Referer=http://10.147.15.28:9001/jsp/oa/infocomm/sms/sysShortMsg/reflesh.jsp", "Snapshot=t5.inf", "Mode=HTML", LAST);lr_think_time(30); //模擬瀏覽器與服務(wù)器30秒間隔的通訊交互 }那么,將系統(tǒng)登錄腳本和循環(huán)函數(shù)都放入Action中,在VuGen中采用迭代運(yùn)行的方式可行嗎?
雖然新增登錄用戶可以逐個進(jìn)行,即使用VuGen通過Action迭代的形式采用不同帳號逐個地進(jìn)行登錄操作。但由于用戶登錄后需要持續(xù)間隔地與服務(wù)器進(jìn)行通訊交互才能保持在線,而單線程腳本運(yùn)行至while(1)后便進(jìn)入死循環(huán),從而使得Action迭代無效。因此,采用VuGen進(jìn)行Action迭代的方式是不可行的。
正確的做法是,在Controller中采用逐步加載的方式,使各個虛擬用戶獨(dú)立地運(yùn)行,從而保證了各虛擬用戶登錄成功后保持在線狀態(tài)。
在Controller中的具體配置如下所示:
- Run Logic:Number of Iterations設(shè)置為1
- Think Time:Replay think time As recorded
- Continue on error:False
- Fail open transactions on lr_error_message:True
- Schedule:Initialize each Vuser just before it runs
- Schedule:Start 1000 Vusers -- 1 Vuser every 3 Seconds
- Schedule:Run for 5 minutes
通過以上配置,可以達(dá)到如下效果:
- 每個Vuser只登錄一次,然后定期30秒與服務(wù)器進(jìn)行一次交互,保持在線狀態(tài)
- Vuser的登錄操作與定期刷新操作不會對服務(wù)器造成并發(fā)壓力,且符合真實(shí)業(yè)務(wù)場景
- 逐步緩慢地增加在線用戶數(shù),當(dāng)系統(tǒng)出現(xiàn)異常時即可查看到當(dāng)前的在線用戶數(shù)目
測試方法優(yōu)化
通過以上方法可以測試得到業(yè)務(wù)系統(tǒng)所能承受的“初略的”最大在線用戶數(shù)目。為什么說是“初略的”呢?因?yàn)樵摲椒ㄈ源嬖谌毕?#xff0c;主要體現(xiàn)在如下兩個方面:
- 該方法只適用于測試期間無他人使用系統(tǒng)的情況。如果測試期間同時有其他用戶登錄系統(tǒng),或者系統(tǒng)中本身已存在在線用戶,則會造成測試得到的結(jié)果不準(zhǔn)確。
- 該方法忽略了系統(tǒng)穩(wěn)定性對在線用戶數(shù)的影響。舉例來說,也許逐步增加在線用戶數(shù)至500時,系統(tǒng)并沒有發(fā)生異常,但這并不意味著500個用戶長時間處于在線狀態(tài)時系統(tǒng)不會出現(xiàn)異常。
針對以上兩方面缺陷,可以做出如下改進(jìn):
- 在逐步增加在線用戶數(shù)的時候,定期(比如間隔3秒)查看業(yè)務(wù)系統(tǒng)自身統(tǒng)計的在線用戶數(shù)目,并以該數(shù)據(jù)為測試結(jié)果。
- 利用之前的方法測試得到業(yè)務(wù)系統(tǒng)“初略的”最大在線用戶數(shù)后,使系統(tǒng)長時間保持該數(shù)量的在線用戶數(shù)目,觀察系統(tǒng)在長時間運(yùn)行期間是否會出現(xiàn)異常;若出現(xiàn)異常后,適當(dāng)減少在線用戶數(shù)目后重復(fù)地進(jìn)行測試,直到系統(tǒng)可以保持長時間地穩(wěn)定運(yùn)行為止,此時對應(yīng)的在線用戶數(shù)目即為業(yè)務(wù)系統(tǒng)所能承受的最大在線用戶數(shù)目。
在本文提到的OA系統(tǒng)中,對鏈接[http://10.147.15.28:9001/countAction.struts?actionType=listOnlineUser] 進(jìn)行請求可以返回得到當(dāng)前系統(tǒng)在線用戶數(shù)目的統(tǒng)計信息。對應(yīng)地,設(shè)計如下腳本,即可實(shí)現(xiàn)對系統(tǒng)實(shí)時在線用戶數(shù)目的查看。
Action() {web_add_cookie("USERORGID=db93a2M11f6719ff92Mf528764d624db129b32c21fbca0cb8d6; DOMAIN=10.147.15.28");while(1){lr_start_transaction("查看在線用戶數(shù)目");web_reg_save_param("OnlineUsers","LB=[在線用戶數(shù)/總用戶數(shù):<font color=\"red\">","RB=</font>]","ORD=2","Notfound=error","Search=Body",LAST);web_url("countAction.struts", "URL=http://10.147.15.28:9001/countAction.struts?actionType=listOnlineUser", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTML", LAST);lr_output_message("當(dāng)前在線用戶數(shù)目:%s", lr_eval_string("{OnlineUsers}"));lr_end_transaction("查看在線用戶數(shù)目", LR_AUTO);lr_think_time(3);}return 0; }更多內(nèi)容請?jiān)L問我的個人網(wǎng)站:http://52test.org/posts/Evaluate-Largest-Online-Users.html
轉(zhuǎn)載于:https://www.cnblogs.com/stleo/p/Evaluate-Largest-Online-Users.html
總結(jié)
- 上一篇: php5.3.*编译出现make: **
- 下一篇: winphone8更换帐号问题的几点说明