1. 程式人生 > 其它 >如何使用 jMeter Parallel Controller - 並行控制器以及一些常犯的錯誤

如何使用 jMeter Parallel Controller - 並行控制器以及一些常犯的錯誤

How to Use the Parallel Controller in JMeter

本文我們將分析 Apache JMeter™ 的擴充套件之一 - 並行控制器(Parallel Controller)。 該控制器由 BlazeMeter 開發,作為對開源社群的貢獻,由 Andrey Pokhilko 和 Artem Fedorov 開發。

並行控制器可用於建立並行請求。 並行請求是指不是一個接一個執行而是同時執行的請求。 例如,在載入指令碼中處理 AJAX 請求或執行其他同步操作。

您可以使用 JMeter 外掛管理器安裝並行控制器。 它被稱為並行控制器和取樣器。 我們還需要一個 Dummy Sampler 和一個 WebSocket 外掛來進行此演示,您也可以在 JMeter 外掛管理器中找到它們。 我們將使用 Peter Doornbosch 的 Websocket Samplers。

現在我們將通過幾個例子來看看並行控制器的特性。 讓我們從一個簡單的例子開始。

Using the Parallel Controller - A Simple Example

  1. 首先,讓我們將控制器新增到測試計劃中。 新增執行緒組後:

右鍵執行緒組->新增->邏輯控制器->bzm-並行控制器

  1. 還要在控制器內新增兩個 Dummy Sampler 並將相同的特性應用到它們。

右鍵單擊 Parallel Controller -> Add -> Samplers -> jp@gc Dummy Sampler

需要取樣器來模擬傳送 HTTP 請求。 您可以根據需要新增任何取樣器。 現在指令碼如下所示:

執行這個測試。

從上面的螢幕截圖中可以看出,兩個請求的開始時間是相同的。 這意味著請求是同時傳送的。

第一個重要注意事項:如果您開啟控制檯,您將看到正在執行的執行緒數已變為 2。 也就是說,這個控制器建立了兩個執行緒並同時執行它們。

Using the Parallel Controller - with Multiple Elements

如果您有多個取樣器需要在一個執行緒中工作,則需要在邏輯上組合它們。 否則,並行控制器為其每個子元素建立新執行緒。

例如,您可以使用 Simple 控制器。 新增它:

右鍵單擊執行緒組 -> 新增 -> 邏輯控制器 -> 簡單控制器

現在,將應該組合的元素放在這個控制器下。

現在並行控制器將建立 2 個執行緒:第一個用於 Dummy 1 和 Dummy 2(在第一個簡單控制器下),第二個用於 Dummy 3 和 Dummy 4(在第二個簡單控制器下)。 另外,我們在Parallel Controller後面加了Dummy 5,在這兩組執行完後才會執行。

Dummy 1 和2 的啟動時間不同,Dummy 5 僅在Dummy 4 執行後才執行。

第二個重要注意事項:直到所有並行執行緒完成其工作後,測試的下一部分才會開始。

Running Threads Simultaneously - The Problem

第一個注意事項是控制器建立單獨的執行緒並並行執行它們。 因此,線上程內部相互互動的取樣器可能會出現問題。

為了演示,我們將使用 WebSocket 外掛。 這個外掛有一組取樣器,可以通過執行緒內部的 WebSocket 會話連線。

如果 session 是在 Parallel 控制器之前建立的,並且取樣器組的工作是在控制器內部執行的,我們會得到一個錯誤。 該錯誤表明 WS Sampler(位於控制器內部)的連線不存在。 您可以在下面的螢幕截圖中看到這一點。

Running Threads Simultaneously - The Solution

如果測試計劃中有相關元素,它們應該都放在並行控制器中。

Running All Parallel Controller Elements Before Moving On in the Test - The Problem

第二個注意事項是,直到所有並行執行緒完成其工作後,測試的下一部分才會開始。

我曾經有過這樣的場景:使用者通過 HTTP 請求獲取大量資料,並通過 Web 套接字接收一段時間的資訊。 當時間用完時,劇本說他應該去下一頁。

這部分的測試如下。 在測試中,時間用完後要轉到的頁面稱為“上次請求”。

問題是當時間用完時,接收訊息的執行緒確實退出了,但是接收資料的執行緒直到接收到所有資料才完成執行。

因此,在資料載入完成之前,執行緒不會繼續下一步。 但這種行為是錯誤的。 也就是說,需要在並行執行緒完成後以某種方式中斷第二個執行緒的執行。

Running All Parallel Controller Elements Before Moving On in the Test - The Solution

一些取樣器有一個超時欄位。 就我而言,我使用了 HTTP 請求取樣器,它有一個連線超時欄位。 這意味著在指定的時間之後,取樣器將完成其工作。 但是這個解決方案太狹隘了。

另一種解決方案如下。 假設您有一個不同的情況,並且在兩個執行緒中,您都有一組在迴圈中執行的請求。 一個執行緒在接收到某個訊息後結束,而第二個執行緒不知道該訊息。 第二個應該在最後一次迭代後完成,您可以使用 Groovy 或 BeanShell 取樣器通過設定變數的必要值來完成此操作。 例如,使用 vars.put("isEnd","true") 命令變數和‘isEnd’得到一個‘true’值。

這種情況將如下所示:

這裡我們有兩個並行執行緒:第一個執行緒帶有 While 控制器,第二個執行緒帶有 Loop 控制器(這個控制器代替了訊息接收)。 在第二個執行緒中,在 Loop 控制器之後,您使用 Groovy 或 BeanShell 取樣器設定值。 在第一個執行緒中,您在 While 控制器的條件中檢查此變數的值,例如,使用以下條件:${__jexl3("${isEnd}"=="true")}。

Don’t Run a Parallel Controller in a Parallel Controller

還有一個無法解決的問題:不能在並聯控制器內部新增並聯控制器。 執行時會收到錯誤。 不要那樣做。

The Parallel Sampler

Parallel Sampler 是控制器的輕量級版本,用於建立 Ajax 請求或其他並行 HTTP 請求。 取樣器有一個簡單的介面,如下面的螢幕截圖所示。 您只需要輸入所有並行 URL。

在處理完所有引用之前,取樣器不會完成執行。 但是如果您想將它用於並行站點頁面,請記住取樣器也會執行網站頁面上的所有連結。

總結

綜上所述,Parallel Controller 是一個很好的請求並行控制器,對於測試具有並行動作的站點非常有用。 例如,在處理 WebSocket 請求或測試移動應用程式時,可能會有大量並行請求(如心跳請求)。 除了控制器,我們還有Parallel Sampler,可以用來建立並行的HTTP請求,極大地方便了指令碼的結構,非常適合並行Ajax請求。

更多Jerry的原創文章,盡在:"汪子熙":