在構建Web應用程序負載壓力測試時,您可能需要模擬一組用戶“抓取”網站并隨機單擊鏈接。 特別是對于動態(tài)網站,如博客,新聞門戶,社交網絡等,新內容被頻繁添加或甚至實時添加。 這種形式的測試能確保用戶將獲得流暢的瀏覽體驗,并檢查斷開的鏈接或任何意外錯誤。
本文介紹了模擬網站“爬網”的3種常用的方法:點擊網頁中找到的所有鏈接、使用HTML鏈接解析器和高級spidering測試計劃。
1.單擊網頁中找到的所有鏈接
使用正則表達式提取得到的鏈接的過程在 JMeter的使用正則表達式 一文被描述。算法如下:
1a。 從響應中提取的所有鏈接 正則表達式提取 并將它們存儲到JMeter的變量。 相關的正則表達式將是:
<a [^>] * href =“([^”] *)“
不要忘記設置 匹配編號No. 為 -1 提取所有的鏈接。 如果將其留空,則只返回第一個匹配項。
1b。 使用 的ForEach控制器 迭代提取的鏈接。
1c。 使用HTTP請求取樣器點擊選擇URL,在 Output Variable 輸出變量名中 。
演示
優(yōu)點
配置簡單。
穩(wěn)定性。
故障轉移和恢復能力。
缺點
正則表達式很難開發(fā),對標記變化敏感,因此很脆弱。
實際上不是“爬蟲”或“蜘蛛”,只是對鏈接進行請求。
2.使用HTML鏈接解析器
JMeter的提供了一個特殊的測試元件, HTML解析器的鏈接 。 此元素設計用于提取HTML鏈接和表單,并使用提取的值替換匹配的HTTP請求采樣器相關字段。 因此,HTML鏈接解析器可用于模擬使用少配置抓取網站。 方法如下:
2a。 把HTML解析器鏈接放入 Logic Controller 邏輯控制器 下
2b。 把HTTP請求取樣器放入邏輯控制器下,配置 服務器名稱或IP地址 和 路徑 字段提取值限制在一個“有趣”的范圍。 您可能希望專注于屬于被測試應用程序的域,并且不希望它在Internet上爬網,因為如果您的應用程序有任何鏈接到外部資源; JMeter會去外面抓爬。 Perl5風格的正則表達式可以用來設置提取的鏈接范圍。
演示
優(yōu)點
易于配置和使用。
行為像一個“蜘蛛”。
缺點
零誤差公差; 任何從響應中提取鏈接的失敗將導致后續(xù)請求的級聯(lián)失敗。
3.高級“Spidering”測試計劃
假設上述方法的局限性,您可能想要一個解決方案,它不會因為錯誤而崩潰,并且將爬行整個被測試的應用程序。 下面你可以找到一個參考測試計劃大綱,可以用作你的“蜘蛛”的骨架:
3a。 打開主頁面。
從中提取所有鏈接。
點擊隨機鏈接。
如果返回值有“good”的 MIME類型 (如果圖片或PDF文件或任何鏈接提取鏈路結果將被跳過); 從響應中提取所有鏈接
所用元素的說明:
While Controller 是用來設置請求的大額,所以測試不會永遠持續(xù)下去。 如果您透過排程scheduling限制,可以略過。
Once Only Controller 用于執(zhí)行調用的主網頁只有一次。
XPath Extractor 用于過濾掉不屬于該應用程序下測試不感興趣例如 mailto, callto ,等等。一個示例XPath查詢將看起來像網址等各個環(huán)節(jié):
//a[starts-with(@href,'/') or starts-with(@href,'.') or contains(@href,'${SITE}') and not(contains(@href,'mailto'))]/@href
使用XPath不是必須的,在某些情況下,它可能是非常內存密集型。 您可能需要考慮從響應中提取鏈接的其他方法。 它用于演示目的,因為通常XPath查詢比CSS / JQuery,特別是正則表達式更加人性化。
__javaScript() function 實際上做了三件事:
從XPath提取器提取的選擇一個隨機鏈接。
從URL的開始刪除 ../。
將HTTP請求標題設置為當前隨機URL。
Regular Expression Extractor 用于從響應中提取Content-Type頭
If Controller 使得它使下一輪從響應中提取鏈接,如果響應已匹配的內容類型才啟動。