一、前言
由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据
二、创建录制模板
可参考:jmeter录制接口
首先创建一个录制模板
因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制粘贴的的全面导致接口调用失败,当然如果你对系统特别熟悉,可以忽略这个步骤
录制后可以复制请求到线程组中,这样就可以直接复制
三、 新增线程组
修改线程组名称
2.1给线程组添加用户定义变量
定义多个用户定义变量,给不同的模块使用
2.2新增查看结果树
2.3新增测试片段
上图测试片段,按照不同的模块创建不同的片段,因为执行的时候,我们只需要把数据流转到某个阶段就行了, 创建测试片段,可以对不同模块的接口统一管理,不需要禁用这个测试片段就行了
四、新增http请求
在测试片段下新增http请求
五、对http请求的处理
对http请求会遇到以下这些问题
- 登入
- 添加请求头,认证信息,签名,随机数等
- 请求参数加密
- 响应结果解析并应用到下一次请求
- 请求的执行顺序
- 响应断言
5.1登入
登入http请求
添加前置处理器JSR223 PreProcessor
用于获取时间戳,随机数,生成签名
下面含有md5加密,可参考Jmeter使用js对入参使用MD5加密
load("md5.js")
// 时间戳
var timestamp = new Date().getTime();
// 随机数
var nonce = Math.round(Math.random() * 100000);
// 生成签名
var signature = hex_md5(timestamp + "=" + nonce + "function");
vars.put("timestamp", timestamp);
vars.put("nonce", nonce);
vars.put("signature", signature);
添加http请求头
添加JSON提取器获取登入后的token信息
解析返回参数,可参考Jmeter对请求结果进行解析
通过下面的json提取器可以获取到登入后返回的token,这个token是一个变量,可以用于下一次请求
在查询接口的请求头中使用token
5.2请求参数加密
可参考Jmeter使用js对入参使用MD5加密
5.3响应结果解析并应用到下一次请求
可参考:Jmeter对请求结果进行解析
5.4请求的执行顺序
如何保证请求的执行顺序呢?
http请求是可以拖动移动顺序的,展示的顺序,就是执行的先后顺序,建议命名的时候加上需要,这样在多个接口同事执行的时候能够快速的定位到时哪一个接口
5.5响应断言
六、整理流程展示
七、特殊场景处理
场景1:附件上传
参考:jmeter附件上传
场景2:当前接口需要需要上一个接口的返回值
第一个接口,当创建一个项目后,返回一个项目id
第二个接口,需要获取项目id作为入参去提交项目
创建接口
创建入参
JSR233 获取请求头信息
设置请求头
JSON提取器,获取创建成功的项目id
延迟3s,保证接口调用的先后顺序
提交接口
场景3:从form表单提取参数,作为下一个接口的入参
前一个接口的JSR223 后置处理器
// 获取响应数据
var response = prev.getResponseDataAsString();
// 解析 JSON 数据
var data = JSON.parse(response);
// 获取变量(这是个对象,不是一个字符串)
var designPeoples = data.data.designPeoples;
// 项目名称
var itemName = data.data.item.name;
var itemId = data.data.item.id;
// 使用 for 循环遍历数组并修改每个元素
for (var i = 0; i < designPeoples.length; i++) {
designPeoples[i].linkusername = "诸葛亮";
designPeoples[i].linkway = "13888888888";
}
vars.put("itemId", itemId);
vars.put("itemName", itemName);
// 应为是一个对象,使用JSON.stringify把对象转化为字符串,在使用的时候应该为 ${designPeoples} 而不是 '${designPeoples}' 不需要引号
vars.put("designPeoples", JSON.stringify(designPeoples));
后一个接口的入参
{
"item": {
"id": "${itemId}",
"mainid": "${mainId}",
"name": "${itemName}",
"type": "项目"
},
"designPeoples": ${designPeoples}
}