在JMeter中使用正则表达式提取器循环样本结果

时间:2019-09-09 20:57:59

标签: performance jmeter performance-testing jmeter-3.2 jmeter-5.0

我有4个样本:

第一个响应类似于XML:

<userId>9709262083</userId>
<name>Tom</name>
<relatedTo>9709262080</relatedTo>
<userId>9709262084</userId>
<name>John</name>
<relatedTo>9709262080</relatedTo>
<userId>9709262085</userId>
<name>Michael</name>
<relatedTo>9709262080</relatedTo>

我创建了特殊的正则表达式提取器来获取所有userId(-1作为匹配号)并正确地获取工作。

Regular Expression Extractor

我有3个完全相同的样本,但一个参数(${USER_ID_1}${USER_ID_2}${USER_ID_3})只有一个差异,但我想使我的解决方案更通用,甚至可以工作如果我不知道会有多少用户响应。

对于在正则表达式提取器中找到的每个元素,如何用某种循环中的1个样本替换这3个样本(不知道确切的用户数)。

(我正在使用JMeter 3.2,可以将其提高到5.1)

更新

另一种方式,我希望将它们用作采样器中的单个变量,而不是拆分它们。

//e.g. 3 users 
"<User><userId>9709262083</userId></User> <User><userId>9709262084</userId></User> <User><userId>97092620835</userId></User>"

//e.g. 2 users
"<User><userId>9709262083</userId></User> <User><userId>9709262084</userId></User>"

理想的解决方案是创建一个临时变量,在每个变量的每个步骤中,我只需将其值添加到该变量模式中即可。

${myVariable} += "<User><userId>${userId}</userId></User>"

然后我可以使用${myVariable}

3 个答案:

答案 0 :(得分:1)

编辑

您的新要求${myVariable} += "<User><userId>${userId}</userId></User>"

可以通过在下面的行中使用JSR223 Sampler来实现

vars.put("myVariable", vars.get("myVariable") + "<User><userId>"+ vars.get("userId") + "</userId></User>");

您应该使用ForEach controller。示例:

  

应定义以下变量:

     

inputVar_1 =温迪

     

inputVar_2 =查尔斯

     

inputVar_3 =彼得

     

inputVar_4 =约翰

     

将return变量指定为“ returnVar”时,ForEach控制器下的采样器和控制器的收集将连续执行4次

答案 1 :(得分:1)

使用ForEach_Controller实现这一目标。

实际示例如下所示:

  1. Test Plan看起来像这样:

enter image description here

  1. 使用Regular Expression Extractor提取用户ID

enter image description here

  1. 使用For Each Controller遍历每个值

enter image description here

  1. 根据需要使用“请求中的每个控制器”中的值

enter image description here

  1. 工作证明

enter image description here

答案 2 :(得分:1)

  1. 最好使用XPath Extractor,它允许使用XPath expressions从XML / XHTML / HTML响应类型中获取数据
  2. 您可以使用ForEach Controller
  3. 循环变量