Jmeter Bean shell - 匹配正确的正则表达式数组值并将组ID号/实例保存到用户定义的变量中

时间:2017-11-16 12:43:04

标签: regex jmeter beanshell

我是Jmeter BeanShell Scripting / Java的新手,目前使用下面的脚本遇到问题。

使用正则表达式提取器我能够提取所有可能值的数组。例如:10个日期值,变量定义为${RegExValue_All}(模板:$1$;匹配:-1

样本值:

01/01/2017
01/01/2017
01/01/2017
04/01/2017
05/01/2017
07/01/2017
07/01/2017
08/01/2017
10/01/2017
10/01/2017

现在我正在尝试编写一个BeanShell脚本来匹配特定日期并提取其序数/索引/迭代次数并将其保存到当前为空的用户定义变量${Matched_Iteration_Value}。 当我使用下面的代码时,我能够比较正确的所需值,因为我已将循环计数设置为10但无法保存序数/索引/迭代次数并获得各种错误。

此外,我希望代码在获得第一个匹配后立即停止执行,并将其迭代编号保存在我需要在后续请求中使用的变量中。

import java.text.DateFormat; 
import java.text.SimpleDateFormat;
import java.text.ParseException; 
import java.util.Date;
matches = (vars.get("RegExValue _All"));
for (int i=1; i<=20; i++) {
    if (vars.get("cPIGValueDate_All_" + i).equals("07/01/2017")) {
        log.info("Variable: cPIGValueDate_All_" + i + " is the Correct PIG");
        vars.putobject("Matched_Iteration_Value ",i);
    }
}

1 个答案:

答案 0 :(得分:0)

你的脚本和解释有点不一致,所以我必须假设一些事情:

  • 该正则表达式提取器配置了参考名称:RegExValue。因此,对于匹配:-1,当它找到多于1个日期时,它会将它们保存为名称为RegExValue_1RegExValue_2
  • 的变量
  • 您不关心RegExValue _All,因为您正在检索它,但未在任何地方使用它,并且它不是您的问题的一部分
  • 您希望将日期比较为日期(而非字符串),因为您导入了各种与日期相关的类
  • 您的日期格式为dd/MM/yyyy

所以

  1. 首先,循环本身应该基于名为RegExValue_matchNr的变量,当正则表达式有多个匹配时,该变量由JMeter自动创建。这比硬编码循环要好20。
  2. 您可以使用Date将字符串中的预期和实际日期转换为SimpleDateFormat
  3. 然后将它们作为日期进行比较
  4. 最后,如果日期相同,保存变量并退出循环
  5. 以下是代码:

    import java.lang.Integer;
    import java.text.DateFormat; 
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    // 1.
    int count = 0;
    try {
        count = Integer.parseInt(vars.get("RegExValue_matchNr"));
    }
    catch(Exception e) { }
    
    // 2.
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
    Date expectedDate = format.parse("07/01/2017");
    
    for(int i = 1; i <= count; i++)
    {
        Date actualDate = null;
        try {
            actualDate = format.parse(vars.get("RegExValue_" + i));
        }
        catch(Exception e) { }
    
        // 3.
        if(actualDate != null && expectedDate.compareTo(actualDate) == 0) {
            log.info("Variable: RegExValue_" + i + " is the Correct PIG");
            // 4.
            vars.put("Matched_Iteration_Value", "" + i);
            return;
        }
    }