跳转至

JMeter 功能实战

假设现在有一个性能测试用例,要求:

用户数量 1200  

账号为 sz_000001 ~ sz_001200, 密码都是 111111

在10分钟依次进行如下操作 

  打开登录页进行登录后进入首页


如果你还用前面录制的方式,录制后,验证一下,就可以发现:

有些后续的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格式的文件,其实就是文本文件,里面记录了性能测试数据,比如

sz_000001,111111
sz_000002,111111
sz_000003,111111


这时,可以在某个 线程组下面 添加 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')

您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况