本教程试图解释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); | |
} | |
} |