[英]How do I pass a variable from one Thread Group to another in JMeter
我有一個帶有 2 個線程組的 JMeter 測試 - 第一個是單個線程(創建一些庫存),第二個有多個線程(購買所有庫存)。 我使用 BeanShell Assertions 和 XPath Extractors 來解析返回的值(即 XML)並存儲變量(例如要購買的物品的 id)。
但是,在第一個線程組中創建的值,無論是提取到標准${jmeter}
類型變量還是${__BeanShell(vars.get("jmeter"))}
類型變量中,在第二個線程組中都不可用。 無論如何要在第一個線程組中創建一個變量並使其對第二個線程組可見?
我無法用變量來做到這一點(因為這些變量是單個線程的本地變量)。 但是,我能夠用屬性解決這個問題!
同樣,我的第一個 ThreadGroup 完成了所有設置,我需要從該工作中獲取一些信息,以便第二個 ThreadGroup 中的每個線程都可以使用。 我在第一個 ThreadGroup 中有一個 BeanShell 斷言,其中包含以下內容:
${__setProperty(storeid, ${storeid})};
${storeid} 是使用 XPath 提取器提取的。 BeanShell 斷言執行其他操作,例如檢查 storeid 是否從上一次調用中返回,等等。
無論如何,在第二個 ThreadGroup 中,我可以使用 Samplers 中“storeid”屬性的值,如下所示:
${__property(storeid)}
奇跡般有效!
根據 JMeter 文檔:
16.12 在線程和線程組之間共享變量
變量是線程的局部變量,一個線程中設置的變量不能在另一個線程中讀取。 這是設計使然。 對於可以在測試開始之前確定的變量,請參閱參數化測試(上文)。 如果在測試開始之前該值未知,則有多種選擇:
- 將變量存儲為屬性 - 屬性對於 JMeter 實例是全局的
- 將變量寫入文件並重新讀取它們。
- 使用 bsh.shared 命名空間 - 請參閱16.8.2 共享變量
- 編寫自己的 Java 類
在線程之間傳遞變量的另一種方法是使用下面 Andrey Botalov 提到的jmeter-plugins。
但是我發現第一次使用它有點令人困惑,但它可以在從線程傳遞到線程期間完全控制變量。 按照我的 BeanShell 使用示例,您會發現它是多么容易:
接下來參考下圖中的部分:
(1.1) 在這里,我在用戶定義的變量中創建了自定義變量(或者您可以使用 BSF 處理器來實現 - 在本例 (1.2) 中禁用)
(2.1)(2.4)我在第一個線程中成功使用了變量-沒什么特別的:)
(2.2)添加了BeanShell PostProcessor並自定義了我的變量
(2.3)加入隊列
(3.1) 在第二個線程中 - 變量取自隊列 - 使用您想要的任何名稱。 但要小心,明智地使用超時,因為這個線程將等待直到前一次完成,所以它可以得到修改變量(實驗一些長響應)
(3.2)(3.3)(3,4)重復使用和修改變量的步驟
(3.5) 變量在新隊列中再次發送 - 所以為其提供新名稱
(4.1)(4.2)(4.3) 從新隊列中抓取修改后的變量就像魅力一樣
警告
如果您添加更多線程,則使用變量向線程組添加一些計數器並將此變量名稱添加到隊列名稱中 - 在嘗試捕獲隊列的線程組中執行相同操作,以便隊列將為每個線程具有唯一名稱(如果您需要一些更清晰的解釋)
如果您在一個線程組中有多個 http 請求,則添加線程通信預處理器作為最后一個子級(或者如果您想實現一些自定義的東西)http 請求
播放、修改、自定義以獲得最佳結果:) 添加更多線程可能會導致不需要的行為,因此您需要保持警惕。
我發現我認為這是完成這項工作的最簡單方法。
利用
Bean Shell PostProcessor
設置在一個線程組中
設置變量( http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables )
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");
或者,如果您想將其設置為另一個變量中包含的值
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));
進入另一個線程組
然后從另一個線程組,通過( http://jmeter.apache.org/usermanual/functions.html#__property )讀取它
${__property(PC_CREATED_PROMO_CODE)}
JMeter 插件為此目的具有線程間通信。
有兩種使用方法:
__fifoPut
和__fifoPop
在我看來 PostProcessor/PreProcessor 更容易使用。
好吧,這是一種方法; 遵循這些步驟,它將起作用,稍后您可以根據需要對其進行調整:變量在線程之間不共享(JMeter 可能將此稱為功能。):但是屬性是! 因此,將您的變量設置為如下屬性:
1)單擊您的測試計划並啟用“連續運行線程組”->這使線程組按順序運行,而不是隨機運行。 (你可以稍后調整它,但現在讓它工作..)
2)例如創建一個名為“setup”的線程組; 在該線程組中添加一個 BeanShell 采樣器,代碼如下:
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
所以現在屬性已經設置:如果您要存儲為屬性的值是一個變量(例如用戶定義的變量或 reqex 變量),您可以執行以下操作:
JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));
3) 添加一個測試組“實際測試”,例如線程數大於 1; 添加一個測試,然后在該測試中添加一個 BeanShell 預處理器,代碼如下:
import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));
因此,現在您已經在該線程中創建了一個名為 theNameOfYourNewProperty 的變量,該變量具有您的系統屬性 theNameOfYourNewProperty 的值。 在您的測試中,您現在可以像這樣訪問它:
${theNameOfYourNewProperty}
它適用於每個線程,而不僅僅是第一個線程..
這在 JMeter 中是不可能的,因為這不是正常的客戶端行為(線程之間共享參數)。 取而代之的是使用一個帶有控制器的線程組:
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
只需添加一個 bean shell 斷言,使用屬性 function 將值分配給變量(如全局變量),該變量即使在進入其他線程后也將保持該值。
線程組 >> 添加 >> 斷言 >> Bean Shell 斷言
${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}
然后在另一個線程中你可以調用這個全局變量並可以使用它
下面是調用存儲值時需要使用的 function:
${__property(global_variable_name)}
https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59
讓主題重獲新生:) 在線程之間傳輸變量的另一種方法是寫入/讀取文件。 在線程之間傳遞變量
另一種解決方案是使用簡單表服務器來管理數據集。 此功能是添加 1.2 JMeter 插件。
“主要思想是在 JMeter 插件中使用微型 http 服務器來管理數據集文件,使用簡單的命令來獲取/添加文件中的數據行”
查看文檔: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
問候。
我使用設置屬性 function 和拆卸 teardowngroup 從 setupthreadgroup 獲取值,但拆卸 threadgroup 得到 401 錯誤。
我檢查了所有標題,一切看起來都很好。不確定你的拆卸失敗。 有什么想法請給我建議
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.