我有一个执行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
答案 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),但是如果您使用动态名称,则使用者将需要知道或重新生成动态名称。