Jmeter正则表达式匹配号

时间:2016-06-30 10:51:39

标签: regex jmeter correlation

我有两个值关联,我能够成功地在两个参数中捕获它们。我在匹配号码中使用-1获取随机值,但我实际上想要的方式是,假设我的第一个值随机将匹配号码设为7并且我想要我的第二个值也应该与7相同的匹配数。

请帮助我如何模拟这个。

2 个答案:

答案 0 :(得分:1)

不幸的是,(正如您所发现的),JMeter独立地确定了“随机”。您需要做的是捕获var1和var2的每个潜在值(使用-1)。然后在你的正则表达式之后,添加一个Beanshell Postprocessor得到一个随机数n,然后选择第n个var1和var2:

String random_number = Integer(random.nextInt(vars.get("var1_name_matchNr"))).toString;
vars.put("var1_name_chosen",vars.get("var1_name_" + random_number));
vars.put("var2_name_chosen",vars.get("var2_name_" + random_number));

答案 1 :(得分:0)

如果我理解正确,您需要提取随机正则表达式值,并将其放入2个变量中。如果是这样,我会建议做一些像......

获得随机正则表达式值后,添加beanshell,在其中将使用regex获得的值粘贴到第二个变量中。

因此,如果regex中的变量是“foo1”,只需添加beanshell sampler:

vars.put("foo2", vars.get("foo1"));

编辑:

这样可以更好地作为Java采样器,但我认为它也适用于BeanShell采样器。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContextService;

import java.util.ArrayList;
import java.util.Random;


String previousResponse = JMeterContextService.getContext()
        .getPreviousResult().getResponseDataAsString();

String locationLinkRegex = "\"locationId\": (.+?),";

String myLocationId = RegexMethod(previousResponse, locationLinkRegex,
        true);
String myLocationLink = RegexMethod(
        previousResponse,
        "\"locationId\": ".concat(myLocationId).concat(
                ", \"locationLink\":(.+?))\""), false);

JMeterContextService.getContext().getVariables()
        .put("locationId", myLocationId);
JMeterContextService.getContext().getVariables()
        .put("locationLink", myLocationLink);   

private static String RegexMethod(String response, String regex,
        Boolean random) {
    Random ran = new Random();
    String result = "No matcher!";
    ArrayList<String> allMatches = new ArrayList<String>();
    allMatches = null;
    if (random) {
        Matcher m = Pattern.compile(regex, Pattern.UNICODE_CASE).matcher(
                response);
        while (m.find()) {
            allMatches.add(m.group());
        }
        result = allMatches.get(ran.nextInt(allMatches.size()));
    } else {
        Matcher m = Pattern.compile(regex, Pattern.UNICODE_CASE).matcher(
                response);
        m.find();
        result = m.group(1);
    }
    return result;
}

还需要实现异常处理......

EDIT2:

Regex方法是递归的(将这两个值都返回CSV,只有当locationId是唯一的时才可以使用):

private static String RegexMethod(String response, String regex) {
    Random ran = new Random();
    String result = "No matcher!";
    List<String> allMatches = new ArrayList<String>();

    // Find LocationId:
    Matcher m1 = Pattern.compile(regex, Pattern.UNICODE_CASE).matcher(
            response);
    while (m1.find()) {
        allMatches.add(m1.group());
    }
    result = allMatches.get(ran.nextInt(allMatches.size())).concat(",");

    // Find LocationLink and return the CSV string:

    return result += RegexMethod(response, "\"locationId\": "
            .concat(result.substring(result.length()-1)).concat(", \"locationLink\":(.+?))\""));
    }