如何从Java程序创建和运行Apache JMeter Test Scripts?

我想使用Apache JMeter提供的API从Java程序创建和运行测试脚本。 我已经理解了ThreadGroup和Samplers的基础知识。 我可以使用JMeter API在我的Java类中创建它们。

ThreadGroup threadGroup = new ThreadGroup(); LoopController lc = new LoopController(); lc.setLoops(5); lc.setContinueForever(true); threadGroup.setSamplerController(lc); threadGroup.setNumThreads(5); threadGroup.setRampUp(1); HTTPSampler sampler = new HTTPSampler(); sampler.setDomain("localhost"); sampler.setPort(8080); sampler.setPath("/jpetstore/shop/viewCategory.shtml"); sampler.setMethod("GET"); Arguments arg = new Arguments(); arg.addArgument("categoryId", "FISH"); sampler.setArguments(arg); 

但是,我不知道如何创建一个组合线程组和采样器的测试脚本,然后从同一个程序执行它。 有任何想法吗?

如果我理解正确,您希望以编程方式从Java程序中运行整个测试计划。 就个人而言,我发现创建测试计划.JMX文件并在JMeter非GUI模式下运行更容易:)

这是一个简单的Java示例,它基于原始问题中使用的控制器和采样器。

 import org.apache.jmeter.control.LoopController; import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jmeter.protocol.http.sampler.HTTPSampler; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.TestPlan; import org.apache.jmeter.threads.SetupThreadGroup; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.collections.HashTree; public class JMeterTestFromCode { public static void main(String[] args){ // Engine StandardJMeterEngine jm = new StandardJMeterEngine(); // jmeter.properties JMeterUtils.loadJMeterProperties("c:/tmp/jmeter.properties"); HashTree hashTree = new HashTree(); // HTTP Sampler HTTPSampler httpSampler = new HTTPSampler(); httpSampler.setDomain("www.google.com"); httpSampler.setPort(80); httpSampler.setPath("/"); httpSampler.setMethod("GET"); // Loop Controller TestElement loopCtrl = new LoopController(); ((LoopController)loopCtrl).setLoops(1); ((LoopController)loopCtrl).addTestElement(httpSampler); ((LoopController)loopCtrl).setFirst(true); // Thread Group SetupThreadGroup threadGroup = new SetupThreadGroup(); threadGroup.setNumThreads(1); threadGroup.setRampUp(1); threadGroup.setSamplerController((LoopController)loopCtrl); // Test plan TestPlan testPlan = new TestPlan("MY TEST PLAN"); hashTree.add("testPlan", testPlan); hashTree.add("loopCtrl", loopCtrl); hashTree.add("threadGroup", threadGroup); hashTree.add("httpSampler", httpSampler); jm.configure(hashTree); jm.run(); } } 

依赖

这些是基于JMeter 2.9和使用的HTTPSampler所需的最小JAR。 其他采样器很可能具有不同的库JAR依赖性。

  • ApacheJMeter_core.jar
  • jorphan.jar
  • 阿瓦隆框架-4.1.4.jar
  • ApacheJMeter_http.jar
  • 共享记录-1.1.1.jar
  • logkit-2.0.jar
  • 口 – 2.0.8.jar
  • 公地IO-2.2.jar
  • 公地lang3-3.1.jar

注意

  • 在首次从JMeter安装/ bin目录复制之后,我还在Windows上的c:\ tmp中修改了jmeter.properties的路径。
  • 我不确定如何为HTTPSampler设置转发代理。
 package jMeter; 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; public class JMeterFromScratch { public static void main(String[] argv) throws Exception { String jmeterHome1 = "/home/ksahu/apache-jmeter-2.13"; File jmeterHome=new File(jmeterHome1); // JMeterUtils.setJMeterHome(jmeterHome); 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 ie DEBUG level JMeterUtils.initLocale(); // JMeter Test Plan, basically JOrphan HashTree HashTree testPlanTree = new HashTree(); // First HTTP Sampler - open example.com HTTPSamplerProxy examplecomSampler = new HTTPSamplerProxy(); examplecomSampler.setDomain("www.google.com"); examplecomSampler.setPort(80); examplecomSampler.setPath("/"); examplecomSampler.setMethod("GET"); examplecomSampler.setName("Open example.com"); examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName()); // Second HTTP Sampler - open blazemeter.com HTTPSamplerProxy blazemetercomSampler = new HTTPSamplerProxy(); blazemetercomSampler.setDomain("www.tripodtech.net"); blazemetercomSampler.setPort(80); blazemetercomSampler.setPath("/"); blazemetercomSampler.setMethod("GET"); blazemetercomSampler.setName("Open blazemeter.com"); blazemetercomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName()); blazemetercomSampler.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("Example 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(blazemetercomSampler); threadGroupHashTree.add(examplecomSampler); // save generated test plan to JMeter's .jmx file format SaveService.saveTree(testPlanTree, new FileOutputStream(jmeterHome + slash + "example.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 String logFile = jmeterHome + slash + "example.jtl"; ResultCollector logger = new ResultCollector(summer); logger.setFilename(logFile); testPlanTree.add(testPlanTree.getArray()[0], logger); // Run Test Plan jmeter.configure(testPlanTree); jmeter.run(); System.out.println("Test completed. See " + jmeterHome + slash + "example.jtl file for results"); System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "example.jmx"); System.exit(0); } } System.err.println("jmeter.home property is not set or pointing to incorrect location"); System.exit(1); } } 

我利用JMeter Java Api和Maven依赖创建了一个简单的概念validation项目: https : //github.com/piotrbo/jmeterpoc

您可以生成JMeter项目jmx文件并从命令行执行它或直接从Java代码执行它。

由于jmx文件需要为每个TestElement存在’guiclass’属性,因此有点棘手。 要执行jmx,添加guiclass就足够了(即使值不正确)。 要在JMeter GUI中打开,需要为每个guiclass正确的值。

更令人讨厌的问题是基于条件的流量控制器。 JMeter API不会为您提供更多GUI。 您仍然需要将condition传递给IfController作为常规String 。 该字符串应包含javascript。 所以你有基于Java的项目与javascript,例如语法错误,你不会知道它,直到你执行你的性能测试:-(

可能是一个更好的替代方案来保持代码和IDE的支持而不是JMeter GUI是学习Scala并使用http://gatling.io/

在非GUI模式下运行要快得多。 制作了一个在后端模式下使用Jmeter然后解析XML文件以显示测试结果的项目。 看看这个repo- https://github.com/rohitjaryal/RESTApiAutomation.git