从0到1开发测试平台(十六)如何调用Jmeter的Api

2021-04-26 11:14:34 浏览数 (1)

| 前言

通过之前的篇幅我们了解了测试用例管理页面如何编写,接下来我们这篇将介绍性能测试平台核心部分代码-使用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();

0 人点赞