注:打包的时候不要把依赖打进去
一: JMeter-Java-Sampler介绍
1:JMeter介绍
JMeter是Apache下一个类似LoadRunner的开源性能测试项目,可用用来对静态的和动态的资源(如:files, Servlets, Perl scripts, Java Request, Data Bases and Queries, FTP Servers)的性能进行测试.
这里只重点介绍Java-Request
官方网站 http://jmeter.apache.org/
2:JMeter基本概念
1) 介绍下基本概念便于快速上手
测试计划(Test Plan): 使用JMeter进行测试的起点,是其它JMeter测试元件的容器
线程组(Thread Group):代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。
取样器(Sampler):模拟各种请求。所有实际的测试任务都由取样器承担,存在很多种请求。如:HTTP 、ftp请求等等.
监听器(Listener):负责收集测试结果,同时也被告知了结果显示的方式。功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等。
断言(Assertions): 用于来判断请求响应的结果是否如用户所期望,是否正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。用于限制测试的有效性.
定时器(Timer): 负责定义请求(线程)之间的延迟间隔,模拟对服务器的连续请求。
逻辑控制器(Logic Controller): 允许自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列.
配置元件(Configuration Element): 维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容.
前置处理器/后置处理器: 负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。
2)JMeter都是已容器+数据够方式组合.
如图:
二:编写压力采样器(Sampler)
1:Java-Sampler 类结构
如图: 根据AbstractJavaSamplerClient/JavaSamplerClient 可自己实现扩展
文档说明.
2:JavaSampler结构说明
SpaceServiceLoadMeter 代码示例
public class SpaceServiceLoadMeter extends AbstractJavaSamplerClient { private SpaceService spaceService = SpaceServiceFactory.getSpaceService(); /** * 设置各种参数,这些参数可从GUI处获取,也可以设置合适的默认值。 * 这些默认值在GUI扫描的时候,会自动出现在界面上,以供必要的调整和优化 * * @return */ @Override public Arguments getDefaultParameters() { Arguments arguments = new Arguments(); arguments.addArgument( "p" , "" ); arguments.addArgument( "y" , "" ); arguments.addArgument( "u" , "" ); return arguments; } /** * 数据准备工作,方法在JMeter初始化的每个线程都会执行一遍,不是全局仅一遍 * * @param context */ @Override public void setupTest(JavaSamplerContext context) { } /** * 测试代码调用,重点. * * @param context * @return */ @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult sr = new SampleResult(); // Start sr.sampleStart(); try { String y = context.getParameter( "y" ); String u = context.getParameter( "u" ); String p = context.getParameter( "p" ); /** * Start~End内的代码会被JMeter * 纳入计算吞吐量的范围内, */ getLogger().warn( "### y=" + y + ",u=" + u + "p=" + p + " ###" ); BlogRule rule = new BlogRule(); rule.setU(u); rule.setY(y); rule.setP(p); List<BlogVideo> list = spaceService.recommend(rule); if (list != null && list.size() == 60 ) { /** * True/False可按测试逻辑传值 * JMeter会对失败次数做出统计 */ sr.setSuccessful( true ); } else { sr.setSuccessful( false ); } } catch (Exception e) { getLogger().error(e.getMessage(), e); sr.setSuccessful( false ); } finally { // End sr.sampleEnd(); } return sr; } /** * 测试结束清理方法,全局调用一次 * * @param context */ @Override public void teardownTest(JavaSamplerContext context) { } } |
三:运行压力测试
1:使用maven生成jar包
mvn clean package |
2:拷贝待测试jar包和依赖环境.
如图,拷贝到${meter_home}/lib/ext 下.
3:配置运行Jmeter
a:建立测试计划并新建线程组
设置线程数:1000,
设置 Ramp-up period: 线程建立间隔 . 建议值: 线程数 / 预估QPS (不要设为0)
b:线程组下建立Java请求
JMeter ClassLoader自动扫描${meter_home}/lib/ext 下的JavaSamplerClient实现,根据getDefaultParameters 方法自动识别出参数
c:添加参数数据文件
通过添加配置元件-CSV Data Set Config从外部文件中导入参数
Filename: 可直接只填名字,默认位置为测试计划配置文件(jmx)所在路径
File encoding: 有中文时需要填,一般不用
Vaiable Names: 文件中各列所表示的参数项;各参数项之间利用逗号分隔;参数项的名称应该与HTTP Request中的参数项一致
Delimiter:如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写
Recycle on EOF: True=当读取文件到结尾时,再重头读取文件 False=当读取文件到结尾时,停止读取文件
Stop thread on EOF: 当Recycle on EOF一项为False时起效;True=当读取文件到结尾时,停止进程
引入csn设置的"Vaiable Names"参数
d:添加监听器 :表格结果,聚合报告,图形结果
e:运行查看结果:
(1)表格结果:显示每个线程记录的数据,状态等.
(2)图形结果:压测整体趋势.
(3):综合结果指标