注:打包的时候不要把依赖打进去
一: 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,则填写\t
Recycle on EOF: True=当读取文件到结尾时,再重头读取文件 False=当读取文件到结尾时,停止读取文件
Stop thread on EOF: 当Recycle on EOF一项为False时起效;True=当读取文件到结尾时,停止进程
引入csn设置的"Vaiable Names"参数
d:添加监听器 :表格结果,聚合报告,图形结果
e:运行查看结果:
(1)表格结果:显示每个线程记录的数据,状态等.
(2)图形结果:压测整体趋势.
(3):综合结果指标