如何从不同线程中的jmeter全局属性中获取地图

时间:2019-03-04 09:34:03

标签: jmeter

我正在使用Jmeter 5.0,其中我在一个线程组的JSR223 PostProcessor中编写了一段Java代码。这些值已存储在地图中,我可以在Debug Sampler中查看它。代码如下-

import java.util.Map;
import java.util.HashMap;

Map gamePlayHistoryMap = new HashMap();
gamePlayHistoryMap.put(vars.get("playerId"), vars.get("GameplayHistoryId"));
props.put("GamePlayHistoryMap", gamePlayHistoryMap);

Map payLevelDetailsMap = new HashMap();
payLevelDetailsMap.put(vars.get("playerId"), vars.get("PayLevelDetails"));
props.put("PayLevelDetailsMap", payLevelDetailsMap);

现在,我想访问不同线程组中的这两个映射的值。怎么做 ?我尝试使用JSR223 PreProcessor编写如下代码-

import java.util.Map;
import java.util.HashMap;


Map gameTemplateIdMap = props.get("GamePlayHistoryMap");
Map payLevelDetailsMap = props.get("PayLevelDetailsMap");

我无法获取上一个线程中存储的值。有人可以帮助我指出我可能在哪里出错了吗?

第一个线程调试采样器-

  

GamePlayHistoryMap = {107 = 3387} HTTPResponse.parsers = htmlParser   wmlParser cssParser   PayLevelDetailsMap = {107 = {“ prizeQuantity”:0,“ prizeType”:{“ prizeTypeId”:2,“ prizeName”:“现金”,“描述”:“促销   Cash“,” listofErrors“:[],” isValid“:true},” isValid“:true,” description“:” $ 0.3“,” externalPrizeID“:null,” prizeTypeID“:2,” gameTemplateID“:0,” isNotifySocial“:false,” prizeValue“:0.3,” payMethodID“:1,” winProbability“:17.5,” celebrationLevel“:null,” payMethod“:{” payMethodID“:1,” name“:” CMS“,” description “:”帐户“,” listofErrors“:[],” isValid“:true},” listofErrors“:[],” payLevelTemplateID“:41170,” isNotifySignage“:true,”位置“:3,” celebrationLevelID“:1 }}

第二线程调试采样器-

  

GamePlayHistoryMap = {107 =} HTTPResponse.parsers = htmlParser wmlParser   cssParser PayLevelDetailsMap = {107 =}

2 个答案:

答案 0 :(得分:0)

您确定在第一个线程组之后执行您的第二个线程组吗?我能想到的唯一失败原因是,您试图在尚未定义时从map读取值。

检出jmeter.log file中是否有可疑条目。如果我是对的,那么您可以:

  1. Test Plan级上勾选Run Thread Groups consecutively

    enter image description here

  2. 或使用Inter-Thread Communication Plugin来阻塞第二个线程组,直到在第一个线程组中设置了map的值为止

答案 1 :(得分:0)

我使用BeanShell Sampler的 bsh.shared 属性进行了此操作。填充地图的第一个线程组代码如下-

import java.util.Map;
import java.util.HashMap;

Map gamePlayHistoryMap = new HashMap();
Map payLevelDetailsMap = new HashMap();

gamePlayHistoryMap.put(vars.get("playerId"), vars.get("GameplayHistoryId"));
bsh.shared.gphMap = gamePlayHistoryMap;

payLevelDetailsMap.put(vars.get("playerId"), vars.get("PayLevelDetails"));
bsh.shared.pldMap = payLevelDetailsMap;

获取地图的第二线程组代码如下-

import java.util.Map;
import java.util.HashMap;

Map myMap1 = bsh.shared.gphMap;
vars.put("GamePlayHistoryId", myMap1.get(vars.get("playerId")));
log.info(myMap1.get(vars.get("playerId")));

Map myMap2 = bsh.shared.pldMap;
vars.put("PayLevelDetails", myMap2.get(vars.get("playerId")));
log.info(myMap2.get(vars.get("playerId")));

当然我认为这也可以使用JSR223元素完成,只需要弄清楚如何做即可。我还需要弄清楚如何全局地在第一个线程组中声明该映射,以便每次线程运行该映射的值时都会被附加。到目前为止,每次线程多次运行时,都会重新初始化映射。任何实现此目标的指针将不胜感激。

谢谢

相关问题