Looping through JSON response + in JMETER

2020-07-13 11:35发布

问题:

I am using Jmeter for performance testing and stuck at following point: I am getting a JSON response from Webapi as follows:

PersonInfoList:
Person
[0]
{
  id: 1
  name: Steve
}
[1]
Person
{
  id: 2
  name: Mark
}

I need to get the ids based on the count of this JSON array and create a comma separated string as ("Expected value" = 1,2)

I know how to read a particular element using JSON Post processor or Regex processor but am unable to loop through the array and create a string as explained so that I can use this value in my next sampler request.

Please help me out with this: I am using Jmeter 3.0 and if this could be achieved without using external third party libs that would be great. Sorry for the JSON syntax above

回答1:

Actually similar functionality comes with JSON Path PostProcessor which appeared in JMeter 3.0. In order to get all the values in a single variable configure JSON Path PostProcessor as follows:

  • Variable Names: anything meaningful, i.e. id
  • JSON Path Expressions: $..id or whatever you use to extract the ids
  • Match Numbers: -1
  • Compute concatenation var (suffix _ALL): check

As a result you'll get id_ALL variable which will contain all JSON Path expression matches (comma-separated)

More "universal" answer which will be applicable for any other extractor types and in fact will allow to concatenate any arbitrary JMeter Variables is using scripting (besides if you need this "expected value and parentheses)

In order to concatenate all variables which names start with "id" into a single string add Beanshell PostProcessor somewhere after JSON Path PostProcessor and put the following code into "Script" area

StringBuilder result = new StringBuilder();
result.append("(\"Expected value\" = ");
Iterator iterator = vars.getIterator();

while (iterator.hasNext()) {
  Map.Entry e = (Map.Entry) iterator.next();
  if (e.getKey().matches("id_(\\d+)")) {
      result.append(e.getValue());
      result.append(",");
  }
}
result.append(")");
vars.put("expected_value", result.toString());

Above code will store the resulting string into ${expected value} JMeter Variable. See How to Use BeanShell: JMeter's Favorite Built-in Component article for more information regarding bypassing JMeter limitations using scripting and using JMeter and Java API from Beanshell test elements.

Demo:



标签: jmeter