使用JMeter进行性能测试

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

使用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)}