暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Jmeter从零开始

一不小心的那些事儿 2019-05-22
273

一、从零开始

1. 下载jmeter

请在Jmeter官网下载程序包http://jmeter.apache.org/download_jmeter.cgi

2. 启动

下载完成后将其解压到本地文件夹,执行其bin目录的jmeter可执行文件

3. 安装插件
  • 下载jmeter-plugins-manager的jar包

  • 放到其lib/ext目录下

  • 重启Jmeter后点击Plugins Manager按钮,如下图

  • 进行插件选择页面,可以添加自己所需要的插件

  • 常用插件有:3 Basic Graphs、Custom Thread Groups

说明:

3 Basic Graphs 可用于添加监听TPS情况

Custom Thread Groups 可用于添加线程组时按时间阶段添加线程数

4. 创建线程组
  • 在测试计划点击右键->添加->线程组->Concurrency Thread Group,如下图:

创建完成后如下图:

  • 在创建的线程里填写相应的数值,如下图:

Target Concurrency:峰值每秒并发数
Ramp Up Time:总运行时间
Ramp-Up Stemps Count:从0到并发数峰值通过几次变化
Hold Target Rate Time:达到峰值后再持续运行时间
Hold Target Rate Time 是除出 Ramp Up Time后的时间

  • 在线程线下创建执行样本

在这里我只使用java请求方式执行,如有其它需要可按需选择执行Sampler

  • 在线程组下添加监听

在这里我选择了以下几个监听

图形结果、结果树、聚合报告、TPS结果、表格察看结果(后面讲解每个报告用途)

二、创建用例

1. 新建测试工程
  • 使用idea创建一个maven工程,具体操作请点击这里查看,我就不多讲了。工程结构如下:

  • 在新建的工程下pom.xml文件中引入Jmeter及其它需要相关jar包,如下:

 <!-- Jmeter性能测试包 -->
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>${jmeter.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-jcl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_components -->
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_components</artifactId>
            <version>${jmeter.version}</version>
            <exclusions>
                <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_java -->
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter.version}</version>
            <exclusions>
                <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.jmeter/jorphan -->
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>jorphan</artifactId>
            <version>${jmeter.version}</version>
            <exclusions>
                <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.10</version>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.kevinsawicki</groupId>
            <artifactId>http-request</artifactId>
            <version>6.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.41</version>
        </dependency>

2. 编写测试代码

  • 新建测试类实现JavaSamplerClient接口并重写runTest方法,具体代码如下:

package jemter;
import com.github.kevinsawicki.http.HttpRequest;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
/**
 * Created with jemter
 * User:mfl
 * Date:2018/7/27
 * Time:上午11:40
 */
public class SendClinetTest implements JavaSamplerClient {
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
    }
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        SampleResult result = new SampleResult();
        String url = javaSamplerContext.getParameter("url");
        result.sampleStart();
        try {
            //发送HTTP请求
            String responseString = HttpRequest.post(url).body();
            System.out.println(responseString);
            result.setSuccessful(true);
            if (responseString != null && responseString.length() > 0) {
                result.setResponseData("结果是:" + responseString, null);
                result.setDataType(SampleResult.TEXT);
            }
        } catch (Throwable e) {
            result.setSuccessful(false);
            e.printStackTrace();
        } finally {
            result.sampleEnd();// jmeter 结束统计响应时间标记
        }
        return result;
    }
    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
    }
    //设置默认参数
    @Override
    public Arguments getDefaultParameters() {
        Arguments arguments = new Arguments();
        arguments.addArgument("url", "http://172.16.1.111:8809/gateway");
        return arguments;
    }
    //本地测试
    public static void main(String[] args) {
        SendClinetTest test = new SendClinetTest();
        Arguments params = test.getDefaultParameters();
        JavaSamplerContext arg0 = new JavaSamplerContext(params);
        test.setupTest(arg0);
        SampleResult s = test.runTest(arg0);
        System.out.println(s.getTime());
        test.teardownTest(arg0);
    }
}
  • 使用dubbo服务方式调用也同样实现JavaSamplerClient接口,代码如下:

