JMeter是Apache下一个类似LoadRunner的开源性能测试项目,可用用来对静态的和动态的资源(如:files, Servlets, Perl scripts, Java Request, Data Bases and Queries, FTP Servers)的性能进行测试.
这里只重点介绍Java-Request
官方网站 http://jmeter.apache.org/
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都是已容器+数据够方式组合.
如图:
如图: 根据AbstractJavaSamplerClient/JavaSamplerClient 可自己实现扩展
文档说明.
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) { } } |
mvn clean package |
如图,拷贝到${meter_home}/lib/ext 下.
设置线程数:1000,
设置 Ramp-up period: 线程建立间隔 . 建议值: 线程数 / 预估QPS (不要设为0)
JMeter ClassLoader自动扫描${meter_home}/lib/ext 下的JavaSamplerClient实现,根据getDefaultParameters 方法自动识别出参数
通过添加配置元件-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"参数
(1)表格结果:显示每个线程记录的数据,状态等.
(2)图形结果:压测整体趋势.
(3):综合结果指标
原文:http://www.cnblogs.com/aiguang/p/3571477.html