一、从零开始 1. 下载jmeter 请在Jmeter官网下载程序包http://jmeter.apache.org/download_jmeter.cgi
2. 启动 下载完成后将其解压到本地文件夹,执行其bin目录的jmeter可执行文件
3. 安装插件
说明: 3 Basic Graphs 可用于添加监听TPS情况 Custom Thread Groups 可用于添加线程组时按时间阶段添加线程数
4. 创建线程组
创建完成后如下图:
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. 新建测试工程 <!-- 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. 编写测试代码
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);
}
}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包
4.Jmeter添加java执行
5.Jmeter参数化设置
如有多个参数新增一列将数据写入便可
三、测试结果报告分析 1. 聚合报告
Samples:总共执行的线程数
Average:平均响应时间
90%Line:90%的线程响应时间
95%Line:95%的线程响应时间
Min:最快响应时间
Max:最慢响应时间
Error:执行线程错误率
Throughput:平均TPS值
在这个聚合报告中我们主要关注的有平均响应时间、95%响应时间、平均TPS和错误率。一般的支付业务平均响应时间应该在2秒以内,tps达到100笔每秒才能达到要求。 2. 其它监听 在进行测试过程中我们可能会遇到某个线程特别慢,那么我们需要对其进行日志跟踪,我们就需要添加结果树和表格察看结果,来找到他的订单号,以便于快速定位问题。以下就是我在测试过程需要的监听,这个可以按需添加或减少。
四、性能瓶颈分析及调优 1. 性能瓶颈分析 2.性能调优 其它的待续…