JMeter:Fields'合并的价值

时间:2016-03-31 21:00:49

标签: api jmeter

[为更容易参考的修订后的ORIG邮寄]

运行JMeter 2.13 r1665067,我正在使用来自JMeter的HTTP请求执行基本CRUD功能的API测试到数据库,其中包含' id'字段值偶尔被"合并"使用硬编码的baseUnitValue'导致失败的字段值和未找到" Obj的堆栈跟踪消息"。

创建新纪录

HTTP POST
    "id": 0,
    "schedulePeriodId": 1259810849,
    "amount": null,
    "baseUnitValue": 10.50,
    "procValue": "G0040",

RESPONSE
    "id": 1259811045,
    "schedulePeriodId": 1259810849,
    "amount": null,
    "baseUnitValue": 10.50,
    "procValue": "G0040"

RegEx Extractor
    Apply to: Main Sample only
    Field to check: Body
    Ref Name: baseUnitId
    Reg Exp: \"id":(.+?)\,
    Template: $1$
    Match No: 1
    Default: None

更新(原创)

HTTP POST
    ${__BeanShell(return vars.get("foobar").replaceAll(vars.get("baseUnitFieldValue")\,"11.50");,)}

    Where it's using/interpreting foobar to contain:
        "id": 12599511.507,
        "periodId": 1259810849,
        "amount": null,
        "baseUnitValue": 11.50,
        "procValue": "G0040"

RESPONSE
    Object with id 12599511 not found...

经过多次运行和调查后,出现了一种模式:

  • 如果' id' = xxxxxx 1045 和baseUnitValue = 10.5,当UPDATE发生时,硬编码的< baseUnitValue' 11.50,' id'值更改为xxxxxx 11.50

基本上,当' id'将以xxxxxx1045结尾。我会"出现" ' id'的最后几位数字每次评估价值,当它在1045年结束时,它被四舍五入到10.50。

感谢@ kiril-s和@ dmitri-t的帮助,已经创建了以下解决方案。

首先,我添加了2个新的用户定义变量

  • RND1 4.9999(最小值
  • RND2 15.9999(最大值

CREATE(添加了BeanShell PreProcessor)

HTTP POST
    "id": 0,
    "schedulePeriodId": 1259810849,
    "amount": null,
    "baseUnitValue": ${RND},
    "procValue": "G0040",

BeanShell PreProcessor
    Parameters: ${RND1}, ${RND2}
    Script:
    import java.util.*;

    String [] params = Parameters.split(",");

    double rangeMin = Double.valueOf(params[0]);
    double rangeMax = Double.valueOf(params[1]);
    Random r = new Random();
    double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
    vars.put("RND",randomValue.toString());
    //System.out.println(randomValue);

还有一个REGEX来参数化" id"数据库分配的字段值。这允许通过使用参数附加关联的URL来正确读取和删除函数。

执行READ HTTP请求时,将BeanShell PostProcessor添加到现有的2 REGEX。     REGEX 1         参考名称:foobar         Reg Exp:(?s)(^。*)

REGEX 2
    Ref Name: origFieldValue
    Reg Exp: \,"baseUnitValue":(.+?)\,

BeanShell PostProcessor
    Reset Interpreter: False
    Parameters: ${RND1}, ${RND2}
    Script:
        import java.util.*;

        String [] params = Parameters.split(",");

        double rangeMin = Double.valueOf(params[0]);
        double rangeMax = Double.valueOf(params[1]);
        Random r = new Random();
        double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble(); 

        vars.put("newFieldValue",randomValue.toString());
        //System.out.println(randomValue);

这允许将不同的值(newFieldValue)传递给" baseUnitFieldValue'没有硬编码。

更新(添加JSR223预处理器)

HTTP POST
    ${baseUnitValueBody}

JSR223 PreProcessor
    Language: groovy
    Parameters: "newFieldValue"
    Script:
    import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
    import org.apache.jmeter.protocol.http.util.HTTPArgument;

    vars.put("foobar", vars.get("foobar").replace(vars.get("baseUnitFieldValue"),vars.get("newFieldValue")));

还要注意从 replaceAll replace的更改。

现在,< baseUnitValue'永远是独一无二的,而且这个' id'每1000个记录不会对字段进行评估和转换。我使用500个线程用户@ 1个循环和1000个用户@3个循环运行。原始问题不再发生。再次感谢@ dmitri-t和@ kiril-s。

欢迎提供其他反馈。

1 个答案:

答案 0 :(得分:0)

这可能是由于Beanshell解释器性能问题造成的。在高负载时,使用JSR223测试元素和recommended语言编写脚本是Groovy

首先下载groovy-all.jar,将其放到Jmeter" lib"文件夹并重新启动JMeter来拾取jar。

重新设计您的UPDATE记录,如下所示:

在JSR223 PostProcessor中:

  1. 使用" groovy"作为一种语言
  2. 将一些独特的东西放入"编译缓存键"输入
  3. 将以下代码放入"脚本"面积:

    vars.put("foobar", vars.get("foobar").replaceAll(vars.get("baseUnitFieldValue"),"11.50"));
    
  4. 它应该解决你的问题。有关详细说明,有关安装groovy引擎支持和脚本最佳实践的说明,请参阅Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!