JMeter虽然Controller命中HTTP POST请求5次,但每个POST需要5个不同的变量

时间:2019-09-11 17:22:27

标签: jmeter jsr223 jmeter-5.0

我有一个执行http POST的线程,每次返回一个具有唯一ID的响应。我有一阵子的控制器设置了一个计数器,一个json提取器看起来一切都很好,直到我的json提取器变量不断被上一个POST覆盖。

我直接从下面的网站上获取了while控制器设置代码 GitHub

我将其设置为可以运行5次,但是我的唯一ID被覆盖

-Thread
    - JSR223 Name: initCounter
        vars.put("counter","1");
 - While Controller counter less than or equal to 5
    - HTTP Request
      - JSON Extractor
         names of create variables: Id
         JSON Path Expressions: Id
         Match No. (0 for Random): -1
    - JSR223 Name: incrementCounter
           int counter = Integer.parseInt(vars.get("counter")) +1;
           vars.put("counter",Integer.toString(counter));

调试采样器:

accountId_matchNr=1
counter=2```

```accountId_1=b39c34cd-aa44-452f-8e2c-d123123123
accountId_matchNr=1
counter=3```

```accountId_1=b39c34cd-aa44-452f-8e2c-dsfssdfdfs
accountId_matchNr=1
counter=4```


```accountId_1=b39c34cd-aa44-452f-8e2c-235534
accountId_matchNr=1
counter=5```

```accountId_1=bfc0a3c3-5eab-443c-bd44-dfgdgdfg
accountId_matchNr=1
counter=6```

How I can get variables for each and every accountId_1 (Eg: accountId_1 accountId_2 accountId_3 etc etc)

So each time it hits the POST i store the Id in var1 var2 var3 etc etc

images of my IDE setup:
  [1]: https://i.stack.imgur.com/XGUgV.png
  [2]: https://i.stack.imgur.com/RWv64.png

2 个答案:

答案 0 :(得分:0)

将当前值添加到名称为“ var”并与计数器值串联的新变量中

vars.put("var" +vars.get("counter"), vars.get("accountId_1"));

答案 1 :(得分:0)

我做了类似我想你要问的事情。我需要一个地方来存储测试片段在线程之间进行通信所需的属性。我不知道这些属性的名称,也不知道我需要多少。

在测试套件的早期设置JSR223中,我将其放置:

props.put("runtimeProps", new ArrayList());

当我想向该数组添加动态属性时,我将其放在特定测试片段中的JSR223采样器中(在这种情况下,我存储了一个较大的JSON字符串,该字符串随产品类型而异,但只有几个变体,因此我可以解析一次,而下一次线程针对该产品类型需要它时,则无需再次解析它):

propertyName = vars.get("TopSampleName") + "." + vars.get("Category") + "." + vars.get("Option");
id = props.get(propertyName);
if(id != null) { // we've already parsed it, no need to parse again.
    vars.put("ExID", id);
} else { // We haven't parsed this product type yet, so parse it, get the ID, and make it available to the thread (vars) and other threads (props).
    json = props.get(vars.get("TopSampleName") + ".AllJSON");
    id = com.jayway.jsonpath.JsonPath.read(json, '$..[?(@.text=="' + vars.get("Category") + '")].menu.items[?(@.text=="' + vars.get("Option") + '")].id').get(0).toString();

    vars.put("ExID", id);
    props.put(propertyName, id);
    propsList = props.get("runtimeProps");
    propsList.add(propertyName);
    props.put("runtimeProps", propsList);
}

这会将具有动态定义名称的属性添加到属性列表,并将属性名称添加到runtimeProps数组。

因为我使用的是属性而不是变量,所以我需要在执行结束时清理它们,因此在套件末尾将其拆解为JSR223:

propsList = props.get("runtimeProps");
log.info("propsList = " + propsList);
for (String property : propsList) {
    props.remove(property);
}
props.remove("runtimeProps");

属性在整个执行过程中都会保留,而变量则不会。如果使用变量,则不需要runtimeProps数组列表或清理步骤。您可以只存储变量(vars.put,而不是props.put),但是如果您使用动态名称,则使用者将需要知道或重新生成动态名称。