開源負載測試工具k6比JMeter更容易的5件事
k6是GitHub上提供的開源負載測試工具。它是用Go編寫的,並執行用JavaScript編寫的測試指令碼。它受到了開發人員,測試人員和DevOps團隊的強烈興趣,並擁有超過4400名GitHub明星。k6是命令列驅動的,測試結果輸出到stdout或結果分析工具,如Load Impact Insights。
JMeter也是一個開源負載測試工具,已存在多年。它非常受歡迎,擁有數千名使用者。它是一個Java應用程式,JMeter GUI用於建立測試指令碼。此外,一些指令碼語言可用於編寫JMeter函式,包括Java,Groovy和JavaScript。Groovy已成為推薦的預設選項。但是,只能從命令列執行負載測試執行。
在“大衛與歌利亞”的方式中,讓我們看一下在k6中比在JMeter中更容易做的事情的幾個例子。
1.在變數中儲存HTTP響應
在JMeter中:
-
新增Beanshell Postprocessor作為請求的子項,返回您要查詢的響應。
-
將程式碼
vars.put(“response”, new String(data));
放入PostProcessor的“指令碼”區域。 -
請根據
${response}
需要參考提取的值 。
在k6中,使用以下測試指令碼程式碼:
let response = http.get(“http://javame.cnblogs.com/”);
在這兩種情況下,資料最終都在響應變數中。主要區別在於您必須在JMeter中向請求新增Beanshell PostProcessor,然後才能新增程式碼段。
2.測試預期的404響應
在JMeter中:
在測試下建立一個新的Response Assertion。在斷言的“要測試的響應欄位”部分中,確保選中“忽略狀態”框。
然後,您可以新增其他斷言,例如將“要測試的響應欄位”中的無線電設定為“響應程式碼”,並將“要測試的模式”設定為404。
圖1:顯示如何設定響應斷言的JMeter GUI。
在k6中,使用以下測試指令碼程式碼:
let response = http.get(“http://some.url/”); check(res, { "Status is 404": (r) => r.status === 404 });
這裡的主要區別在於,在JMeter中執行此操作需要您單擊GUI並在輸入欄位中填入值,而使用k6則需要編寫幾行程式碼。您可以在版本控制系統(VCS)中輕鬆跟蹤和管理k6 JavaScript載入測試程式碼,就像您的應用程式程式碼一樣。
3.在不同的測試中重用自定義測試程式碼
例如,假設您要呼叫logTransaction()
150個不同測試配置中的一個檔案中定義的 函式。
在JMeter中:
-
將該行新增
beanshell.sampler.init=BeanShellSampler.bshrc
到user.properties檔案(位於JMeter安裝的“bin”資料夾中)。 -
將logTransaction函式放在BeanShellSampler.bshrc檔案中(相同位置,JMeter的“bin”資料夾)。
-
下次啟動JMeter時,您可以在任何指令碼中從任何Beanshell Sampler呼叫該函式。
在k6:
-
將logTransaction()函式放在JavaScript檔案中,例如“logTransaction.js”
-
使用以下語句在任何指令碼中匯入該函式:從“/path/to/logTransaction.js”匯入{logTransaction};
在k6中,任何Javascript檔案都可以直接用作可匯入模組,它允許您以任何方式組織檔案。您還可以直接通過網路匯入模組:
import { logTransaction } from "s3.amazonaws.com/path/to/logTransaction.js";
除了標準的ES6 JavaScript API之外,k6還捆綁了API來處理Cookie,加密,編碼,環境變數,HTML表單,HTML解析,多部分請求,TLS客戶端證書,TLS密碼和版本等等。
4.實現巢狀迴圈
例如,您可能希望使用兩個引數測試servlet:X和Y,其中X和Y是0到100之間的隨機數。您需要一個巢狀迴圈,如下所示:
for(int x = 0 ; x <= 100 ; x ++) for(int y = 0 ; y <= 100 ; y ++) servlet ?param1 = x &param2 = y
在JMeter中:
您的架構可能如下所示:
Thread Group User Defined Variables maxX = 100 maxY = 100 Loop Controller X Loop Count: ${__BeanShell(Integer.parseInt(vars.get("maxX"))+1)} Counter X Start: 0 Increment: 1 Maximum: ${maxX} Reference Name: loopX Loop Controller Y Loop Count: ${__BeanShell(Integer.parseInt(vars.get("maxY"))+1)} Counter Y Start: 0 Increment: 1 Maximum: ${maxY} Reference Name: loopY YOUR HTTP Request servlet?param1=${loopX}¶m2=${loopY} . . .
在k6:
使用以下指令碼程式碼:
for(var x = 0 ; x <= 100 ; x ++) for(var y = 0 ; y <= 100 ; y ++) http.get(“http://some.domain/servlet?param1 =”+ x +“¶m2=”+ y);
當然,執行更復雜的邏輯分支是基於GUI的方法與直接在程式碼中編寫邏輯相比經常變得非常笨重的地方。k6解決方案與用於描述問題的虛擬碼非常相似。
5.進行並行請求
我們通常希望並行發出多個請求,就像瀏覽器在獲取網頁時所做的那樣。這使得伺服器上的壓力比每個虛擬使用者一次只發出一個請求要多得多。
在JMeter中:
JMeter提供同步計時器,允許對請求進行分組,以便它們可以在同一時刻執行。只需在測試計劃中新增同步計時器,並確保:
-
它在兩個請求中都處於同一級別
-
執行緒組中的虛擬使用者數> = =同步計時器中設定的數量
-
在k6:
使用此
http.batch()
功能可並行發出多個請求。例如:http.batch([ "http://test.loadimpact.com", "http://test.loadimpact.com/style.css", "http://test.loadimpact.com/images/logo.png" ]);
上述“解決方案”不具有100%的可比性。在JMeter情況下,我們仍然只允許每個虛擬使用者(VU)一次發出一個請求。這意味著JMeter VU不是“真實使用者”的完全準確模型。單個人類使用者將使用他們的Web瀏覽器同時發出多個請求,而JMeter VU一次只發出一個請求。
相反,JMeter所做的是同步VU,以便它們在同一時間發出請求。(對我來說似乎不太有用 - 總吞吐量可能會下降,因為某些VU必須等待其他VU完成請求)。
另一方面,在所示的示例中,k6將允許每個VU開啟三個併發TCP連線,因此能夠並行獲取這三個專案,就像Web瀏覽器一樣。這意味著在k6情況下,100個VU可以並行獲取300個專案。在Jmeter情況下,100 VU將並行獲取100個專案。(注意:還有一個名為Parallel Controller的 JMeter擴充套件可用於建立並行請求)。
推薦閱讀: