zoukankan      html  css  js  c++  java
  • 定制JMeter取样器

    • JMeter运行你区定义自己的取样器sampler,方法很简单,只需继承类org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient,并重写若干方法即可。

    • 首先,创建一个maven项目,并加入jmeter相关的依赖包:

     1 <dependencies>
     2     <dependency>
     3         <groupId>org.apache.jmeter</groupId>
     4         <artifactId>ApacheJMeter</artifactId>
     5         <version>2.10</version>
     6     </dependency>
     7     <dependency>
     8         <groupId>org.apache.jmeter</groupId>
     9         <artifactId>ApacheJMeter_core</artifactId>
    10         <version>2.10</version>
    11     </dependency>
    12     <dependency>
    13         <groupId>org.apache.jmeter</groupId>
    14         <artifactId>ApacheJMeter_http</artifactId>
    15         <version>2.10</version>
    16     </dependency>
    17     <dependency>
    18         <groupId>org.apache.jmeter</groupId>
    19         <artifactId>ApacheJMeter_java</artifactId>
    20         <version>2.10</version>
    21     </dependency>
    22 </dependencies>
    • 然后,创建一个类,继承自AbstractJavaSamplerClient,并重写setupTest、teardownTest、runTest与getDefaultParameters方法即可

    • 代码示例如下:

     1 package pengliu.me.jmeter.plugins;
     2 
     3 import org.apache.jmeter.config.Arguments;
     4 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
     5 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
     6 import org.apache.jmeter.samplers.SampleResult;
     7 import org.apache.jorphan.logging.LoggingManager;
     8 import org.apache.log.Logger;
     9 
    10 import java.util.Iterator;
    11 import java.util.Random;
    12 
    13 public class MySampler extends AbstractJavaSamplerClient
    14 {
    15     private static final Logger log = LoggingManager.getLoggerForClass();
    16 
    17     @Override
    18     public void setupTest(JavaSamplerContext context)
    19     {
    20         Iterator<String> it = context.getParameterNamesIterator();
    21         while (it.hasNext())
    22         {
    23             String paramName =  it.next();
    24             this.log.info(String.format("-----------------paramName: %s, paramValue: %s-----------------",
    25                     paramName,
    26                     context.getParameter(paramName)));
    27         }
    28 
    29         this.log.info(String.format("-----------------Get param 'name' from JMeter: %s-----------------",
    30                 context.getParameter("name", "Default Name")));
    31         this.log.info(String.format("-----------------Current Thread Id: %s, Start 'setupTest(JavaSamplerContext context)'--------------------",
    32                 Thread.currentThread().getId()));
    33     }
    34 
    35     @Override
    36     public void teardownTest(JavaSamplerContext context)
    37     {
    38         this.log.info(String.format("-----------------Current Thread Id: %s, Start 'teardownTest(JavaSamplerContext context)'--------------------",
    39                 Thread.currentThread().getId()));
    40     }
    41 
    42     public SampleResult runTest(JavaSamplerContext javaSamplerContext)
    43     {
    44         SampleResult result = new SampleResult();
    45         result.sampleStart();
    46         try
    47         {
    48             Random r = new Random();
    49             long sleepTime = (long)r.nextInt(5000);
    50             this.log.info(String.format("-----------------Current Thread Id: %s, Running Test, sleep time is %s--------------------",
    51                     Thread.currentThread().getId(),
    52                     sleepTime));
    53             Thread.sleep(sleepTime);
    54 
    55             if(sleepTime%2 == 0)
    56             {
    57                 throw new Exception("--------This is my exception from runTest!!!---------");
    58             }
    59 
    60             result.sampleEnd();
    61             result.setSuccessful(true);
    62             result.setSampleLabel("My Lable: SUCCESS: " + Thread.currentThread().getId());
    63         }
    64         catch (Throwable e)
    65         {
    66             result.sampleEnd();
    67             result.setSuccessful(false);
    68             result.setSampleLabel("My Lable: FAIL: " + Thread.currentThread().getId());
    69 
    70             e.printStackTrace();
    71         }
    72 
    73         return result;
    74     }
    75 
    76     @Override
    77     public Arguments getDefaultParameters() {
    78 
    79         Arguments params = new Arguments();
    80 
    81         params.addArgument("name", "edw");
    82 
    83         return params;
    84     }
    85 }
    • 其中setupTest与teardownTest方法,在一个线程只被执行一次,无论此Thread Group配置的Loop Count是多少,每个线程只运行一次这两个方法。
    • 其中runTest方法,如果一个线程配置了多次的Loop Count,那么此runTest就会运行多次
    • 其中getDefaultParameters方法,返回的是JMeter界面的参数列表,如下图:
    • 使用”mvn package”命令打包上面的sampler:

    • 将打包好的jar包放到JMeter的lib/ext目录下:

     

    • 启动JMeter, 并加入一个Java Request的sampler: 

     

    • Classname选择代码中自定义的sampler类: 
    • 配置Thread Group,线程数为2,循环数为5: 

    • 选中Java Request这个sampler,可以设置参数name的值

    • 开始执行后,JMeter会产生两个线程,每个线程都跑只跑一遍setupTest与teardownTest方法,但会跑5遍runTest方法
    • 查看JMeter的日志输出:

    • 查看”View Results in Table”中的结果:

  • 相关阅读:
    java布尔运算中的短路运算
    java基本数据类型和引用数据类型
    人工智能,自然界四大奥秘之一
    关于PHP导出数据超时的优化
    IDEA 生成返回值对象快捷键(GoLand,pycharm)
    Windows系统Git安装教程(详解Git安装过程)
    电脑锁屏壁纸, 时钟屏保
    常用分布函数的方差和期望机及其性质
    Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
    JavaWeb中编码问题的解决办法(在客户端和服务器之间传入或响应数据后中文乱码; cookie的乱码问题) || Cookie和Session
  • 原文地址:https://www.cnblogs.com/liupengblog/p/5345759.html
Copyright © 2011-2022 走看看