JMeter 功能实战
Cookie管理器
假设现在有一个性能测试用例,要求:
如果你还用前面录制的方式,录制后,验证一下,就可以发现:
有些后续的API请求返回的结果是错误,返回信息表示,没有登录。
即使前面 发送的登录请求返回表示成功了。 为什么呢?
这是因为 这个被测系统 使用的 用户验证机制是 Cookie Session机制
这就需要 让JMeter自动把接收到的 HTTP 响应消息中的 Cookie
保存起来,并且在后续发给该网站的请求中自动携带上, 可以在测试计划节点下面添加一个 HTTP Cookie管理器
具体操作,请观看视频讲解
消息数据关联
做API接口性能测试的时候,后面的请求参数 往往 需要 根据前面的请求结果
来决定。
这样,测试工具填入的数据就是动态的,没法预先写死。
比如前面的测试场景,后续还需要做如下操作:
用户登录后,打开 学习中心 -> 我的任务
页面,查看前2个任务。
这样,就要获取前2个任务的id, 因为每个学员 任务分配
的id都是不一样的。
JMeter 需要 从 前面 列出任务的 HTTP API响应结果 里面提取出 ID, 供后面的请求使用。
如何做到呢?
这就要使用 后置处理器
和 变量
。
JMeter 通过 后置处理器 取出 取样器响应结果中 要提出取出来的数据, 存入变量,后续请求使用这些变量。
具体参考视频讲解。
变量
JMeter中,使用变量,是通过 ${变量名}
这样的格式
变量可以用户自己定义产生,也可以由前置处理器、后置处理器 等 JMeter 元件产生。
有的是JMeter内置变量,比如表示当前线程号的变量 __threadNum
,就可以这样使用 ${__threadNum}
后置处理器
后置处理器通常用于对 取样器 结果进行后续处理。
后置处理器 的有效范围是 同级所有取样器,如果只要针对某个取样器,应该添加在它下面
常用的一个后置处理器是 JSON提取器
, 可以把 HTTP响应消息中的数据提取到变量中,供后续使用
说明文档:https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor
测试网页: http://jsonpath.herokuapp.com
HTTP响应中有UTF8编码的中文显示为乱码,可以在设置一个 BeanShell PostProcessor
类型的后置处理器,并且在 Script
中增加 prev.setDataEncoding("UTF-8");
CSV 数据文件设置
有时候,性能测试有大量的数据 需要从 CSV 格式的文件读入使用。
CSV格式的文件,其实就是文本文件,里面记录了性能测试数据,比如
这时,可以在某个 线程组下面 添加 CSV data set config(CSV 数据文件设置)
元件
CSV 数据文件设置可以为每列设置一个变量名,比如上例就是 loginname,password
JMeter会把 每行数据依次分配给一个线程。
这样,每个线程里面的元件 就可以使用 这些变量 ,得到对应的数据。
具体使用 点击这里参考官方文档
断言
利用JMeter断言, 可以判定 从被测系统 收到的响应消息是否正确。
断言的有效范围是 同级所有取样器,如果只要针对某个取样器,应该添加在它下面。
例如,可以判断响应是否包含某些特定文本、数据。
甚至可以使用 Groovy、 BeanShell 这样的脚本语言做 更加灵活的断言判定。
比如下面使用 JSR223 断言
脚本,可以检查JSON格式消息体响应中的total字段值是否小于10
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper();
def retObj = jsonSlurper.parseText(prev.getResponseDataAsString());
if(retObj.total < 10){
AssertionResult.setFailureMessage("retObj.total <10");
AssertionResult.setFailure(true);
}
循环控制器
线程组可以整体循环, 但是如果你只想循环 线程组其中的一部分操作呢?
比如:
用户登录一次, 后续操作循环10次,每次间隔20秒 可以使用循环控制器。
循环控制器 内部的元件有时 需要用到 当前循环序号
。
JMeter 的当前循环序号放到变量 __jm__<循环控制器名称>__idx
中。
比如你的 循环控制器 名为 LC, 你就可以通过 ${__jm__LC__idx}
访问到 当前循环序号。
预处理器
预处理器 在取样器请求 发出前执行一些操作
用的比较多的是:设置一些参数、修改取样器的设置、脚本预处理
有效范围是同级所有取样器,如果只要针对某个取样器,应该添加在它下面。
常用的有 用户参数、HTML链接解析器、JSR223/BeanShell 等前置处理器
比如,下面JSR223前置处理器的代码可以把一个 当前循环序号变量值进行预先处理 加1。
long number = Long.parseLong(vars.get('__jm__LC1__idx'))
number = number + 1;
vars.put('loopno',String.valueOf(number))
// OUT.println vars.get('loopno')