需要从Jmeter中的字符串响应中提取动态值

时间:2015-11-25 06:12:30

标签: jmeter

我需要提取动态值“BSS1,DS1,HYS1,MS1,PTS1,QS1,USG1,YS1,RT10086,RT10081,RT10084,RT10082,OT10076,RT10083,UT10081,RT10085,
来自字符串响应“ACCOUNT_DETAIL_ACCOUNT_PRODUCT_SERVICES_EDIT_UPDATE_NameSpace.grid.setSelectedKeys(["BSS1","DS1","HYS1","MS1","PTS1","QS1","USG1","YS1","RT10086","RT10081","RT10084","RT10082","OT10076","RT10083","UT10081","RT10085"]);

我尝试过使用正则表达式提取器:

Regular Expression :Keys\(\[\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\",\"(.+?)\"]\)

template : $1$$2$$3$$4$$5$$6$$7$$8$$9$$10$$11$$12$$13$$14$$15$$16$

但只有在响应中有16个值时,上述正则表达式才有效。如果响应包含的值较少,例如“ACCOUNT_DETAIL_ACCOUNT_PRODUCT_SERVICES_EDIT_UPDATE_NameSpace.grid.setSelectedKeys(["BSS1","DS1"]);”  那么上面的正则表达式不起作用。

如果总计数未知,如何在响应中提取值? 此外,响应中的双引号也需要省略。

是否有可以提取动态值的后处理器?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我相信使用一些脚本会更容易。

  1. 添加Beanshell PostProcessor作为返回上述回复的请求的子项
  2. 将以下代码放入PostProcessor的“脚本”区域:

    String response = new String(data);
    
    String rawKeys = response.substring(response.indexOf("[") + 1, response.indexOf("]")); // get the data inside square brackets
    String keysWithoutQuotes = rawKeys.replaceAll("\"", "");          // remove quotes
    String[] keyData = keysWithoutQuotes.split("\\,");                // get array of keys
    
    for (int i = 0; i < keyData.length; i++) {                       // store array of keys into JMeter variables like
    
      vars.put("Keys_" + (i +1), keyData[i]);                        // Keys_1=BSS1, Keys_2=DS1, etc.
    }
    
    vars.put("Keys_matchNr", String.valueOf(keyData.length));       // set Keys_matchNr variable
    
  3. 其中:

    • data是包含父采样器响应数据的字节数组
    • varsJMeterVariables类的简写,提供对JMeter变量的读/写访问。

    因此,您将拥有以下变量:

    Keys_1=BSS1
    Keys_2=DS1
    ..
    Keys_matchNr=X
    

    有关JMeter中Beanshell脚本编写的更多信息,请参阅How to Use BeanShell: JMeter's Favorite Built-in Component指南以及更多示例