[为更容易参考的修订后的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'将以xxxxxx1045结尾。我会"出现" ' id'的最后几位数字每次评估价值,当它在1045年结束时,它被四舍五入到10.50。
感谢@ kiril-s和@ dmitri-t的帮助,已经创建了以下解决方案。
首先,我添加了2个新的用户定义变量
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。
欢迎提供其他反馈。
答案 0 :(得分:0)
这可能是由于Beanshell解释器性能问题造成的。在高负载时,使用JSR223测试元素和recommended语言编写脚本是Groovy。
首先下载groovy-all.jar,将其放到Jmeter" lib"文件夹并重新启动JMeter来拾取jar。
重新设计您的UPDATE记录,如下所示:
在JSR223 PostProcessor中:
将以下代码放入"脚本"面积:
vars.put("foobar", vars.get("foobar").replaceAll(vars.get("baseUnitFieldValue"),"11.50"));
它应该解决你的问题。有关详细说明,有关安装groovy引擎支持和脚本最佳实践的说明,请参阅Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!。