我需要按顺序执行Http请求列表并收集每个请求的结果/统计信息。映射将请求开始时间保存为键,将请求对象保存为值。
我可以分三步完成:
迭代结果集。
2a)获取每条记录,创建包含详细信息的请求对象,并构建一个以请求开始时间为键,请求对象为值的地图。
2b)使用请求对象数据形成SOAP请求XML消息,并将其作为值添加到HttpArguement
2c)创建JMeter测试计划,配置JMeter,执行计划并收集结果
2d)根据请求之间的请求开始时间计算延迟时间,并将正在运行的线程设置为睡眠状态
最后,服务在执行完所有记录后终止。
现在,我可以成功执行测试。但是,我不确定这是正确的方法。请检查一下,如果我错了,请告诉我。
此外,现在我将获得编码的个别请求的结果摘要。但是,我喜欢在执行所有请求后获取累积统计信息。怎么办?请指导我。
完整的代码如下:
// 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%)
答案 0 :(得分:0)
统计信息已写入report.jtl
文件,您可以使用自己选择的Listener打开它,即Aggregate Report并查看请求摘要。您还可以使用jmeter -g report.jtl -o /path/to/report/folder
文件构建HTML Reporting Dashboard,例如:
SOAP Request
我建议为您的请求使用不同的标签,因为它们都有 @echo off
Setlocal EnableDelayedExpansion
set /p anzahl=0952-8873
curl https://thekeepers.org/journals?query=%anzahl% >>thekeepers.xml
pause
名称,因此无法在最终报告中区分它们。
实际上您甚至不需要Java API,您可以使用JDBC Request sampler从Oracle获取请求数据,ForEach Controller来迭代结果集。