定制JMeter取样器
JMeter运行你区定义自己的取样器sampler,方法很简单,只需继承类org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient,并重写若干方法即可。
首先,创建一个maven项目,并加入jmeter相关的依赖包:
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter</artifactId>
<version>2.10</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>2.10</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_http</artifactId>
<version>2.10</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>2.10</version>
</dependency>
</dependencies>
然后,创建一个类,继承自AbstractJavaSamplerClient,并重写setupTest、teardownTest、runTest与getDefaultParameters方法即可
代码示例如下:
package pengliu.me.jmeter.plugins; import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger; import java.util.Iterator;
import java.util.Random; public class MySampler extends AbstractJavaSamplerClient
{
private static final Logger log = LoggingManager.getLoggerForClass(); @Override
public void setupTest(JavaSamplerContext context)
{
Iterator<String> it = context.getParameterNamesIterator();
while (it.hasNext())
{
String paramName = it.next();
this.log.info(String.format("-----------------paramName: %s, paramValue: %s-----------------",
paramName,
context.getParameter(paramName)));
} this.log.info(String.format("-----------------Get param 'name' from JMeter: %s-----------------",
context.getParameter("name", "Default Name")));
this.log.info(String.format("-----------------Current Thread Id: %s, Start 'setupTest(JavaSamplerContext context)'--------------------",
Thread.currentThread().getId()));
} @Override
public void teardownTest(JavaSamplerContext context)
{
this.log.info(String.format("-----------------Current Thread Id: %s, Start 'teardownTest(JavaSamplerContext context)'--------------------",
Thread.currentThread().getId()));
} public SampleResult runTest(JavaSamplerContext javaSamplerContext)
{
SampleResult result = new SampleResult();
result.sampleStart();
try
{
Random r = new Random();
long sleepTime = (long)r.nextInt(5000);
this.log.info(String.format("-----------------Current Thread Id: %s, Running Test, sleep time is %s--------------------",
Thread.currentThread().getId(),
sleepTime));
Thread.sleep(sleepTime); if(sleepTime%2 == 0)
{
throw new Exception("--------This is my exception from runTest!!!---------");
} result.sampleEnd();
result.setSuccessful(true);
result.setSampleLabel("My Lable: SUCCESS: " + Thread.currentThread().getId());
}
catch (Throwable e)
{
result.sampleEnd();
result.setSuccessful(false);
result.setSampleLabel("My Lable: FAIL: " + Thread.currentThread().getId()); e.printStackTrace();
} return result;
} @Override
public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("name", "edw"); return params;
}
}
- 其中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”中的结果:
定制JMeter取样器的更多相关文章
- 『动善时』JMeter基础 — 12、JMeter取样器详解:sampler
目录 1.取样器介绍 2.JMeter自带的取样器 3."HTTP请求"为例介绍一下取样器 (1)HTTP Request: (2)Web服务器: (3)HTTP请求: (4)同请 ...
- 【Python】使用Beautiful Soup等三种方式定制Jmeter测试脚本
背景介绍 我们在做性能调优时,时常需要根据实际压测的情况,调整线程组的参数,比如循环次数,线程数,所有线程启动的时间等. 如果是在一台Linux机器上,就免不了在本机打开图形页面修改,然后最后传递到压 ...
- python csv 数据切割定制jmeter数据
需求压测随机抽取10w数据中自定义区间的指定数量数据进行压测: jmeter csv/txt配置: 需要获取{data: [${myList}] } jmeter需要数据类型 获取展读取csv数据 ...
- Jmeter入门(5)- jmeter取样器的HTTP请求
一.HTTP管理器 位置:线程组右键 ==> 添加 ==> 配置元件 1.HTTP信息头管理器 添加测试计划 添加线程组 添加HTTP请求 添加请求头(HTTP信息头管理器) 设置请求参数 ...
- 一步一步和我学Apache JMeter
一. Apache JMeter介绍 1. Apache JMeter是什么? Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量 ...
- jmeter工具应用1
1.Jmeter介绍 Apache JMeter 是Apache组织的开放源代码项目,是一个纯Java桌面应用,用于压力测试和性能测量.它最初被设计用于Web应用测试但后来扩展到其它测试领域. 操 ...
- JMeter:生成漂亮的多维度的HTML报告
JMeter:生成漂亮的多维度的HTML报告我们做性能测试的时候会经常使用一些性能测试工具,我个人比较喜欢Jmeter这个工具,但是JMeter这个工具在生成测试报告方面一直有所欠缺.但是JMeter ...
- jmeter --- 测试计划里的元件
1.线程组 线程组元件是任何一个测试计划的开始点.在一个测试计划中的所有元件都必须在某个线程组下.顾名思义,线程组元件控制JMeter执行你的测试计划时候使用的线程数量.对线程组的控制允许你: 设置线 ...
- JMETER学习宝典
1. 简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序).它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Ja ...
随机推荐
- SpringBean生命周期
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- 32位机,CPU是如何利用段寄存器寻址的
转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不 ...
- 参数传递中编码问题(Get/Post 方式)(二)
form有2中方法把数据提交给服务器,get 和post ,分别说下吧.(一)get 提交1.首先说下客户端(浏览器)的form表单用get 方法是如何将数据编码后提交给服务器端的吧. 对于get 方 ...
- Py修行路 python基础 (五)三元运算 字符编码 元组 集合 三级菜单优化!
三元运算 条件判断不能加冒号: a=3 b=5 c=a if a<b else b oct() 转成八进制的简写:16进制 标志:BH为后缀或是0x为前缀hex() 转成16进制 元组 跟列表是 ...
- Select/Poll/Epoll异步IO
IO多路复用 同步io和异步io,阻塞io和非阻塞io分别是什么,有什么样的区别? io模式 对于一次io 访问(以read为例),数据会先拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷 ...
- Python 中的 is 和 == 编码和解码
一 is 与 == 区别 == 比较 比较的是值 例如: a = 'alex' b = 'alex' print(a == b) #True a = 10 ...
- Cause: java.sql.SQLException: 无效的列索引
今天调试代码发现“Cause: java.sql.SQLException: 无效的列索引”,查资料得出结论如下: 1.sql串的?号用''括了起来. 例如:select* from user t ...
- 通过键盘上下键 JS事件,控制候选词的选择项
效果图 JS代码 //上下键 选择事件 searchBackgroud 为样式,只做标记,无实质样式,因为和其他样式不兼容,只能添加CSS $(document).keydown(function ( ...
- jenkins容器权限被拒绝
问题,我们从官网上面pull下jenkins后,如果直接运行容器的没问题 docker run -d -p 8080:8080 -v jenkins:latest 不过我们可能需要映射下容器内部的地址 ...
- java之yield(),sleep(),wait()区别详解-备忘笔记(转)
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...