package jemter;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.yiji.finance.fund.facade.api.FundFacade;
import com.yiji.finance.fund.facade.order.WithdrawOrder;
import com.yiji.finance.fund.facade.result.WithdrawResult;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
/**
 * Created with com.autotest.jmeter
 * User:mfl
 * Date:2018/7/24
 * Time:下午5:22
 */
public class JemterDubboTest implements JavaSamplerClient{
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
    }
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        SampleResult result = new SampleResult();
        try {
            result.sampleStart();
            ReferenceConfig<FundFacade> config = new ReferenceConfig<FundFacade>();
            config.setApplication(new ApplicationConfig("AccountBatchTransferServiceTest"));
            config.setInterface(FundFacade.class);
            config.setVersion("1.0");
            config
                    .setUrl("dubbo://172.16.1.111:20011/com.yiji.finance.fund.facade.api.FundFacade");
            config.setTimeout(200000);
            FundFacade fundFacade = config.get();
            WithdrawOrder order = new WithdrawOrder();
             WithdrawResult withdrawResult = fundFacade
                    .withdraw(order);
             System.out.println("withdrawResult:"+String.valueOf(withdrawResult));
            result.setResponseData(String.valueOf(withdrawResult), null);
            result.setDataType(SampleResult.TEXT);
            result.setSuccessful(true);
        } catch (Exception e){
            result.setSuccessful(false);
            e.printStackTrace();
        } finally {
            result.sampleEnd();// jmeter 结束统计响应时间标记
        }
        return result;
    }
    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
    }
    @Override
    public Arguments getDefaultParameters() {
        Arguments arguments = new Arguments();
        return arguments;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        JemterDubboTest test = new JemterDubboTest();
        Arguments params = test.getDefaultParameters();
        JavaSamplerContext arg0 = new JavaSamplerContext(params);
        test.setupTest(arg0);
        test.runTest(arg0);
        test.teardownTest(arg0);
    }
}
3.导入测试工程jar包
  • 写完我们的测试代码后,将我们的测试工程打成jar包,打包方式如下:点击右边Maven Projects工具栏->点击项目名称下的Lifecycle->点击package

  • 生成的jar包将放置到我们测试工程的根目录下的target目录中,如下图:

  • 将我们打的jar包复制到我们的Jmeter工具的/lib/ext目录中,如下图:

4.Jmeter添加java执行
  • 在我们之前创建的线程组中已经添加过的Java请求Sampler下选择我们之前创建好的测试用例,如下图:

  • 选择好我们需要进行压测的类后可在下面修改相关的传入参数

5.Jmeter参数化设置
  • 在添加的线程组下增加CSV Data Set Config元件,如下图:

  • 添加完元件后可在下方进行文件读取的相关属性进行设置,如下图:

  • 在之前创建的java请求Samlper中可使用我们定义的参数,如下图:

  • CSV文件数据准备如下图:

如有多个参数新增一列将数据写入便可

三、测试结果报告分析

1. 聚合报告

  • Samples:总共执行的线程数

  • Average:平均响应时间

  • 90%Line:90%的线程响应时间

  • 95%Line:95%的线程响应时间

  • Min:最快响应时间

  • Max:最慢响应时间

  • Error:执行线程错误率

  • Throughput:平均TPS值

在这个聚合报告中我们主要关注的有平均响应时间、95%响应时间、平均TPS和错误率。一般的支付业务平均响应时间应该在2秒以内,tps达到100笔每秒才能达到要求。
2. 其它监听
在进行测试过程中我们可能会遇到某个线程特别慢,那么我们需要对其进行日志跟踪,我们就需要添加结果树和表格察看结果,来找到他的订单号,以便于快速定位问题。以下就是我在测试过程需要的监听,这个可以按需添加或减少。

四、性能瓶颈分析及调优

1. 性能瓶颈分析
  • 查看数据库监控日志,看是否存在慢查询,或者同一张表查询了多次

  • 查看每个系统请求响应的时间差,定位到具体出现性能问题的系统

  • 查看是否存在调用第三方资源得到响应结果慢

2.性能调优
  • 表是否加索引

  • 是否可以加缓存

  • 加机器

其它的待续…


文章转载自一不小心的那些事儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论