工具應用:使用LoadRunner實現Agileone的介面測試
來自專欄 強哥學堂
實驗簡介
LoadRunner作為一個企業級標準性能測試工具,在軟體測試的發展過程中扮演著重要的地位,幾乎已經成為性能測試領域的行業標準,影響了很多人。筆者在剛入行時,也經常使用LoadRunner,很多性能測試方面的思路,也受到了LoadRunner這款工具的影響,雖然目前看起來LoadRunner依然有很多不盡人意的地方,但是從一款工具的角度來看,LoadRunner的強悍之處目前JMeter仍然無法超越。任何一個性能測試工具,必然可以用於完成介面測試,這幾乎已經成為行業共識。無論是SoapUI,還是JMeter,或者是本章實驗將要為大家介紹的LoadRunner。
實驗目的
(1)掌握LoadRunner處理GET和POST請求的用法。
(2)熟練運用LoadRunner完成針對HTTP協議的介面測試。
(3)掌握LoadRunner中的參數化,檢查點,關聯的用法。
實驗流程
- LoadRunner功能介紹
目前LoadRunner的最新版本是12.5,並且提供了50個並發用戶的社區版免費授權,為企業和個人使用LoadRunner降低了門檻。LoadRunner的功能非常多,非常全,在此無法一一列出,筆者就常用的一些功能作簡單介紹:
(1)提供了對最新版Windows操作系統及64位操作系統的支持。
(2)提供了對最新版IE瀏覽器的腳本錄製支持。
(3)提供了對移動APP端進行協議監控分析和腳本錄製的支持。
(4)在各種Java協議和C Vuser協議中支持64位回放。
(5)HTTP流媒體視頻(HLS,HTML5)支持。
(6)支持目前主流的各種網路協議。
(7)支持C,Java,.NET,JavaScript等編程語言。
(8)可視化的場景設計和指標監控。
(9)可視化的性能指標分析器,在分析性能指標時非常有用。
2. LoadRunner的四大核心組件
(1)虛擬用戶腳本生成器(Virtual User Generator):主要用於開發和調試性能測試腳本。可支持主流的編程語言。
(2)測試控制器(Controller):執行性能測試管理和監控的中央控制器,負責場景的設計,性能測試執行,指標的監控,並且也用於管理負載生成器。
(3)結果分析器(Analysis):在測試完成後,對測試過程中收集到的各種性能數據進行計算、匯總和處理,生成各種圖表和報告,為系統性能測試結果分析提供支持。
(4)負載生成器(Load Generator):接受Controller組件的控制,可以多台電腦同時生成負載,用於模擬大量並發用戶。
3. 發送GET請求
(1)打開Virtual User Generator,並新建一個「Web - HTTP/HTML協議」的測試項目。
(2)點擊菜單「Design」下的「Insert in Script」下的「New Step」,在右側的步驟生成器中,輸入「web_url」並進行搜索,為當前腳本插入一個GET請求。並輸入URL地址即可。
此時,會在當前腳本中生成一個GET請求。代碼如下:
Action(){ web_url("web_url", "URL=http://localhost/agileone/", "TargetFrame=", "Resource=0", "Referer=", LAST); return 0;}
我們可以直接點擊工具欄上的「Replay」按鈕運行當前腳本,一個GET請求便發送成功。
4. 為響應添加檢查點
上述腳本可以向Agileone的首頁發送一個GET請求,那麼如何來創建一個檢查點來確認響應的正確性呢?在LoadRunner中我們主要使用函數「web_reg_find」來創建響應,步驟如下:
(1)將游標定位到web_url這個請求的前面。
(2)插入一個新的步驟,並選擇「web_reg_find」,生成一段檢查點的腳本。
(3)最關鍵的兩步設置:在「Search for specific Text」中輸入我們要檢查的內容,支持中英文。在「Save count」中輸入一個參數名,用於後續的檢查點判斷。在LoadRunner中,檢查點的使用是根據搜索指定文本在響應中出現的次數來進行的。比如上述的設置中,如果「保存登錄信息」這段文本在響應的Body中只要出現一次,那麼我們就可以斷定,該GET請求是正常的。
(4)我們還需要使用LoadRunner的函數「lr_eval_string」來讀取剛才在「Save count」中保存的參數「checkHome」的值,並將其轉換為整數,進而判斷是否是大於或等於1次。最終的檢查點的代碼如下:
Action(){ // 該代碼必須放在GET請求的前面,這是LR的規則 web_reg_find("Search=Body", "SaveCount=checkHome", "Text=保存登錄信息", LAST); web_url("web_url", "URL=http://localhost/agileone/", "TargetFrame=", "Resource=0", "Referer=", LAST); // atoi 是C語言中用來將一個字元串轉換為一個數字的函數 // lr_eval_string 讀取一個參數的值,參數名稱需加{}包含 if (atoi(lr_eval_string("{checkHome}")) >= 1) { lr_output_message("打開首頁成功"); } else { lr_output_message("打開首頁失敗"); } return 0;}
回放上述代碼,結果輸出為「打開首頁失敗」,原因是因為我們並沒有針對響應的編碼格式做轉碼處理。由於Agileone使用的是UTF-8編碼,所以我們需要設置LoadRunner支持UTF-8編碼。在菜單「Replay」中的「Runtime Settings」中,選擇「Preference」標籤頁,定位到「General」選項卡下面,勾選「Covert to/from UTF-8」,並保存即可。如下圖所示:
這樣就可以正常處理UTF-8編碼格式的文本內容了。在我們首次執行腳本的時候,還有一個問題比較煩人,就是每一次運行後,都會彈出一個「Reply Summary」的測試報告窗口,比較耽誤時間,我們可以直接將其去掉。打開菜單「Tools」下的「Options」選項設置窗口,在「Scripting」標籤頁中的「Replay」選項卡下面,設置「After Replay Show」為「Script」而不是「Replay Summary」即可。
5. 實現登錄的介面測試
插入一個新的步驟,並選擇「web_submit_data」,打開POST請求生成器,並輸入登錄Agileone所需要的關鍵信息。
(1)輸入POST請求對應的URL地址。
(2)輸入POST請求的正文內容:
並為登錄設置檢查點,最終生成的代碼如下:
Action(){ web_reg_find("Search=Body", "SaveCount=checkLogin", "Text=successful", LAST); web_submit_data("web_submit_data", "Action=http://localhost/agileone/index.php/common/login", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=username", "Value=admin", ENDITEM, "Name=password", "Value=admin", ENDITEM, "Name=savelogin", "Value=true", ENDITEM, LAST); if (atoi(lr_eval_string("{checkLogin}")) >= 1) { lr_output_message("登錄成功"); } else { lr_output_message("登錄失敗"); } return 0;}
6. 新增需求提案
按照登錄相同的操作步驟,生成的腳本如下:
web_reg_find("Search=Body", "SaveCount=checkProposal", "Text/DIG=#", LAST);web_submit_data("web_submit_data", "Action=http://localhost/agileone/index.php/proposal/add", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=type", "Value=Requirement", ENDITEM, "Name=importance", "Value=Medium", ENDITEM, "Name=headline", "Value=需求提案的標題-1022", ENDITEM, "Name=content", "Value=需求提案的內容-1022", ENDITEM, "Name=processresult", "Value=", ENDITEM, LAST);if (atoi(lr_eval_string("{checkProposal}")) >= 1) { lr_output_message("新增需求提案成功");}else { lr_output_message("新增需求提案失敗");}
此處需要注意的是,我們在檢查點函數中使用了「Text/DIG=#」這樣的匹配模式,因為新增需求提案的響應就是一個新增成功後的ID號,所以我們利用「#」來匹配任意一個數字。這叫通配符,與正則表達式有類似之處,但是沒有正則表達式那麼強大的功能而已。
7. 實現登錄用戶名的參數化
用戶名的參數化,除了使用隨機數以外,我們也可以使用外部數據源來作為參數化的依據。在LoadRunner中,很好地提供了這種功能。比如用戶名和密碼,在Agileone中存在多個,我們可以分別將這些不同的用戶名和密碼輸入到參數文件(其實質就是一個CSV文件)中,再讀取出來即可。操作步驟如下:
(1)打開「Design」菜單下的「Parameters」下的「Parameters List」子菜單。
(2)在「Parameters List」窗口的左下角點擊「New」按鈕新建一個參數,並輸入參數名為「username」。
(3)在右側點擊「Create Table」,輸入四行用戶名。並點擊「Add Column」增加一列,設置列名為「password」,用於輸入與這四個用戶對應的密碼。
(4)設置該參數指向「username」這一列,並且取值方式為「Random」。最終輸入後如下圖所示:
簡單說明一下「Update value on」中的 「Each iteration」是指每一次運行更新一次參數值,即使在腳本中多次使用,值也不會更新,只有運行下一輪時才會更新。「Each occurrence」是指在腳本中的每一次調用該參數,都會更新參數的值。
(5)新建第二個參數,命名為「password」,並設置其參數文件指向「username.dat」文件,設定為「password」那一列,在下面的參數取值方式中設置為「Same line as username」。
在腳本中使用{username}和{password}引用參數值即可:
web_submit_data("web_submit_data", "Action=http://localhost/agileone/index.php/common/login", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=username", "Value={username}", ENDITEM, "Name=password", "Value={password}", ENDITEM, "Name=savelogin", "Value=true", ENDITEM, LAST);
8.生成標題和內容的隨機參數
在LoadRunner中,參數類型有很多種,除了文件型參數外,我們也可以使用其自帶的隨機數生成器。打開「Parameters List」參數列表窗口,新建一個參數並命名為「sequence」,選項「Parameter Type」為「Random Number」,並輸入隨機數的範圍和位數(位數的意思是如果數據位數不夠,則前面補0)。最終的效果如下圖所示:
最終將新增需求提案的代碼修改為:
web_submit_data("web_submit_data", "Action=http://localhost/agileone/index.php/proposal/add", "Method=POST", "TargetFrame=", "Referer=", ITEMDATA, "Name=type", "Value=Requirement", ENDITEM, "Name=importance", "Value=Medium", ENDITEM, "Name=headline", "Value=需求提案的標題-{sequence}", ENDITEM, "Name=content", "Value=需求提案的內容-{sequence}", ENDITEM, "Name=processresult", "Value=", ENDITEM, LAST);
思考練習
(1)請自學使用LoadRunner的腳本錄製功能。
(2)請利用LoadRunner完成需求提案模塊的其它功能測試。
(3)利用LoadRunner測試一個WebService協議介面。
(4)利用LoadRunner調用Java代碼測試JDBC資料庫介面。
推薦閱讀:
※軟體測試定義還可以這樣理解
※性能測試新手常犯錯誤總結(二):為什麼我模擬的百萬測試數據是無效的?
※軟體測試題目收集
※HTTP協議中的COOKIE機制簡單理解
※我是如何使用python來確定理財策略的
TAG:LoadRunner | 軟體測試 | 自動化測試 |