使用JMeter进行性能测试

/ JMeter性能测试工具Java技术 / 没有评论 / 3211浏览

使用JMeter做性能测试

alt 最近需要使用JMeter来做接口性能测试工具,简单记录一下试用方法

下载安装

由于是Java程序,只需加载官网的二进制包到本地,在装好Java的前提下就可以运行了。

#下载地址
https://jmeter.apache.org/download_jmeter.cgi

#运行路径
apache-jmeter-4.0/bin/jmeter.sh

具体使用

现在以测试一个Restful APIQPS为例子,接口如下用户名为zhangsan用户信息

http://127.0.0.1:8002/consumer/user/get/zhangsan

新建线程组

  1. 右击测试计划->添加->Threads(Users)->线程组
  2. 配置线程组如下图,这里我们线程数设置为5勾选调度器然后持续时间设置为60,其实就是模拟5个用户持续跑60秒钟

alt

添加HTTP采样器

  1. 右击上一步创建的线程组,选择添加->Sample->HTTP请求
  2. 依次设置协议、服务器名称或IP、端口号、HTTP请求方法、路径
  3. 如果请求参数在Body里面可以写死请求的Body,也可以通过变量在每个请求动态生成Body这种方法后面会做介绍

alt

设置请求头

如果需要请求头的按需添加

  1. 右击上一步创建的线程组,选择添加->配置原件->HTTP信息头管理器
  2. 点击下方中部的添加按钮分别写入Content-Type,值为application/json

添加测试报告查看组件

  1. 右击上一步创建的线程组,选择添加->监听器->查看结果树、聚合报告、图形结果,可根据需求添加

使用BeanShell动态定定义请求参数

  1. 右击上一步创建的线程组,选择添加->前置处理器->BeanShell PreProcessor
  2. Parameters定义参数,这里定义的变量只能识别为字符串,比如这里定义了三个用户名字用逗号分隔开,后面再取到参数后再使用split方法提取每个用户名。

alt

String []names = Parameters.split(",");

//vars.getIteration()获取当前操作的次数
int randomNameIndex = vars.getIteration() % names.length;
//这里把值put到名为vars的Map中,在其他地方使用${queryName}则可以取到该值
vars.put("queryName", names[randomNameIndex]);
  1. 其他代码参考
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());

内置函数

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集群。架构如下图:

alt

搭建分布式Jmeter步骤

首先启动Server节点

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

#!/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