Jmeter

注:打包的时候不要把依赖打进去

一: 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 可自己实现扩展

文档说明.

Icon

JavaSamplerClient

This interface defines the interactions between the JavaSampler and external Java programs which can be executed by JMeter. Any Java class which wants to be executed as a JMeter test must implement this interface (either directly or indirectly through AbstractJavaSamplerClient).

When possible, Java tests should extend AbstractJavaSamplerClient rather than implementing JavaSamplerClient directly. This should protect your tests from future changes to the interface. While it may be necessary to make changes to the JavaSamplerClient interface from time to time (therefore requiring changes to any implementations of this interface), we intend to make this abstract class provide reasonable default implementations of any new methods so that subclasses do not necessarily need to be updated for new versions. Implementing JavaSamplerClient directly will continue to be supported for cases where extending this class is not possible (for example, when the client class is already a subclass of some other class).

Icon

AbstractJavaSamplerClient

An abstract implementation of the JavaSamplerClient interface. This implementation provides default implementations of most of the methods in the interface, 
as well as some convenience methods, in order to simplify development of JavaSamplerClient implementations.

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):综合结果指标

Icon

综合指标解释

#Samples:总请求数
Average:平均响应时间
Median:中位数,50% 用户的响应时间
90% Line:90% 用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second)
KB/Sec:每秒从服务器端接收到的数据量

原文地址:https://www.cnblogs.com/aiguang/p/3571477.html