zoukankan      html  css  js  c++  java
  • 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);
       
       
      }
      }
  • 相关阅读:
    springMVC controller输出前台提示信息
    使用ionic3开始自己的App开发之路
    async await
    mongodb安装和启动
    express框架的安装和使用
    js继承的实现方式
    node版本管理
    git提交时冲突问题解决
    css推荐
    js工具推荐
  • 原文地址:https://www.cnblogs.com/a00ium/p/10263734.html
Copyright © 2011-2022 走看看