JMETER通过java代码通过代码/ JMETER API实现示例进行负载测试
本教程试图解释Jmeter的基本设计,功能和用法,Jmeter是用于在应用程序上执行负载测试的优秀工具。通过使用jmeter GUI,我们可以
根据我们的要求为请求创建测试样本并执行具有多个用户负载的样本。
由于jmeter工具是使用JAVA完全开发的,我们可以编写java代码来做同样的事情而不使用jmeter的GUI,不建议实现java代码进行负载测试,它只是一个概念证明来编写使用jmeter库通过java代码进行采样。
Jmeter作为非常好的文档/ API,在浏览了jmeter源代码和其他参考资源之后,编写了以下示例代码。
预先决条件:
JMeter的JAVA> = 1.6Eclipse或net beans编辑器
在理解以下代码之前,我们必须具备jmeter如何工作的基本知识。
最初我们需要加载jmeter属性,这些属性将由jmeter类/库在代码的后期使用
JMETERJAVA >= 1.6Eclipse or net beans editor
//JMeter Engine
StandardJMeterEngine jmeter = new StandardJMeterEngine();
//JMeter initialization (properties, log levels, locale, etc)
JMeterUtils.setJMeterHome(jmeterHome.getPath());
JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());
JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
JMeterUtils.initLocale();
1.创建“测试计划”对象和JOrphan HashTree
//JMeter Test Plan, basically JOrphan HashTree
HashTree testPlanTree = new HashTree();
// Test Plan
TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());
2.采样器:添加“Http Sample”对象
采样器告诉JMeter将请求发送到服务器并等待响应。它们按照它们在树中出现的顺序进行处理。控制器可用于修改采样器的重复次数
// First HTTP Sampler - open uttesh.com
HTTPSamplerProxy examplecomSampler = new HTTPSamplerProxy();
examplecomSampler.setDomain("uttesh.com");
examplecomSampler.setPort(80);
examplecomSampler.setPath("/");
examplecomSampler.setMethod("GET");
examplecomSampler.setName("Open uttesh.com");
examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());
3.Loop控制器
循环控制器将执行循环迭代声明的样本数。
// Loop Controller
LoopController loopController = new LoopController();
loopController.setLoops(1);
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();
4.Thread Group
线程组元素是任何测试计划的起点。所有控制器和采样器必须位于线程组下。其他元素,例如Listeners,可以直接放在测试计划下,在这种情况下,它们将应用于所有线程组。顾名思义,线程组元素控制JMeter用于执行测试的线程数。
// Thread Group
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("Sample Thread Group");
threadGroup.setNumThreads(1);
threadGroup.setRampUp(1);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());
5. 将采样器,控制器......等添加到测试计划中
// Construct Test Plan from previously initialized elements
testPlanTree.add(testPlan);
HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
threadGroupHashTree.add(examplecomSampler);
// save generated test plan to JMeter's .jmx file format
SaveService.saveTree(testPlanTree, new FileOutputStream("report\\jmeter_api_sample.jmx"));
上面的代码将生成我们从代码中编写的jmeter脚本。
5.添加摘要和报告
//add Summarizer output to get test progress in stdout like:
// summary = 2 in 1.3s = 1.5/s Avg: 631 Min: 290 Max: 973 Err: 0 (0.00%)
Summariser summer = null;
String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
if (summariserName.length() > 0) {
summer = new Summariser(summariserName);
}
// Store execution results into a .jtl file, we can save file as csv also
String reportFile = "report\\report.jtl";
String csvFile = "report\\report.csv";
ResultCollector logger = new ResultCollector(summer);
logger.setFilename(reportFile);
ResultCollector csvlogger = new ResultCollector(summer);
csvlogger.setFilename(csvFile);
testPlanTree.add(testPlanTree.getArray()[0], logger);
testPlanTree.add(testPlanTree.getArray()[0], csvlogger);
Finally Execute the test
// Run Test Plan
jmeter.configure(testPlanTree);
jmeter.run(); System.out.println("Test completed. See " + jmeterHome + slash + "report.jtl file for results");
System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "jmeter_api_sample.jmx");
System.exit(0);
POC的完整源代码可以在GitHub上找到。点击这里
| import java.io.File; | |
| import java.io.FileOutputStream; | |
| import org.apache.jmeter.config.Arguments; | |
| import org.apache.jmeter.config.gui.ArgumentsPanel; | |
| import org.apache.jmeter.control.LoopController; | |
| import org.apache.jmeter.control.gui.LoopControlPanel; | |
| import org.apache.jmeter.control.gui.TestPlanGui; | |
| import org.apache.jmeter.engine.StandardJMeterEngine; | |
| import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui; | |
| import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy; | |
| import org.apache.jmeter.reporters.ResultCollector; | |
| import org.apache.jmeter.reporters.Summariser; | |
| import org.apache.jmeter.save.SaveService; | |
| import org.apache.jmeter.testelement.TestElement; | |
| import org.apache.jmeter.testelement.TestPlan; | |
| import org.apache.jmeter.threads.ThreadGroup; | |
| import org.apache.jmeter.threads.gui.ThreadGroupGui; | |
| import org.apache.jmeter.util.JMeterUtils; | |
| import org.apache.jorphan.collections.HashTree; | |
| /** | |
| * | |
| * @author Uttesh Kumar T.H. | |
| */ | |
| public class JMeterAPISampleTest { | |
| public static void main(String[] argv) throws Exception { | |
| //Set jmeter home for the jmeter utils to load | |
| File jmeterHome = new File("E:\\rivetsys\\servers\\apache-jmeter-2.11\\apache-jmeter-2.11\\apache-jmeter-2.11"); | |
| String slash = System.getProperty("file.separator"); | |
| if (jmeterHome.exists()) { | |
| File jmeterProperties = new File(jmeterHome.getPath() + slash + "bin" + slash + "jmeter.properties"); | |
| if (jmeterProperties.exists()) { | |
| //JMeter Engine | |
| StandardJMeterEngine jmeter = new StandardJMeterEngine(); | |
| //JMeter initialization (properties, log levels, locale, etc) | |
| JMeterUtils.setJMeterHome(jmeterHome.getPath()); | |
| JMeterUtils.loadJMeterProperties(jmeterProperties.getPath()); | |
| JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level | |
| JMeterUtils.initLocale(); | |
| // JMeter Test Plan, basically JOrphan HashTree | |
| HashTree testPlanTree = new HashTree(); | |
| // First HTTP Sampler - open uttesh.com | |
| HTTPSamplerProxy examplecomSampler = new HTTPSamplerProxy(); | |
| examplecomSampler.setDomain("uttesh.com"); | |
| examplecomSampler.setPort(80); | |
| examplecomSampler.setPath("/"); | |
| examplecomSampler.setMethod("GET"); | |
| examplecomSampler.setName("Open uttesh.com"); | |
| examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); | |
| examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName()); | |
| // Loop Controller | |
| LoopController loopController = new LoopController(); | |
| loopController.setLoops(1); | |
| loopController.setFirst(true); | |
| loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName()); | |
| loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName()); | |
| loopController.initialize(); | |
| // Thread Group | |
| ThreadGroup threadGroup = new ThreadGroup(); | |
| threadGroup.setName("Sample Thread Group"); | |
| threadGroup.setNumThreads(1); | |
| threadGroup.setRampUp(1); | |
| threadGroup.setSamplerController(loopController); | |
| threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName()); | |
| threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName()); | |
| // Test Plan | |
| TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code"); | |
| testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName()); | |
| testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName()); | |
| testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement()); | |
| // Construct Test Plan from previously initialized elements | |
| testPlanTree.add(testPlan); | |
| HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup); | |
| threadGroupHashTree.add(examplecomSampler); | |
| // save generated test plan to JMeter's .jmx file format | |
| SaveService.saveTree(testPlanTree, new FileOutputStream("report\\jmeter_api_sample.jmx")); | |
| //add Summarizer output to get test progress in stdout like: | |
| // summary = 2 in 1.3s = 1.5/s Avg: 631 Min: 290 Max: 973 Err: 0 (0.00%) | |
| Summariser summer = null; | |
| String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary"); | |
| if (summariserName.length() > 0) { | |
| summer = new Summariser(summariserName); | |
| } | |
| // Store execution results into a .jtl file, we can save file as csv also | |
| String reportFile = "report\\report.jtl"; | |
| String csvFile = "report\\report.csv"; | |
| ResultCollector logger = new ResultCollector(summer); | |
| logger.setFilename(reportFile); | |
| ResultCollector csvlogger = new ResultCollector(summer); | |
| csvlogger.setFilename(csvFile); | |
| testPlanTree.add(testPlanTree.getArray()[0], logger); | |
| testPlanTree.add(testPlanTree.getArray()[0], csvlogger); | |
| // Run Test Plan | |
| jmeter.configure(testPlanTree); | |
| jmeter.run(); | |
| System.out.println("Test completed. See " + jmeterHome + slash + "report.jtl file for results"); | |
| System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "jmeter_api_sample.jmx"); | |
| System.exit(0); | |
| } | |
| } | |
| System.err.println("jmeterHome property is not set or pointing to incorrect location"); | |
| System.exit(1); | |
| } | |
| } |
JMETER通过java代码通过代码/ JMETER API实现示例进行负载测试的更多相关文章
- jmeter经验---java 追加写入代码一例
最近最项目参数化的时候用到,场景是这样的,需要测试A和B两个接口,其中B接口传入的参数必须是传递给A接口过的,所以整理一个思路就是: 1. 正常调用A接口,但是将传递给A接口的参数保存到文本里,此处要 ...
- JMeter脚本java代码String数组要写成String[] args,不能写成String args[],否则报错。
JMeter脚本java代码String数组中括号要写在类型关键字后面,不能写在变量名后面.
- jmeter 的java请求代码在main方法里面执行
1.新建一个java请求执行加法类 public class TestDemo { public int Tdemo(int a,int b){ int sum = 0; sum = a+b; ret ...
- 自定义编写jmeter的Java测试代码
我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...
- JMeter扩展Java请求实现WebRTC本地音视频推流压测脚本
WebRTC是Web Real-Time Communication缩写,指网页即时通讯,是一个支持Web浏览器进行实时语音或视频对话的API,实现了基于网页的视频会议,比如声网的Agora Web ...
- Jmeter发送Java请求
1.创建一个Java工程 2.把Jmeter的lib\ext目录下的ApacheJMeter_java.jar.ApacheJMeter_core.jar文件添加进该项目的Build Path 3.创 ...
- jmeter 与 java http
jmeter 如果对java代码进行测试 1.eclips中创建一个项目,且写一个待测试的简单java代码 2.将jmeter路径下 x:\xx\lxx\Dowxxxxxx\apache-jmeter ...
- JMeter学习(十八)JMeter测试Java(二)
实例: 服务为:将输入的两个参数通过IO存入文件: 1.打开MyEclipse,编写Java代码 服务: package test; import java.io.File; import java. ...
- 【转】jmeter 进行java request测试
本周使用jmeter进行一个远程dubbo接口的性能测试,因为没有访问页面,本来开发可以写一个页面,进行http请求的调用,不过已经看到jmeter可以直接对java request进行测试,所以尝试 ...
随机推荐
- php设计模式之--组合模式
php组合模式主要用于上下级关系,可以新增叶子和树枝,分析如下代码即可明白组合模式的含义: <?php header('Content-Type:text/html;charset=utf-8' ...
- [zjoi]青蛙的约会_扩展欧几里德
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方那里跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- ansible-playbook unarchive模块
先 进行 pause模块的 记录: pause 在playbook执行的过程中暂停一定时间或者提示用户进行某些操作 常用参数: minutes:暂停多少分钟 seconds:暂停多少秒 prompt ...
- Ueditor文本编辑工具栏自定义
1.找到 ueditor.config.js 文件 2.在 toolbars 数组内进行删减,添加 , toolbars: [[ 'fullscreen', 'source', '|', 'undo' ...
- 并不对劲的bzoj1095:p2056:[ZJOI2007]捉迷藏
题目大意 给一\(n\)(\(n\leq10^5\))个点的一棵树,每个点有可能是黑色或白色,一开始所有点都是黑色,支持以下两种操作: 1.改变一个点的颜色 2.询问最远的黑色点对的距离 题解 据说是 ...
- Dom4j 操作文件,文件相对路径的问题
System.out.println("xml路径:"+ServletActionContext.getServletContext().getRealPath("/zx ...
- codevs1068乌龟棋
codevs1068乌龟棋 1068 乌龟棋 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Descrip ...
- bzoj4289
最短路 很容易想到边和边之间连边,但是这样菊花图就完蛋了 我们想办法优化一下,能不能不要每条边都连. 考虑查分,把一个点的出边串起来,这样就行了,每条无向边拆成两条就能保证了 #include< ...
- bzoj3168
二分图+矩阵求逆 既然我们考虑b能替换哪些a,那么我们自然要得出b被哪些a表示,这里我们设一个矩阵C,那么C*A = B 为什么呢?直接A*C = B是不可行的,因为都是行向量,不能直接乘,那么我们转 ...