| 前言
通过之前的篇幅我们了解了测试用例管理页面如何编写,接下来我们这篇将介绍性能测试平台核心部分代码-使用jmeter提供的api来实现性能测试用例的执行。jmeter是通过解析执行jmx文件来运行脚本的,执行过程中会往jtl文件存入摘要日志,然后通过jtl来生成性能测试报告,jmeter自然也提供了这一套流程的api,大致的执行流程图如下图所示:
| 加载jmeter.properties配置到Properties
通过JMeterUtils.loadJMeterProperties来加载安装目录的jmeter配置文件jmeter.properties的相关属性到JMeterUtils的成员变量appProperties成员变量中,以便之后获取相关配置(jmeter.properties便是存放jmeter一些初始化配置的文件)
代码语言:javascript复制JMeterUtils.loadJMeterProperties("C:/Program Files/jmeter/bin/jmeter.properties");
| 设置jmeter的安装目录
代码语言:javascript复制JMeterUtils.setJMeterHome("C:/Program Files/jmeter");
| 初始化jmeter本地化的一些参数,比如设置本地语言以及一些资源等等
代码语言:javascript复制JMeterUtils.initLocale();
| 通过SaveService.loadTree解析本地的jmx文件来运行脚本
代码语言:javascript复制//加载本地jmx脚本
HashTree jmxTree = SaveService.loadTree(file);
| 在hashtree里添加结果收集器
结果收集器是Jmeter用来收集运行日志摘要的。
这一步的主要作用是新建收集器来收集运行日志摘要,以便后面报告生成器能根据我们收集的日志摘要生成报告文件。
(1)初始化摘要相关配置信息,并且新建摘要对象
所以摘要内容对于我们生成报告文件是必不可少的,jmeter的api自然也需要新建摘要对象。
代码语言:javascript复制Summariser summer = null;
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (summariserName.length() > 0) {
summer = new Summariser(summariserName);
}
(2)初始化结果收集器
结果收集器的作用就是把把结果收集成摘要然后写到jtl日志文件,所以如果需要分析运行日志或者需要运行之后生成运行报告的话ResultCollector必不可少,如果不需要的话可以不添加
代码语言:javascript复制ResultCollector resultCollector = new ResultCollector(summer);
(3)设置jtl日志文件目录及文件名,并把该字符串设置到结果收集器中
代码语言:javascript复制String logFile = "d:\tmp\result.jtl";
resultCollector.setFilename(logFile);
(4)把结果收集器也添加到之前生成的hashtree中
代码语言:javascript复制jmxTree.add(jmxTree.getArray()[0], resultCollector);
| hashtree转换
这一步主要是对我们之前构建的HashTree进行转换,作用是使得原来的hashtree转换成jmeter可以运行执行的hashtree结构
代码语言:javascript复制JMeter.convertSubTree(jmxTree,false);
| 根据HashTree执行测试用例
这一步主要是通过设置我们转换后的HashTree,运行我们构建的测试用例。
代码语言:javascript复制StandardJMeterEngine engine = new StandardJMeterEngine();
engine.configure(jmxTree);
engine.run();
| 生成性能测试报告
这一步主要是构建报告生成器,通过前面结果收集器记录的摘要日志生成结果报告文件。
主要作用还是生成测试用例执行结果的报告文件。
首先指定报告生成目录;然后初始ReportGenerator,初始化的时候加载reportgenerator.properties配置信息到configuration里面并且创建jtl文件,generate根据jtl文件内容的信息来生成报告的内容,并且指定了报告生产样式等内容。
代码语言:javascript复制JMeterUtils.setProperty(JMETER_REPORT_OUTPUT_DIR_PROPERTY, "D:\tmp\report");
ReportGenerator generator = new ReportGenerator(logFile,null);
generator.generate();
| 总结
以上我们通过8个步骤介绍了如何使用jmeter提供的api来实现性能测试用例的执行,我们平台用例执行相关的代码都可以基于以上代码拓展,在文章最后我们贴下代码的整体部分
代码语言:javascript复制StandardJMeterEngine engine = new StandardJMeterEngine();
// Initialize Properties, logging, locale, etc.
JMeterUtils.loadJMeterProperties(jmeterPropertiesUri);
JMeterUtils.setJMeterHome(jmeterHomeUri);
JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
JMeterUtils.initLocale();
// Initialize JMeter SaveService
SaveService.loadProperties();
//jmeter结果相关设置
Summariser summer = null;
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (summariserName.length() > 0) {
summer = new Summariser(summariserName);
}
String reportNameStr = new StringBuilder().append(performanceCase.getId()).append("_").append(performanceCase.getCaseName()).toString();
StringBuilder htmlReportSb = new StringBuilder();
htmlReportSb.append(jmeterReportJtlUri).append(reportNameStr);
String htmlReportStr = htmlReportSb.toString();
String logFile = htmlReportStr ".jtl";
CCTestResultCollector resultCollector = new CCTestResultCollector(summer);
resultCollector.setFilename(logFile);
File file = new File(performanceCase.getScriptUrl());
log.info("fileExist:{}",file.exists());
//加载本地jmx脚本
HashTree jmxTree = SaveService.loadTree(file);
jmxTree.add(jmxTree.getArray()[0], resultCollector);
// jmeter5 以上建议换用 JMeter.convertSubTree(jmxTree,false);去掉没用的节点元素,替换掉可以替换的控制器
JMeter.convertSubTree(jmxTree,false);
engine.configure(jmxTree);
engine.run();
standardJMeterEngineMap.put(id, engine);
//jmeter报告生成设置
ReportGenerator generator = new ReportGenerator(logFile,null);
JMeterUtils.setProperty(JMETER_REPORT_OUTPUT_DIR_PROPERTY, htmlReportStr);
generator.generate();