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);
   
   
  }
  }
view raw JMeterAPISampleTest.java hosted with ❤ by  GitHub


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM