Jmeter二次开发流程拆解与环境初始化工具类封装
前言
从之前几集里,我们完成了测试用例接口与测试模块接口的开发以及Jmeter二次开发的Demo。
这一集我们将会正式对Jmeter进行二次开发。
Jmeter二次开发流程拆解
那么在开发之前,我们要去对Jmeter二次开发进行步骤的拆解与分析。
那么还是先来继续看一下之前的Demo代码。
public class TestStress {
@Test
public void testJmeterScript()throws Exception{
// JMeter路径
String jmeterPath = "G:\\Jmeter\\apache-jmeter-5.6.3";
// JMeter根目录
File jmeterHome = new File(jmeterPath);
// JMX文件路径
String jmxFilePath = "E:\\XXX\\JMX\\pay_json.jmx";
// JMX文件
File jmxFile = new File(jmxFilePath);
// JMeter配置文件路径
File jmeterProperties = new File(jmeterHome.getPath() + File.separator + "bin" + File.separator + "jmeter.properties");
// 设置JMeter根目录
JMeterUtils.setJMeterHome(jmeterHome.getPath());
// 加载JMeter配置文件
JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());
// JMeter标准引擎
StandardJMeterEngine jmeter = new StandardJMeterEngine();
// 测试计划树
HashTree testPlanTree = new HashTree();
// 设置文件服务器的基础脚本路径
FileServer.getFileServer().setBaseForScript(jmxFile);
// 加载测试计划树 jmx脚本
testPlanTree = SaveService.loadTree(jmxFile);
// 转换测试计划树
JMeter.convertSubTree(testPlanTree, false);
// Summariser对象
Summariser summer = null;
// Summariser名称
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (!summariserName.isEmpty()) {
// 创建Summariser对象
summer = new Summariser(summariserName);
}
// 结果日志文件名
String logFile = "example.csv";
// 结果收集器
ResultCollector logger = new ResultCollector (summer);
logger.setFilename(logFile);
// 将结果收集器添加到测试计划树上
testPlanTree.add(testPlanTree.getArray()[0], logger);
// 配置JMeter引擎
jmeter.configure(testPlanTree);
// 运行JMeter测试
jmeter.run();
}
}
其实在Jmeter二次开发Demo那一集我们也梳理过,我们的四大步骤如下:
- 环境初始化
- 配置脚本
- 结果集配置
- 执行测试用例
其中,环境初始化,表示设置Jmeter运行环境。配置脚本,即通过各种方式加载Jmeter脚本文件。
结果集配置,即配置结果集,收集测试过程产生的数据。执行测试用例,即启动线程组,采样器的执行,监听器和后处理。
JmeterEngine模块封装
需求
JmeterEngine支持两种测试计划录入
- 本地上传JMX脚本
- 在线创建测试计划
JmeterEngine支持两种执行压测,对外提供HTTP接口。
- 本地JMX执行
- 在线创建测试计划执行
封装环境初始化工具类
看完需求,我们要从Jmeter二次开发的流程中去开发我们的工具类,这样更利于后续代码的开发,请看下图。
从这图中,我们也能大致想出有哪些工具类是需要进行开发的。
我们大致需要完成以下几个接口:
- 获取Jmeter home路径
- 获取Jmeter bin目录
- 初始化Jmeter配置
- 获取JmeterEngine
getJmeterHome
public static String getJmeterHome(){
try{
return StressTestUtil.class.getClassLoader().getResource("jmeter").getPath();
}catch (Exception e){
throw new RuntimeException("获取jmeter路径失败");
}
}
获取Jmeter的home目录,这里的Jmeter的home目录是临时的,我把它放在了resources底下。
getJmeterHomeBin
public static String getJmeterHomeBin(){
return getJmeterHome() + File.separator + "bin";
}
这个会更简单,因为Bin目录在Home目录的底下。
initJmeterProperties
public static void initJmeterProperties(){
String jmeterHome = getJmeterHome();
String jmeterHomeBin = getJmeterHomeBin();
//加载jmeter的配置文件
JMeterUtils.loadProperties(jmeterHomeBin + File.separator + "jmeter.properties");
//设置jmeter的安装目录
JMeterUtils.setJMeterHome(jmeterHome);
//避免中文响应乱码
JMeterUtils.setProperty("sampleresult.default.encoding","UTF-8");
//初始化本地环境
JMeterUtils.initLocale();
}
这里初始化Jmeter的配置。
getJmeterEngine
public static StandardJMeterEngine getJmeterEngine(){
//先初始化配置
initJmeterProperties();
return new StandardJMeterEngine();
}
这个就是获取一个JmeterEngine,记得要先初始化哦~
完整代码
public class StressTestUtil {
/**
* 获取jmeterhome路径,临时路径
* @return
*/
public static String getJmeterHome(){
try{
return StressTestUtil.class.getClassLoader().getResource("jmeter").getPath();
}catch (Exception e){
throw new RuntimeException("获取jmeter路径失败");
}
}
/**
* 获取jmeter bin目录
* @return
*/
public static String getJmeterHomeBin(){
return getJmeterHome() + File.separator + "bin";
}
/**
* 初始化jmeter配置
*/
public static void initJmeterProperties(){
String jmeterHome = getJmeterHome();
String jmeterHomeBin = getJmeterHomeBin();
//加载jmeter的配置文件
JMeterUtils.loadProperties(jmeterHomeBin + File.separator + "jmeter.properties");
//设置jmeter的安装目录
JMeterUtils.setJMeterHome(jmeterHome);
//避免中文响应乱码
JMeterUtils.setProperty("sampleresult.default.encoding","UTF-8");
//初始化本地环境
JMeterUtils.initLocale();
}
public static StandardJMeterEngine getJmeterEngine(){
//先初始化配置
initJmeterProperties();
return new StandardJMeterEngine();
}
}