jmeter压力测试笔记- HTTP协议
一、目标
使用jmeter进行HTTP接口压力测试;
命令行方式运行,方便在linux环境运行;
二、面临的问题
- 支持多环境测试(开发、测试、生产环境)
- 支持用户数据、线程数、循环次数等配置在运行时自定义
- 测试时HTTP包头需要带token, token只能在登录时获取;
三、解决办法
- 问题1,2解决思路:配置信息参数化。
jmeter支持在任意可输入位置使用函数,jmeter内置函数支持使用传入变量。使用这两个特性可以把配置在运行时传入:
使用方法:
传入: -J参数名=参数值
使用:${__P(参数名, 默认值)}
使用示例(传入线程数配置):
传入: 命令行执行方式 /jmeter安装目录/bin/jmeter -n -Jthreadnums=10
使用:在线程数配置处填写:${__P(threadnums, 1)}
- 问题3解决思路:用户登录后信息自动生成到csv文件
创建独立的用户登录脚本,脚本读取用户基本信息,登录后把结果格式化输出到csv文件,供其他测试脚本使用。这样每次执行测试前, 执行一下登录脚本即可,不再需要人工准备测试用户数据。
四、用户登录脚本示例

系统需要使用手机号+设备号进行登录
预设:登录脚本user.login.jmx, 用户信息文件phone_dev.csv
步骤1:创建csv文件,每行包含2列(手机号、设备号),逗号分隔。需要多少测试用户则创建多少行数据
步骤2:打开jmeter, 创建测试脚本, 保存名字为user.login.jmx
步骤3:为登录脚本增加CSV Data Set Config, 从phone_dev.csv读取用户信息
关键配置项:
Filename: ${__P(csv, )} // 传入csv文件路径
Variable Names: ${__P(var, )} // csv变量列表
Stop thread on EOF:true // csv读取到结尾就结束执行。
步骤4:增加[HTTP信息头管理器]、[高斯随机定时器]、[用户自定义变量]、[查看结果树]
步骤5:增加HTTP请求, 改名为[1获取短信验证码]
此接口是专为测试增加的接口, 直接返回短信验证码
增加请求参数mobile:${mobile}; deviceId:${deviceId}(引用csv变量)
下级增加响应断言, 验证应答结果正确性
下级增加正则表达式提取器, 提取验证码
步骤6:增加HTTP请求,改名为[2用户登录]
下级增加响应断言,验证应答结果正确性
下级增加三个正则表达式提取器, 提取token, uid, gid变量,用于输出到csv
步骤7:[2用户登录] 下级增加置处理器:Beanshell PostProcessor, 分析登录结果并保存到csv文件
这个是重点, 能输出到csv文件就靠它了。
Beanshell在Java的语法基础上增加了自己的全局变量, 有java基础就可以很方便的进行Beanshell脚本开发, 这个脚本生成 的文件每行包含2个用户,方便压测时测试用户间交互;
// 读取变量
randnums = vars.getObject("randnums");
url=props.get("apiurl");
filepath = "";
t_uid= vars.getObject("t_uid");
t_devid=vars.getObject("t_devid");
t_token=vars.getObject("t_token"); // 判断环境
if (url != null) {
if(url.equals("dev-api.domain.com")) {
filepath = "devapi-user.csv";
} else if(url.equals("test-api.domain.com")) {
filepath = "testapi-user.csv";
} else {
filepath = "api-user.csv";
}
} // 获取文件绝对路径
file = new File(filepath).getAbsoluteFile(); // 第一个用户请求时请求清空文件
if(randnums == null) { log.info("******* user csv file:" + file.getPath()); randnums = 0;
fos = new FileOutputStream(file);
fos.write("".getBytes());
fos.close(); } // 第二个用户开始写入文件 (每行有两个用户的信息)
if(t_uid != null) {
fos = new FileOutputStream(file, true);
// uid,gid,mobile,deviceId,token
str = randnums
+ "," + vars.get("uid")
+ "," + vars.get("gid")
+ "," + vars.get("mobile")
+ "," + vars.get("deviceId")
+ "," + vars.get("token")
+ "," + t_uid
+ "," + t_devid
+ "," + t_token
+ "\n";
fos.write(str.getBytes());
fos.close();
} // 保存变量用于下次循环使用
randnums = new Integer(randnums + 1);
vars.putObject("randnums", randnums); vars.putObject("t_uid", vars.get("uid"));
vars.putObject("t_devid", vars.get("deviceId"));
vars.putObject("t_token", vars.get("token"));
五、用户登录脚本调用示例
/jmeter安装目录/bin/jmeter -n -Jcsv=/usr/local/jmeter/phone_dev.csv -Jvar=mobile,deviceId -t /usr/local/jmeter/user.login.jmx
六、其他测试脚本说明
其他脚本与登录脚本类似, 只需把HTTP请求改成实际测试的接口
调用: /jmeter安装目录/bin/jmeter -n -Jcsv=/usr/local/jmeter/dev_user.csv -Jvar=uid,gid,mobile,deviceId,token,t_uid,t_deviceId,t_token -t /usr/local/jmeter/other.test.jmx
七、后记
在实际使用中,已经达到所有可配置参数都采用传参方式。另外,脚本调用每次需要传递大量参数,容易出错, 开发了简单的shell脚本进行封装, 可以很方便的调用: ./runjmeter -api -jmx aaaa.jmx -threadnums 10 -loops 99999
jmeter压力测试笔记- HTTP协议的更多相关文章
- Jmeter压力测试笔记(6)性能调测-压力并发-模拟生产环境数据
问题原因找到了,那就好办了. 找到阿里云技术人员,让他们强行给我们上架了一个共享代理模式的Redis. 并重新进行压力测试. 哦豁~ 开心,压力测试顺利,异常率大大降低实际为: 数据库DBA反馈,数据 ...
- Jmeter 压力测试笔记(2)--问题定位
事情已经出了,是该想办法解决的时候了. 经过运维和DBA定位: 数据库读写分离中,读库延时超过了30秒,导致所有请求都压在主库.另外所有数据库都连接数都被占满,但活跃请求数量缺不多. 数据库16K的连 ...
- Jmeter 压力测试笔记(4)--分布式部署
分布式部署:坑,大坑~ 超级坑~~~~ 在这里坑了2天,整整2天.其它略过不表下面只写经验: 在linux下,centos7系统 1主 14执行机. jmeter版本 5.2.1 所有机器在同一 ...
- Jmeter 压力测试笔记(3)--脚本调试/签名/cookie/提升吞吐量/降低异常率/提升单机并发性能
import XXXsign.Openapi2sign;---导入jar包中的签名方法 String str1 = "12121"; ---需要被签名的字段:向开发了解需要哪些哪些 ...
- Jmeter压力测试笔记(5)问题原因
压测链路是jmeter=>slb=>nginx => php=>rds 报 Too Many Connections 的原因是前端同时保持了 16000 个连接,达到实例规格的 ...
- Jmeter 压力测试笔记(1)--服务器迁移失败
近期,公司服务器因技术架构升级等原因需要迁移,在经过开发,运维DBA,测试多部门进行联合讨论后,制定出了迁移方案.迁移前也对APP应用进行了各种测试,并没有发现问题. 凌晨2点开始迁移,5点完成迁移. ...
- jmeter 压力测试
转自: https://blog.csdn.net/cbzcbzcbzcbz/article/details/78023327 Jmeter压力测试简单教程(包括服务器状态监控) 2017年09月18 ...
- Jmeter压力测试入门操作
Jmeter压力测试入门 1. 前言 Jmeter 是Apache组织开发的基于Java的压力测试工具,开源并且支持多个操作系统,是一款很好的HTTP测试工具.本篇文章主要的目的是帮助没有接触过J ...
- JMeter压力测试,http请求压测,5分钟让你学会如何压测接口!
JMeter压力测试 官网:https://jmeter.apache.org 最新款的jmeter需要java8的支持,所以请自行安装jdk8.这里就不啰嗦了. 可以根据自己的系统下载zip或者是t ...
随机推荐
- 日历插件——laydate.js
laydate是一款很好用的日历控件,兼容了包括IE6在内的所有主流浏览器,默认有三种皮肤,如需其它皮肤可去官网下载http://www.layui.com/laydate/ 一.核心方法:layd ...
- Python算法——二叉树
一.二叉树 from collections import deque class BiTreeNode: def __init__(self, data): self.data = data sel ...
- vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录
一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...
- 结合Nginx以cgi方式安装php5.5.4
新建用户及用户组 groupadd webuser useradd -g webuser webuser 下载php-5.5 下载链接:http://pan.baidu.com/s/1i3CBshv ...
- Java数据库设计14个技巧
Java数据库设计14个技巧 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对 ...
- Oracle 12cR1 RAC 在VMware Workstation上安装(中)—图形界面安装
Oracle 12cR1 RAC 在VMware Workstation上安装(中)—图形界面安装 1.1 图形界面安装 1.1.1 安装GRID 安装日志:/u01/app/oraInvento ...
- Linux内核链表-通用链表的实现
最近编程总想着参考一些有名的开源代码是如何实现的,因为要写链表就看了下linux内核中对链表的实现. 链表是一种非常常见的数据结构,特别是在动态创建相应数据结构的情况下更是如此,然而在操作系统内核中, ...
- JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】
1.PreparedStatement对象 PreparedStatement对象继承Statement对象,它比Statement对象更强大,使用起来更简单 Statement对象编译SQL语句时, ...
- 小甲鱼OD学习第2讲
这次我们的任务是让我们输入任意用户名密码判断正确 我们输入fishc和111111,显示错误 我们猜测这是用GetDlgItemTextW来收集账号密码的输入值 我们找到了两个函数,给这两个函数都下断 ...
- 对JavaScript中的静态属性和原型属性的理解
首先是在访问上的区别,当访问实例对象的某个属性但它本身没有时,它就会到原型中去查找,但不会去查找静态属性. // 实例对象不会去查找静态属性 function Foo(){} Foo.a = 1; v ...