工具應用:使用LoadRunner實現Phpwind的性能測試
來自專欄強哥學堂19 人贊了文章
實驗簡介
在前面的學習中,我們已經利用LoadRunner完成了針對Agileone系統的協議級介面測試。那麼本實驗主要帶大家一起學習一下如何利用LoadRunner完成針對Phpwind論壇的性能測試。
實驗目的
(1)掌握LoadRunner中的關聯和關聯數組用法。
(2)掌握LoadRunner中的事務和集合點的用法。
(3)掌握LoadRunner中的場景設計及指標監控。
實驗流程
1.為Phpwind實現登錄腳本
無論我們使用手工插入web_submit_data的方式生成登錄腳本,還是使用錄製操作生成腳本均可,本實驗的演示代碼全部使用手工生成。具體的登錄代碼如下:
// 登錄腳本,其中參數userseq的取值為1到100的隨機數web_submit_data("web_submit_data", "Action=http://localhost/phpwind/login.php?", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=forward", "Value=", ENDITEM, "Name=jumpurl", "Value=http://localhost/phpwind/", ENDITEM, "Name=step", "Value=2", ENDITEM, "Name=lgt", "Value=0", ENDITEM, "Name=pwuser", "Value=testuser_{userseq}", ENDITEM, "Name=pwpwd", "Value=123456", ENDITEM, "Name=hideid", "Value=0", ENDITEM, "Name=cktime", "Value=0", ENDITEM, LAST);
2. 為發帖關聯查找驗證碼
在LoadRunner中的關聯查找,與我們在Java中使用正則表達式進行查找其實本質上是一樣的,也是通過設置其左右邊界進行。在LoadRunner中使用「web_reg_save_param」函數即可實現關聯查找,不過也需要將該函數放在被查找的請求的前面,這一點來說與「web_reg_find」是一樣的規則。具體的關聯設置窗口如下圖所示:
最終生成的代碼為:
// 關聯查找發帖的驗證碼web_reg_save_param("verifycode", "LB=verify" value="", "RB=" />", "Ord=1", "NotFound=ERROR", LAST);web_url("web_url", "URL=http://localhost/phpwind/post.php?fid=2", "TargetFrame=", "Resource=0", "Referer=", LAST);
3.實現發帖功能
此處的參數「sequence」為一個10000到99999之間的隨機數,具體的代碼如下:
web_submit_data("post.php", "Action=http://localhost/phpwind/post.php?", "Method=POST", "EncType=multipart/form-data", "TargetFrame=", "RecContentType=text/html", "Referer=", "Mode=HTML", ITEMDATA, "Name=magicname", "Value=", ENDITEM, "Name=magicid", "Value=", ENDITEM, "Name=verify", "Value={verifycode}", ENDITEM, "Name=atc_title", "Value=這是帖子的標題-{sequence}", ENDITEM, "Name=atc_iconid", "Value=0", ENDITEM, "Name=atc_content", "Value=這是帖子的內容-{sequence}", ENDITEM, "Name=atc_autourl", "Value=1", ENDITEM, "Name=atc_usesign", "Value=1", ENDITEM, "Name=atc_convert", "Value=1", ENDITEM, "Name=digest", "Value=0", ENDITEM, "Name=topped", "Value=0", ENDITEM, "Name=atc_rvrc", "Value=0", ENDITEM, "Name=atc_enhidetype", "Value=rvrc", ENDITEM, "Name=atc_money", "Value=0", ENDITEM, "Name=atc_credittype", "Value=money", ENDITEM, "Name=atc_desc1", "Value=", ENDITEM, "Name=attachment_1", "Value=", ENDITEM, "Name=att_special1", "Value=0", ENDITEM, "Name=att_ctype1", "Value=money", ENDITEM, "Name=atc_needrvrc1", "Value=0", ENDITEM, "Name=step", "Value=2", ENDITEM, "Name=pid", "Value=", ENDITEM, "Name=action", "Value=new", ENDITEM, "Name=fid", "Value=2", ENDITEM, "Name=tid", "Value=", ENDITEM, "Name=article", "Value=0", ENDITEM, "Name=special", "Value=0", ENDITEM, LAST);
4. 從首頁中查找隨機版塊
對於函數「web_reg_save_param」來說,除了關聯查找到單個的值以外,如果多個值具有相同的左右邊界也是可以正常獲取到的。我們以查找首頁的版塊編號以實現隨機版塊發帖為例,來為大家介紹「關聯數組」這一知識點。
(1)先對Phpwind的首頁進行分析,確認可以將所有版塊編號關聯出來的左右邊界。通過實驗,我們發現,「thread.php?fid=」和「" target="_blank」可以作為版塊編號的左右邊界。
(2)對於web_reg_param函數來說,是查找一個值,還是查找所有值,最大的區別在於「Ord」屬性的設置,如果我們要查找到所有的值,則需要設置Ord=All。
web_reg_save_param("forumids", "LB=thread.php?fid=", "RB=" target="_blank", "Ord=All", "NotFound=ERROR", LAST);web_url("web_url", "URL=http://localhost/phpwind", "TargetFrame=", "Resource=0", "Referer=", LAST);// 將從forumids關聯數組中隨機取得的值保存到參數fid中lr_save_string(lr_paramarr_random("forumids"),"fid");
(3)一旦我們設置關聯函數中的「Ord=All」,即使只找到一個值,也是一個關聯數據,其用法有一些改變。比如我們無法直接根據參數名稱「forumids」來取得其值,而必須使用類似「forumids_1」或者「forumids_2」等這種方式來取參數值。我們也可以使用「lr_paramarr_random()」函數來從該參數數組中隨機取得一個值,所以此時,發帖的代碼可以修改為:
web_submit_data("post.php", "Action=http://localhost/phpwind/post.php?", ITEMDATA, "Name=magicname", "Value=", ENDITEM, "Name=magicid", "Value=", ENDITEM, "Name=verify", "Value={verifycode}", ENDITEM, "Name=atc_title", "Value=這是帖子的標題-{sequence}", ENDITEM, "Name=atc_iconid", "Value=0", ENDITEM, "Name=atc_content", "Value=這是帖子的內容-{sequence}", ENDITEM, // 代碼略 "Name=fid", "Value={fid}", ENDITEM, // 代碼略 LAST);
由於我們的帖子內容是中文,而Phpwind使用的是UTF-8的編碼格式,所以在運行上述腳本的時候也需要確保「Convert to/from UTF-8」被勾選。運行後,我們還可以在「Replay」菜單下的「Test Results」中直接查看運行過程的截圖:
5. 為登錄和發帖添加事務
事務的主要目的是為了在性能測試執行過程中方便統計請求的響應時間,以及結合檢查點來統計事務的成功率,及TPS等指標。比如我們可以為登錄添加如下的事務:
// 為登錄定義檢查點,用於判斷事務的成功與否web_reg_find("SaveCount=checkLogin", "Text=您已經順利登錄", LAST); // 定義登錄事務的開始,相當於計時器開始工作lr_start_transaction("doLogin");// 登錄腳本,其中參數userseq的取值為1到100的隨機數web_submit_data("web_submit_data", "Action=http://localhost/phpwind/login.php?", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=forward", "Value=", ENDITEM, "Name=jumpurl", "Value=http://localhost/phpwind/", ENDITEM, "Name=step", "Value=2", ENDITEM, "Name=lgt", "Value=0", ENDITEM, "Name=pwuser", "Value=testuser_{userseq}", ENDITEM, "Name=pwpwd", "Value=123456", ENDITEM, "Name=hideid", "Value=0", ENDITEM, "Name=cktime", "Value=0", ENDITEM, LAST);// 根據檢查點來決定事務以何種狀態結束if (atoi(lr_eval_string("{checkLogin}"))) { lr_end_transaction("doLogin",LR_PASS);}else { lr_end_transaction("doLogin",LR_FAIL);}
當然,定義發帖的事務和檢查點也是類似的方式,此處不再贅述。
6. 為請求定義思考時間
在LoadRunner中,思考時間的設置非常簡單。只需要在某一個請求後面添加一行代碼「lr_think_time(10)」,表示暫停時間為10秒,並在「Runtime Settings」中為思考時間設置隨機策略即可,通常建議將思考時間的隨機範圍設置為50%到150%之間。如果代碼中設置的固定思考時間為10秒,則運行過程的思考時間為5秒~15秒之間的一個隨機值:
7. 為請求定義集合點
如果我們需要為某個請求設置集合點,只需要在該請求前面添加一行代碼即可,沒有額外設置。比如我們為發帖設置一個集合點,則在POST請求前面添加集合點函數,並設置一個名稱即可。
// 為發帖請求設置集合點lr_rendezvous("gotoPost"); web_submit_data("post.php", "Action=http://localhost/phpwind/post.php?", // 後面的代碼略
當然,是否使用集合點,是需要我們明確測試需求。我們也可以在Controller中禁用集合點。
8. 設置拱型場景
(1)當我們的腳本開發調試完成後,便可以實現多用戶並發操作了。在腳本編輯器的菜單「Tools」中打開「Create Controller Scenario」,並設置並發用戶數即可打開Controller。
(2)在場景設計器中,設置Ramp-Up為每20秒鐘增加5個用戶,Ramp-Down作對應的設置即可完成一個常見的拱型場景的設計,如圖所示:
(3)為本次運行添加Windows性能計數器。切換到「Run」頁面中,在「Windows Resources」中添加我們需要監控的關鍵性能計數器,其過程與我們在Windows自帶的性能監視器中的操作一致。
(4)點擊「Start Scenaio」按鈕開始運行測試腳本。運行過程中我們還可以實時監控到一些基本的性能指標,如下圖所示:
9. 分析性能測試結果
當性能測試場景運行結束後,我們可以在Controller的Tools菜單中打開Analysis組件,對相應的性能指標進行分析。LoadRunner的Analysis組件提供了「合併圖關聯分析」,「自動關聯分析」,「多結果對比分析」三個重要功能。此處我們僅就最常用的「合併圖關聯分析」為大家簡單講解。
合併圖的作用是將兩種指標合併在一張圖上進行分析,可以更加直觀地對比指標A對指標B的影響程度。比如我們可以在Running Vusers圖表中右鍵「Merge Graphs」,並選擇與「Windows Resources」圖進行「Correlate」類型的合併,這樣就可以分析「Windows資源利用率情況」中哪些指標受「並發用戶數」影響更大。
比如通過對下圖的分析(X軸代表並發用戶數,Y軸代碼資源利用率情況),我們可以很清楚地看出,受並發用戶數影響最大的指標是「CPU使用率」,其次是「CPU隊列長度」和「頁交換頻率」。當然,受影響越大說明越容易成為瓶頸。比如該圖中還有很多指標對並發用戶數的增加而幾乎是一條直線,無動於衷,則這類指標幾乎不可能成為瓶頸。
10. 使用負載生成器
在場景設計中,我們還需要考慮一個比較現實的問題,如果我們要模擬10000個虛擬用戶怎麼辦?我們知道,虛擬用戶數默認是使用一個線程來模擬一個虛擬用戶的,因為線程數只會消耗CPU而不會過多地消耗內存。但是畢竟還是要消耗系統資源,所以一台電腦能夠同時並發的線程數量仍然是有限的。經驗表明,一台標準的PC機,雙核CPU,最多也就能模擬500~1000個線程,CPU使用率就快到達極限了。在這種情況下,我們如果要模擬10000個虛擬用戶,意味著需要10~20台電腦才能夠完成向伺服器發送請求。
最簡單的解決方案就是找20台電腦,各自安裝LR並運行相同性能測試腳本。但是這樣我們面對20台可能沒有問題,如果200台電腦,又該怎麼辦?所以這時候我們需要一套分散式運行系統,LR在這方面為我們考慮得非常周到,提供了「負載生成器」Load Generator這樣一種機制,可以通過Controller統一控制負載生成器。那麼Controller如何與Load Generator協同工作呢?
打開Controller中的Scenario菜單下的Load Generator,進入負載生成器管理對話框,我們可以將其它需要用於生成負載的電腦一台一台添加進來進行統一管理:
要讓其它電腦能夠提供負載生成服務,那麼必須保證這些電腦上安裝了LR或者至少安裝了Load Generator(在安裝LR過程可選擇單獨安裝此組件即可),並且需要啟動LoadRunner Agent Service服務(啟動後在系統托盤下面顯示一個衛星天線的小圖標,即表明可以為Controller提供負載生成服務)。
每添加一台負載生成器後點擊「Connect」按鈕,確保狀態從「Down」變為「Ready」表明連接成功,這個時候Controller就可以與負載生成器直接進行通信,將性能測試腳本發送給負載生成器,並由負載生成器向伺服器發送請求。當運行結束後,負載生成器再向Controller返回監控到的性能數據,由Controller進行統一管理。
那麼是不是添加負載生成器後就可以了呢?當然不是,我們還需要為每一個腳本再額外指定由哪些負載生成器來完成。選擇菜單「Scenario -> Convert Scenario to the Percentage Mode」,點擊確認對話框,而後我們可以看到如下界面,在Load Generators欄下拉,按住Ctrl或Shift鍵選擇需要用到的負載生成器,或者直接選擇All Generators,如下圖所示:
思考練習
(1)利用LoadRunner完成對Phpwind的隨機回帖的腳本開發
(2)利用LoadRunner完成文件的上傳下載測試。
(3)利用LoadRunner對當前系統進行性能測試開發與執行,並監控和分析相應數據。
注:希望學習更多技術,繼續在IT行業突破提升自己的各位朋友,歡迎加群594154674,不管你自我感覺牛不牛B。
推薦閱讀:
※web自動化測試從入門到持續集成
※Web功能測試之表單、搜索測試
※JIRA中的史詩、故事、版本與衝刺
※慶祝豪之諾二十八所測試項目組成立
TAG:性能測試 | 軟體測試 | LoadRunner |