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
- 首先,讓我們將控制器添加到測試計划中。 添加線程組后:
右鍵線程組->添加->邏輯控制器->bzm-並行控制器
- 還要在控制器內添加兩個 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的原創文章,盡在:"汪子熙":