JMeter-如何执行Http请求列表并收集结果统计信息



我需要按顺序执行Http请求列表,并收集每个请求的结果/统计信息。映射将请求开始时间作为关键字,将请求对象作为值。

我可以分三步完成:

  1. 使用Oracle表中提供的请求库详细信息构建结果集
  2. 迭代结果集。

    2a)获取每条记录,创建具有详细信息的请求对象,还构建了一个以请求开始时间为键、以请求对象为值的映射。

    2b)使用请求对象数据形成SOAP请求XML消息,并将其作为值添加到HttpArgument

    2c)创建JMeter测试计划,配置JMeter,执行计划并收集结果

    2d)基于请求之间的请求开始时间计算延迟时间,并将运行线程设置为睡眠状态

  3. 最后,在执行完所有记录后,服务被终止。

现在,我可以成功执行测试了。但是,我不确定这是正确的做法。请检查一下,如果我错了,请告诉我。

此外,现在我得到了编码的个人请求的结果摘要。但是,我喜欢在执行所有请求后获得累积统计数据。如何做到这一点?请引导我。

完整的代码如下:

// Build the result set [baseReqRecords] of request details from the database
while (baseReqRecords.next()) {
// Get the request details
// Get the start time
long delay = 0;
if (previousRequestStartTime != null) {
delay = ((requestStartTime.getTime() - previousRequestStartTime
.getTime()));
}
HTTPSamplerProxy httpSampler = new HTTPSamplerProxy();
httpSampler.setName("SOAP Request");
httpSampler.setEnabled(true);
httpSampler.setPostBodyRaw(true);
HTTPArgument httpArgument = new HTTPArgument();
httpArgument.setAlwaysEncoded(false);
httpArgument.setMetaData("=");
if (operationsMap.get(reqOperation).equals(
<<DESIRED_OPERATION>>)) {
// build the request context object from the request details
httpArgument.setValue(<<SOAP MESSAGE>>);
}
Arguments arguments = new Arguments();
arguments.addArgument(httpArgument);
System.out.println("HTTP Argument value: "
+ httpArgument.getValue());
HeaderManager headerManager = new HeaderManager();
headerManager.add(new Header("<<SM_USER>>",
"<<value>>"));
headerManager.add(new Header("Content-Type",
"text/xml; charset=utf-8"));
headerManager
.add(new Header(
"SOAPAction",
"<<ACTION_URL>>"));
headerManager.setName(JMeterUtils
.getResString("header_manager_title"));
headerManager.setProperty(TestElement.GUI_CLASS,
HeaderPanel.class.getName());
headerManager.setProperty(TestElement.TEST_CLASS,
HeaderManager.class.getName());
System.out.println("Headers: " + headerManager.getHeaders());
httpSampler.setArguments(arguments);
httpSampler.setDomain("<<SERVER>>");
httpSampler.setPort(<<PORT>>);
httpSampler
.setPath("<<PATH>>");
httpSampler.setMethod("POST");
httpSampler.setName("Sampler");
httpSampler.setFollowRedirects(true);
httpSampler.setAutoRedirects(false);
httpSampler.setUseKeepAlive(true);
httpSampler.setDoMultipartPost(false);
httpSampler.setMonitor(false);
httpSampler.setProperty(TestElement.GUI_CLASS,
HttpTestSampleGui.class.getName());
httpSampler.setProperty(TestElement.TEST_CLASS,
HTTPSamplerProxy.class.getName());
LoopController loopController = new LoopController();
loopController.setEnabled(true);
loopController.setFirst(true);
loopController.setContinueForever(false);
loopController.setLoops(1);
loopController.setProperty(TestElement.GUI_CLASS,
LoopControlPanel.class.getName());
loopController.setProperty(TestElement.TEST_CLASS,
LoopController.class.getName());
loopController.initialize();
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setNumThreads(1);
threadGroup.setRampUp(1);
threadGroup.setScheduler(false);
threadGroup.setSamplerController(loopController);
threadGroup.setEnabled(true);
threadGroup.setProperty(TestElement.GUI_CLASS,
ThreadGroupGui.class.getName());
threadGroup.setProperty(TestElement.TEST_CLASS,
ThreadGroup.class.getName());
TestPlan testPlan = new TestPlan(
"Test Plan");
testPlan.setComment("Service Operations Test Plan");
testPlan.setFunctionalMode(false);
testPlan.setSerialized(false);
testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel()
.createTestElement());
testPlan.setProperty(TestElement.GUI_CLASS,
TestPlanGui.class.getName());
testPlan.setProperty(TestElement.TEST_CLASS,
TestPlan.class.getName());
HashTree testPlanTree = new HashTree();
HashTree samplerTree = new HashTree();
samplerTree.add(httpSampler, headerManager);
testPlanTree.add(testPlan);
HashTree threadGroupHashTree = testPlanTree.add(testPlan,
threadGroup);
threadGroupHashTree.add(samplerTree);
SaveService.saveTree(testPlanTree, new FileOutputStream(
"jmeter_api.jmx"));
Summariser summary = null;
String summariserName = JMeterUtils.getPropDefault(
"summariser.name", "summary");
if (summariserName.length() > 0) {
summary = new Summariser(summariserName);
}
String reportFile = "report.jtl";
ResultCollector logger = new ResultCollector(summary);
logger.setFilename(reportFile);
testPlanTree.add(testPlanTree.getArray()[0], logger);
jmeter.configure(testPlanTree);
previousRequestStartTime = requestStartTime;
jmeter.run();
System.out.println("delay = " + delay);
Thread.sleep(delay);
}

假设结果集中有5条请求详细信息记录。请求开始时间差为60秒。现在,我在执行后收到了以下结果:

summary =      1 in 00:00:01 =    0.9/s Avg:  1002 Min:  1002 Max:  1002 Err:     0 (0.00%)
delay = 0
summary =      1 in 00:00:01 =    1.1/s Avg:   850 Min:   850 Max:   850 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.5/s Avg:   612 Min:   612 Max:   612 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.1/s Avg:   859 Min:   859 Max:   859 Err:     0 (0.00%)
delay = 60000
summary =      1 in 00:00:01 =    1.1/s Avg:   849 Min:   849 Max:   849 Err:     0 (0.00%)

统计信息被写入report.jtl文件,您可以使用自己选择的Listener打开它,即Aggregate Report,并查看请求摘要。您还可以使用report.jtl文件构建一个HTML报告面板,如:

jmeter -g report.jtl -o /path/to/report/folder

我建议为您的请求使用不同的标签,因为它们都有SOAP Request名称,所以在最终报告中无法区分它们。

实际上,您甚至不需要Java API,您可以使用JDBC请求采样器从Oracle和ForEach Controller获取请求数据来迭代结果集。

最新更新