java使用jmeter生成jmx文件并运行
前提准备
我们使用jmeter发送POST请求
# url:
localhost:8088/mongo/insert
# method:
POST
# headers
{
"Content-Type" : "application/json"
}
# body
{
"name": "liuyiyang",
"password": "123456"
}
下载jmeter
https://jmeter.apache.org/download_jmeter.cgi
我用的是5.3的版本
新建一个maven项目
我用的是spring boot项目
引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除自带的logback依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- springboot-log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_http</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
</dependencies>
编写JmterTest测试类
设置使用的jmeter
String jemterHome = "/Users/liufei/Downloads/apache-jmeter-5.3";
JMeterUtils.setJMeterHome(jemterHome);
JMeterUtils.loadJMeterProperties(JMeterUtils.getJMeterBinDir() + "/jmeter.properties");
创建测试计划
private static TestPlan getTestPlan() {
TestPlan testPlan = new TestPlan("Test Plan");
testPlan.setFunctionalMode(false);
testPlan.setSerialized(false);
testPlan.setTearDownOnShutdown(true);
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setProperty(new BooleanProperty(TestElement.ENABLED, true));
testPlan.setProperty(new StringProperty(TestElement.COMMENTS, ""));
testPlan.setTestPlanClasspath("");
Arguments arguments = new Arguments();
testPlan.setUserDefinedVariables(arguments);
return testPlan;
}
设置循环控制器
private static LoopController getLoopController() {
LoopController loopController = new LoopController();
loopController.setContinueForever(false);
loopController.setProperty(new StringProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()));
loopController.setProperty(new StringProperty(TestElement.TEST_CLASS, LoopController.class.getName()));
loopController.setProperty(new StringProperty(TestElement.NAME, "循环控制器"));
loopController.setProperty(new StringProperty(TestElement.ENABLED, "true"));
loopController.setProperty(new StringProperty(LoopController.LOOPS, "1"));
return loopController;
}
创建线程组
/
/***
* 创建线程组
* @param loopController 循环控制器
* @param numThreads 线程数量
* @return
*/
private static ThreadGroup getThreadGroup(LoopController loopController, int numThreads) {
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setNumThreads(numThreads);
threadGroup.setRampUp(1);
threadGroup.setDelay(0);
threadGroup.setDuration(0);
threadGroup.setProperty(new StringProperty(ThreadGroup.ON_SAMPLE_ERROR, "continue"));
threadGroup.setScheduler(false);
threadGroup.setName("回放流量");
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
threadGroup.setProperty(new BooleanProperty(TestElement.ENABLED, true));
threadGroup.setProperty(new TestElementProperty(ThreadGroup.MAIN_CONTROLLER, loopController));
return threadGroup;
}
创建Http请求信息
/***
* 创建http请求信息
* @param url ip地址
* @param port 端口
* @param api url
* @param request 请求参数(请求体)
* @return
*/
private static HTTPSamplerProxy getHttpSamplerProxy(String url, String port, String api, String request) {
HTTPSamplerProxy httpSamplerProxy = new HTTPSamplerProxy();
Arguments HTTPsamplerArguments = new Arguments();
HTTPArgument httpArgument = new HTTPArgument();
httpArgument.setProperty(new BooleanProperty("HTTPArgument.always_encode", false));
httpArgument.setProperty(new StringProperty("Argument.value", request));
httpArgument.setProperty(new StringProperty("Argument.metadata", "="));
ArrayList<TestElementProperty> list1 = new ArrayList<>();
list1.add(new TestElementProperty("", httpArgument));
HTTPsamplerArguments.setProperty(new CollectionProperty("Arguments.arguments", list1));
httpSamplerProxy.setProperty(new TestElementProperty("HTTPsampler.Arguments", HTTPsamplerArguments));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.domain", url));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.port", port));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.protocol", "http"));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.path", api));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.method", "POST"));
// JMETER_ENCODING这个是我定义的常量,设置的编码是UTF-8,后面还有其他地方用到这个常量
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.contentEncoding", JMETER_ENCODING));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.follow_redirects", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.postBodyRaw", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.auto_redirects", false));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.use_keepalive", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.DO_MULTIPART_POST", false));
httpSamplerProxy.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.test_class", "org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.name", "HTTP Request"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.enabled", "true"));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.postBodyRaw", true));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.embedded_url_re", ""));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.connect_timeout", ""));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.response_timeout", ""));
return httpSamplerProxy;
}
设置监听器中的结果(如汇总结果,察看结果树)
/***
* 监听结果
* @param replayLogPath 将结果保存到文件中,这个是文件的路径
* @return
*/
private static List<ResultCollector> getResultCollector(String replayLogPath) {
// 察看结果数
List<ResultCollector> resultCollectors = new ArrayList<>();
Summariser summariser = new Summariser("速度");
ResultCollector resultCollector = new ResultCollector(summariser);
resultCollector.setProperty(new BooleanProperty("ResultCollector.error_logging", false));
resultCollector.setProperty(new ObjectProperty("saveConfig", getSampleSaveConfig()));
resultCollector.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.visualizers.ViewResultsFullVisualizer"));
resultCollector.setProperty(new StringProperty("TestElement.name", "察看结果树"));
resultCollector.setProperty(new StringProperty("TestElement.enabled", "true"));
resultCollector.setProperty(new StringProperty("filename", replayLogPath));
resultCollectors.add(resultCollector);
// 结果汇总
ResultCollector resultTotalCollector = new ResultCollector();
resultTotalCollector.setProperty(new BooleanProperty("ResultCollector.error_logging", false));
resultTotalCollector.setProperty(new ObjectProperty("saveConfig", getSampleSaveConfig()));
resultTotalCollector.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.visualizers.SummaryReport"));
resultTotalCollector.setProperty(new StringProperty("TestElement.name", "汇总报告"));
resultTotalCollector.setProperty(new StringProperty("TestElement.enabled", "true"));
resultTotalCollector.setProperty(new StringProperty("filename", ""));
resultCollectors.add(resultTotalCollector);
return resultCollectors;
}
private static SampleSaveConfiguration getSampleSaveConfig() {
SampleSaveConfiguration sampleSaveConfiguration = new SampleSaveConfiguration();
sampleSaveConfiguration.setTime(true);
sampleSaveConfiguration.setLatency(true);
sampleSaveConfiguration.setTimestamp(true);
sampleSaveConfiguration.setSuccess(true);
sampleSaveConfiguration.setLabel(true);
sampleSaveConfiguration.setCode(true);
sampleSaveConfiguration.setMessage(true);
sampleSaveConfiguration.setThreadName(true);
sampleSaveConfiguration.setDataType(true);
sampleSaveConfiguration.setEncoding(false);
sampleSaveConfiguration.setAssertions(true);
sampleSaveConfiguration.setSubresults(true);
sampleSaveConfiguration.setResponseData(false);
sampleSaveConfiguration.setSamplerData(false);
sampleSaveConfiguration.setAsXml(false);
sampleSaveConfiguration.setFieldNames(true);
sampleSaveConfiguration.setResponseHeaders(false);
sampleSaveConfiguration.setRequestHeaders(false);
//sampleSaveConfiguration.setAssertionResultsFailureMessage(true); responseDataOnError
sampleSaveConfiguration.setAssertionResultsFailureMessage(true);
//sampleSaveConfiguration.setsserAtionsResultsToSave(0); assertionsResultsToSave
sampleSaveConfiguration.setBytes(true);
sampleSaveConfiguration.setSentBytes(true);
sampleSaveConfiguration.setUrl(true);
sampleSaveConfiguration.setThreadCounts(true);
sampleSaveConfiguration.setIdleTime(true);
sampleSaveConfiguration.setConnectTime(true);
return sampleSaveConfiguration;
}
限制QPS设置
/***
* 限制QPS设置
* @param throughputTimer
* @return
*/
private static ConstantThroughputTimer getConstantThroughputTimer(int throughputTimer) {
ConstantThroughputTimer constantThroughputTimer = new ConstantThroughputTimer();
constantThroughputTimer.setEnabled(true);
constantThroughputTimer.setName("常数吞吐量定时器");
constantThroughputTimer.setProperty(TestElement.TEST_CLASS, ConstantThroughputTimer.class.getName());
constantThroughputTimer.setProperty(TestElement.GUI_CLASS, TestBeanGUI.class.getName());
constantThroughputTimer.setCalcMode(ConstantThroughputTimer.Mode.AllActiveThreads.ordinal());
constantThroughputTimer.setProperty(new IntegerProperty("calcMode", ConstantThroughputTimer.Mode.AllActiveThreads.ordinal()));
DoubleProperty doubleProperty = new DoubleProperty();
doubleProperty.setName("throughput");
doubleProperty.setValue(throughputTimer * 60f);
constantThroughputTimer.setProperty(doubleProperty);
return constantThroughputTimer;
}
设置请求头信息
/**
* 设置请求头信息
* @return
*/
private static HeaderManager getHeaderManager() {
ArrayList<TestElementProperty> headerMangerList = new ArrayList<>();
HeaderManager headerManager = new HeaderManager();
Header header = new Header("Content-Type", "application/json");
TestElementProperty HeaderElement = new TestElementProperty("", header);
headerMangerList.add(HeaderElement);
headerManager.setEnabled(true);
headerManager.setName("HTTP Header Manager");
headerManager.setProperty(new CollectionProperty(HeaderManager.HEADERS, headerMangerList));
headerManager.setProperty(new StringProperty(TestElement.TEST_CLASS, HeaderManager.class.getName()));
headerManager.setProperty(new StringProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName()));
return headerManager;
}
相关完整代码
package com.yiyang.myfirstspringdemo.service;
import com.yiyang.myfirstspringdemo.utils.CVSUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.config.CSVDataSet;
import org.apache.jmeter.config.CSVDataSetBeanInfo;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.RunTime;
import org.apache.jmeter.control.gui.LoopControlPanel;
import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.engine.JMeterEngine;
import org.apache.jmeter.engine.JMeterEngineException;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.gui.HeaderPanel;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.protocol.http.util.HTTPArgument;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.samplers.SampleSaveConfiguration;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testbeans.gui.TestBeanGUI;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.testelement.property.*;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.gui.ThreadGroupGui;
import org.apache.jmeter.timers.ConstantThroughputTimer;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author 刘翊扬
* @Date 2020/10/10 9:52 下午
* @Version 1.0
*/
public class JemterTest2 {
public static final String JMETER_ENCODING = "UTF-8";
// 因为我们就模拟一条请求,所以这个线程数先设置成1
public static final int NUMBER_THREADS = 1;
/** 执行结果输出的日志 */
public static final String replayLogPath = "/Users/liufei/Downloads/jmter/replay_result.log";
/** 生成的jmx的地址 */
public static final String jmxPath = "/Users/liufei/Downloads/jmter/test.jmx";
public static void main(String[] args) {
run();
}
private static void run() {
String url = "localhost";
String port = "8088";
String api = "/mongo/insert";
String request = "{\"name\":\"wangwu\",\"password\":\"wnagwu123456\"}";
String jemterHome = "/Users/liufei/Downloads/apache-jmeter-5.3";
JMeterUtils.setJMeterHome(jemterHome);
JMeterUtils.loadJMeterProperties(JMeterUtils.getJMeterBinDir() + "/jmeter.properties");
//JMeterUtils.initLocale();
// 获取TestPlan
TestPlan testPlan = getTestPlan();
// 获取设置循环控制器
LoopController loopController = getLoopController();
// 获取线程组
ThreadGroup threadGroup = getThreadGroup(loopController, NUMBER_THREADS);
// 获取Http请求信息
HTTPSamplerProxy httpSamplerProxy = getHttpSamplerProxy(url, port, api, request);
// 获取结果:如汇总报告、察看结果树
List<ResultCollector> resultCollector = getResultCollector(replayLogPath);
// 获取设置吞吐量
ConstantThroughputTimer constantThroughputTimer = getConstantThroughputTimer(20);
// 获取请求头信息
HeaderManager headerManager = getHeaderManager();
HashTree fourHashTree = new HashTree();
resultCollector.stream().forEach(item -> fourHashTree.add(item));
fourHashTree.add(headerManager);
HashTree thirdHashTree = new HashTree();
// 注意:设置吞吐量需要和Http请求同一级,否则无效
thirdHashTree.add(constantThroughputTimer);
thirdHashTree.add(httpSamplerProxy, fourHashTree);
HashTree secondHashTree = new HashTree();
secondHashTree.add(threadGroup, thirdHashTree);
HashTree firstTreeTestPlan = new HashTree();
firstTreeTestPlan.add(testPlan, secondHashTree);
try {
SaveService.saveTree(firstTreeTestPlan, new FileOutputStream(jmxPath));
} catch (IOException e) {
e.printStackTrace();
}
// 第一种方式:运行
StandardJMeterEngine jMeterEngine = new StandardJMeterEngine();
jMeterEngine.configure(firstTreeTestPlan);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
jMeterEngine.run();
System.out.println("运行成功!!!");
// 使用命令
/* String command = JMeterUtils.getJMeterBinDir() + "/jmeter -n -t " + jmxPath + " -l /Users/liufei/Downloads/jmter/replay_result.jtl";
Runtime.getRuntime().exec(command);
System.out.println(command);*/
}
/***
* 监听结果
* @param replayLogPath 将结果保存到文件中,这个是文件的路径
* @return
*/
private static List<ResultCollector> getResultCollector(String replayLogPath) {
// 察看结果数
List<ResultCollector> resultCollectors = new ArrayList<>();
Summariser summariser = new Summariser("速度");
ResultCollector resultCollector = new ResultCollector(summariser);
resultCollector.setProperty(new BooleanProperty("ResultCollector.error_logging", false));
resultCollector.setProperty(new ObjectProperty("saveConfig", getSampleSaveConfig()));
resultCollector.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.visualizers.ViewResultsFullVisualizer"));
resultCollector.setProperty(new StringProperty("TestElement.name", "察看结果树"));
resultCollector.setProperty(new StringProperty("TestElement.enabled", "true"));
resultCollector.setProperty(new StringProperty("filename", replayLogPath));
resultCollectors.add(resultCollector);
// 结果汇总
ResultCollector resultTotalCollector = new ResultCollector();
resultTotalCollector.setProperty(new BooleanProperty("ResultCollector.error_logging", false));
resultTotalCollector.setProperty(new ObjectProperty("saveConfig", getSampleSaveConfig()));
resultTotalCollector.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.visualizers.SummaryReport"));
resultTotalCollector.setProperty(new StringProperty("TestElement.name", "汇总报告"));
resultTotalCollector.setProperty(new StringProperty("TestElement.enabled", "true"));
resultTotalCollector.setProperty(new StringProperty("filename", ""));
resultCollectors.add(resultTotalCollector);
return resultCollectors;
}
private static SampleSaveConfiguration getSampleSaveConfig() {
SampleSaveConfiguration sampleSaveConfiguration = new SampleSaveConfiguration();
sampleSaveConfiguration.setTime(true);
sampleSaveConfiguration.setLatency(true);
sampleSaveConfiguration.setTimestamp(true);
sampleSaveConfiguration.setSuccess(true);
sampleSaveConfiguration.setLabel(true);
sampleSaveConfiguration.setCode(true);
sampleSaveConfiguration.setMessage(true);
sampleSaveConfiguration.setThreadName(true);
sampleSaveConfiguration.setDataType(true);
sampleSaveConfiguration.setEncoding(false);
sampleSaveConfiguration.setAssertions(true);
sampleSaveConfiguration.setSubresults(true);
sampleSaveConfiguration.setResponseData(false);
sampleSaveConfiguration.setSamplerData(false);
sampleSaveConfiguration.setAsXml(false);
sampleSaveConfiguration.setFieldNames(true);
sampleSaveConfiguration.setResponseHeaders(false);
sampleSaveConfiguration.setRequestHeaders(false);
//sampleSaveConfiguration.setAssertionResultsFailureMessage(true); responseDataOnError
sampleSaveConfiguration.setAssertionResultsFailureMessage(true);
//sampleSaveConfiguration.setsserAtionsResultsToSave(0); assertionsResultsToSave
sampleSaveConfiguration.setBytes(true);
sampleSaveConfiguration.setSentBytes(true);
sampleSaveConfiguration.setUrl(true);
sampleSaveConfiguration.setThreadCounts(true);
sampleSaveConfiguration.setIdleTime(true);
sampleSaveConfiguration.setConnectTime(true);
return sampleSaveConfiguration;
}
/***
* 创建http请求信息
* @param url ip地址
* @param port 端口
* @param api url
* @param request 请求参数(请求体)
* @return
*/
private static HTTPSamplerProxy getHttpSamplerProxy(String url, String port, String api, String request) {
HTTPSamplerProxy httpSamplerProxy = new HTTPSamplerProxy();
Arguments HTTPsamplerArguments = new Arguments();
HTTPArgument httpArgument = new HTTPArgument();
httpArgument.setProperty(new BooleanProperty("HTTPArgument.always_encode", false));
httpArgument.setProperty(new StringProperty("Argument.value", request));
httpArgument.setProperty(new StringProperty("Argument.metadata", "="));
ArrayList<TestElementProperty> list1 = new ArrayList<>();
list1.add(new TestElementProperty("", httpArgument));
HTTPsamplerArguments.setProperty(new CollectionProperty("Arguments.arguments", list1));
httpSamplerProxy.setProperty(new TestElementProperty("HTTPsampler.Arguments", HTTPsamplerArguments));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.domain", url));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.port", port));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.protocol", "http"));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.path", api));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.method", "POST"));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.contentEncoding", JMETER_ENCODING));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.follow_redirects", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.postBodyRaw", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.auto_redirects", false));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.use_keepalive", true));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.DO_MULTIPART_POST", false));
httpSamplerProxy.setProperty(new StringProperty("TestElement.gui_class", "org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.test_class", "org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.name", "HTTP Request"));
httpSamplerProxy.setProperty(new StringProperty("TestElement.enabled", "true"));
httpSamplerProxy.setProperty(new BooleanProperty("HTTPSampler.postBodyRaw", true));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.embedded_url_re", ""));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.connect_timeout", ""));
httpSamplerProxy.setProperty(new StringProperty("HTTPSampler.response_timeout", ""));
return httpSamplerProxy;
}
/***
* 创建线程组
* @param loopController 循环控制器
* @param numThreads 线程数量
* @return
*/
private static ThreadGroup getThreadGroup(LoopController loopController, int numThreads) {
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setNumThreads(numThreads);
threadGroup.setRampUp(1);
threadGroup.setDelay(0);
threadGroup.setDuration(0);
threadGroup.setProperty(new StringProperty(ThreadGroup.ON_SAMPLE_ERROR, "continue"));
threadGroup.setScheduler(false);
threadGroup.setName("回放流量");
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
threadGroup.setProperty(new BooleanProperty(TestElement.ENABLED, true));
threadGroup.setProperty(new TestElementProperty(ThreadGroup.MAIN_CONTROLLER, loopController));
return threadGroup;
}
private static LoopController getLoopController() {
LoopController loopController = new LoopController();
loopController.setContinueForever(false);
loopController.setProperty(new StringProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()));
loopController.setProperty(new StringProperty(TestElement.TEST_CLASS, LoopController.class.getName()));
loopController.setProperty(new StringProperty(TestElement.NAME, "循环控制器"));
loopController.setProperty(new StringProperty(TestElement.ENABLED, "true"));
loopController.setProperty(new StringProperty(LoopController.LOOPS, "1"));
return loopController;
}
private static TestPlan getTestPlan() {
TestPlan testPlan = new TestPlan("Test Plan");
testPlan.setFunctionalMode(false);
testPlan.setSerialized(false);
testPlan.setTearDownOnShutdown(true);
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setProperty(new BooleanProperty(TestElement.ENABLED, true));
testPlan.setProperty(new StringProperty(TestElement.COMMENTS, ""));
testPlan.setTestPlanClasspath("");
Arguments arguments = new Arguments();
testPlan.setUserDefinedVariables(arguments);
return testPlan;
}
/**
* 设置请求头信息
* @return
*/
private static HeaderManager getHeaderManager() {
ArrayList<TestElementProperty> headerMangerList = new ArrayList<>();
HeaderManager headerManager = new HeaderManager();
Header header = new Header("Content-Type", "application/json");
TestElementProperty HeaderElement = new TestElementProperty("", header);
headerMangerList.add(HeaderElement);
headerManager.setEnabled(true);
headerManager.setName("HTTP Header Manager");
headerManager.setProperty(new CollectionProperty(HeaderManager.HEADERS, headerMangerList));
headerManager.setProperty(new StringProperty(TestElement.TEST_CLASS, HeaderManager.class.getName()));
headerManager.setProperty(new StringProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName()));
return headerManager;
}
private static CSVDataSet getCSVDataSet(String bodyPath) {
CSVDataSet csvDataSet = new CSVDataSet();
csvDataSet.setEnabled(true);
csvDataSet.setName("body请求体");
csvDataSet.setProperty(TestElement.TEST_CLASS, CSVDataSet.class.getName());
csvDataSet.setProperty(TestElement.GUI_CLASS, TestBeanGUI.class.getName());
csvDataSet.setProperty(new StringProperty("filename", bodyPath));
csvDataSet.setProperty(new StringProperty("fileEncoding", JMETER_ENCODING));
csvDataSet.setProperty(new BooleanProperty("ignoreFirstLine", false));
csvDataSet.setProperty(new BooleanProperty("quotedData", true));
csvDataSet.setProperty(new BooleanProperty("recycle", false));
csvDataSet.setProperty(new BooleanProperty("stopThread", false));
csvDataSet.setProperty(new StringProperty("variableNames", ""));
csvDataSet.setProperty(new StringProperty("shareMode", CSVDataSetBeanInfo.getShareTags()[0]));
csvDataSet.setProperty(new StringProperty("delimiter", ","));
return csvDataSet;
}
/***
* 限制QPS设置
* @param throughputTimer
* @return
*/
private static ConstantThroughputTimer getConstantThroughputTimer(int throughputTimer) {
ConstantThroughputTimer constantThroughputTimer = new ConstantThroughputTimer();
constantThroughputTimer.setEnabled(true);
constantThroughputTimer.setName("常数吞吐量定时器");
constantThroughputTimer.setProperty(TestElement.TEST_CLASS, ConstantThroughputTimer.class.getName());
constantThroughputTimer.setProperty(TestElement.GUI_CLASS, TestBeanGUI.class.getName());
constantThroughputTimer.setCalcMode(ConstantThroughputTimer.Mode.AllActiveThreads.ordinal());
constantThroughputTimer.setProperty(new IntegerProperty("calcMode", ConstantThroughputTimer.Mode.AllActiveThreads.ordinal()));
DoubleProperty doubleProperty = new DoubleProperty();
doubleProperty.setName("throughput");
doubleProperty.setValue(throughputTimer * 60f);
constantThroughputTimer.setProperty(doubleProperty);
return constantThroughputTimer;
}
}
生成的jmx文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.3">
<org.apache.jorphan.collections.HashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
<stringProp name="TestPlan.comments"></stringProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</TestPlan>
<org.apache.jorphan.collections.HashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="回放流量" enabled="true">
<intProp name="ThreadGroup.num_threads">500</intProp>
<intProp name="ThreadGroup.ramp_time">1</intProp>
<longProp name="ThreadGroup.delay">0</longProp>
<longProp name="ThreadGroup.duration">0</longProp>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">1</stringProp>
</elementProp>
</ThreadGroup>
<org.apache.jorphan.collections.HashTree>
<ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="常数吞吐量定时器" enabled="true">
<intProp name="calcMode">1</intProp>
<doubleProp>
<name>throughput</name>
<value>1200.0</value>
<savedValue>0.0</savedValue>
</doubleProp>
</ConstantThroughputTimer>
<org.apache.jorphan.collections.HashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
<collectionProp name="Arguments.arguments">
<elementProp name="" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">${body}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain">localhost</stringProp>
<stringProp name="HTTPSampler.port">8088</stringProp>
<stringProp name="HTTPSampler.protocol">http</stringProp>
<stringProp name="HTTPSampler.path">/mongo/insert</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>
<org.apache.jorphan.collections.HashTree>
<ResultCollector guiclass="SummaryReport" testname="汇总报告" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>true</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<org.apache.jorphan.collections.HashTree/>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="body请求体" enabled="true">
<stringProp name="filename">/Users/liufei/Downloads/jmter/my_replay_data1037568383157994444.csv</stringProp>
<stringProp name="fileEncoding">UTF-8</stringProp>
<boolProp name="ignoreFirstLine">false</boolProp>
<boolProp name="quotedData">true</boolProp>
<boolProp name="recycle">false</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames"></stringProp>
<stringProp name="shareMode">shareMode.all</stringProp>
<stringProp name="delimiter">,</stringProp>
</CSVDataSet>
<org.apache.jorphan.collections.HashTree/>
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
<collectionProp name="HeaderManager.headers">
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Content-Type</stringProp>
<stringProp name="Header.value">application/json</stringProp>
</elementProp>
</collectionProp>
</HeaderManager>
<org.apache.jorphan.collections.HashTree/>
<ResultCollector guiclass="ViewResultsFullVisualizer" testname="察看结果树" enabled="true">
<boolProp name="ResultCollector.error_logging">true</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>true</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename">/Users/liufei/Downloads/jmter/replay_result.log</stringProp>
</ResultCollector>
<org.apache.jorphan.collections.HashTree/>
</org.apache.jorphan.collections.HashTree>
</org.apache.jorphan.collections.HashTree>
</org.apache.jorphan.collections.HashTree>
</org.apache.jorphan.collections.HashTree>
</jmeterTestPlan>
使用jmter图形化界面打开