使用JMeter做性能测试
最近需要使用JMeter
来做接口性能测试工具,简单记录一下试用方法
下载安装
由于是Java
程序,只需加载官网的二进制包到本地,在装好Java
的前提下就可以运行了。
#下载地址
https://jmeter.apache.org/download_jmeter.cgi
#运行路径
apache-jmeter-4.0/bin/jmeter.sh
具体使用
现在以测试一个Restful API
的QPS
为例子,接口如下用户名为zhangsan
用户信息
http://127.0.0.1:8002/consumer/user/get/zhangsan
新建线程组
- 右击
测试计划
->添加
->Threads(Users)
->线程组
- 配置线程组如下图,这里我们线程数设置为
5
勾选调度器
然后持续时间设置为60
,其实就是模拟5
个用户持续跑60
秒钟
- 线程数:起多少个线程,或者说模拟多少个用户
- Ramp-up Period:JMeter花多长时间启动所有的线程。假设值是100,线程数是10,则每隔10秒会启动一个线程
- 循环次数:Number of times to perform the test case. Alternatively, "forever" can be selected causing the test to run until manually stopped
- 其他参数具体可点击
GUI
界面的帮助按钮进行了解
添加HTTP采样器
- 右击上一步创建的线程组,选择
添加
->Sample
->HTTP请求
- 依次设置协议、服务器名称或IP、端口号、HTTP请求方法、路径
- 如果请求参数在Body里面可以写死请求的Body,也可以通过变量在每个请求动态生成
Body
这种方法后面会做介绍
设置请求头
如果需要请求头的按需添加
- 右击上一步创建的线程组,选择
添加
->配置原件
->HTTP信息头管理器
- 点击下方中部的
添加
按钮分别写入Content-Type
,值为application/json
添加测试报告查看组件
- 右击上一步创建的线程组,选择
添加
->监听器
->查看结果树
、聚合报告、图形结果,可根据需求添加
使用BeanShell动态定定义请求参数
- 右击上一步创建的线程组,选择
添加
->前置处理器
->BeanShell PreProcessor
- 在
Parameters
定义参数,这里定义的变量只能识别为字符串,比如这里定义了三个用户名字用逗号分隔开,后面再取到参数后再使用split
方法提取每个用户名。
String []names = Parameters.split(",");
//vars.getIteration()获取当前操作的次数
int randomNameIndex = vars.getIteration() % names.length;
//这里把值put到名为vars的Map中,在其他地方使用${queryName}则可以取到该值
vars.put("queryName", names[randomNameIndex]);
- 其他代码参考
import org.apache.commons.lang3.RandomStringUtils;
StringBuilder result = new StringBuilder();
String newline = System.getProperty("line.separator");
int max = Integer.parseInt(Parameters);
Random random = new Random();
StringBuilder data = new StringBuilder();
for(int i = 0; i < max; i++){
data.append("testTable,metric=wind.UC_ResetAlarms");
data.append(RandomStringUtils.randomNumeric(1));
// data.append(RandomStringUtils.randomAlphanumeric(6));
data.append(",machineId=");
data.append(RandomStringUtils.randomAlphanumeric(6));
data.append(" value=");
data.append(RandomStringUtils.randomNumeric(2));
data.append(".");
data.append(RandomStringUtils.randomNumeric(2));
data.append(newline);
}
vars.put("myData", data.toString());
result.append("{");
result.append(""productIds" : [");
result.append(newline);
for (int i = 1; i < max; i++) {
result.append(""").append(random.nextInt()).append("",");
result.append(newline);
}
result.append("]");
result.append(newline);
result.append("}");
vars.put("json", result.toString());
内置函数
- __RandomString The RandomString function returns a random String of length using characters in chars to use.
- Examples:
will return a random string of 5 characters which can be readable or not
返回5个字符的随机字符串,因为未指定字符,可能会产生不可读的字符
${__RandomString(5)}
will return a random string of 10 characters picked from abcdefg set, like cdbgdbeebd or adbfeggfad, … 从给定的字符串中产生长度为10的随机字符串
${__RandomString(10,abcdefg)}
will return a random string of 6 characters picked from a12zeczclk set and store the result in MYVAR, MYVAR will contain string like 2z22ak or z11kce, …
从给定的字符创中生成随机字符串,并把值存储到变量MYVAR
${__RandomString(6,a12zeczclk, MYVAR)}
注意
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use NON GUI Mode:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
对性能测试的时候一定不要使用图形界面,要使用命令行模式
jmeter -n -t /Users/zealzhangz/Documents/dev/company/sky-test/jmeter/TSDB-插入数据测试.jmx -l /Users/zealzhangz/Documents/dev/company/sky-test/jmeter/result/`date "+%Y%m%d"`/`date "+%Y%m%d%H%m%S".txt` -e -o /Users/zealzhangz/Documents/dev/company/sky-test/jmeter/result/`date "+%Y%m%d"`/report
使用分布式Jmeter做性能测试
我们在在做性能测试时发现单个Jmeter
的能力有限,即使启更多的线程也不能线性的增强Jmeter
的能力。这种情况就需要集群搭建一个能力更强的Jmeter集群。架构如下图:
JMeter Client
主要是调度的作用,把测试任务下发到各个真正执行的测试的JMeter Server
。然后汇集测试结果,生成测试报告。JMeter Server
实际完成测试的节点。
搭建分布式Jmeter步骤
首先启动Server节点
-Dserver_port=6099
:与JMeter Client
通信的端口-Djava.rmi.server.hostname
=10.115.0.224:与JMeter Client
通信的hostname
,一般就是宿主机的IP
- 一个机器启多个节点时每个Jmeter对应不同端口号
nohup ./apache-jmeter-4.0/bin/jmeter-server -Dserver_port=6099 -Djava.rmi.server.hostname=10.115.0.224 > jmeter-6099.log 2>&1 &
注意:当宿主机配置较高的情况可在宿主机启动多个Server节点,实验表明一个宿主机启动多个Jmeter性能比一个Jmeter(资源同比增加)启更多线程性能更强。
配置并启动JMeter Client
.jmx
文件为在JMeter GUI
界面编写测试好的脚本文件- 参数
-R
后面接分布式节点IP:port
也就是上面设置的JMeter Server
端口和IP
- 测试结果会存在result.txt文件,HTML报告存在指定的目录下面
#!/usr/bin/env bash
JMETER_HOME=/home/xxxxxx/apache-jmeter-4.0
baseDir=/home/xxxxxx/jmeter-shell
result=$baseDir/`date "+%Y%m%d%H%M%S-standalone-skytsdb-226-27jmeter-6thread-100points"`
if [[ ! -d "${result}/report" ]]
then
mkdir -p ${result}/report
fi
$JMETER_HOME/bin/jmeter.sh -n -t $baseDir/Standalone-TSDB.jmx -R 10.115.0.223:1099,10.115.0.223:2099,10.115.0.223:3099,10.115.0.223:4099,10.115.0.223:5099,10.115.0.223:6099,10.115.0.223:7099,10.115.0.223:8099,10.115.0.223:9099,10.115.0.225:1099,10.115.0.225:2099,10.115.0.225:3099,10.115.0.225:4099,10.115.0.225:5099,10.115.0.225:6099,10.115.0.225:7099,10.115.0.225:8099,10.115.0.225:9099,10.115.0.224:1099,10.115.0.224:2099,10.115.0.224:3099,10.115.0.224:4099,10.115.0.224:5099,10.115.0.224:6099,10.115.0.224:7099,10.115.0.224:8099,10.115.0.224:9099 -l $result/result.txt -e -o $result/report
本文由 zealzhangz 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2019/01/23 18:57