Jmeter系列(27)- 详解正则提取器

摘要:
仅选择默认主样本。Fieldtocheck可以提取字段创建变量的名称。接收提取值的变量名必须通过RegularExpression正则表达式模板传递。根据找到的匹配项创建的字符串的模板匹配号(0或Random)取值0:

如果你想从头学习Jmeter,可以看看这个系列的文章哦

https://www.cnblogs.com/poloyy/category/1746599.html

 

有了 JSON 提取器为啥还要用正则提取器?

  • JSON 提取器只针对接口返回的响应内容
  • 如果想提取的是响应头、请求头的值,而非响应内容的值呢?
  • 这个时候正则提取器的作用就出来了,它可以提取请求任一部分的值

需知

正则提取器

Jmeter系列(27)- 详解正则提取器第1张

我们通过实际栗子去讲述理论知识点

正则提取器界面介绍

Jmeter系列(27)- 详解正则提取器第2张

字段含义

字段含义
Apply to应用范围,选默认的 main sample only 就行了
Field to check

可提取的字段

Names of created variables
  • 接收提取值的变量名
  • 必传
Regular Expression

正则表达式

Template从找到的匹配项中创建字符串的模板
Match No.(0 for Random)
  • 取第几个值
  • 0:随机,默认
  • -1:所有
  • 1:第一个值
  • 非必传
Default Value
  • 缺省值,匹配不到值的时候取该值
  • 非必传
Use empty default value

勾选后,提取不到值时,则返回空字符串

Template

  • 如果一条正则表达式有多个提取结果,则提取结果是数组形式
  • 模板 $1$、$2$.....表示把解析到的第几个值赋给变量,从 1 开始匹配
  • $0$ 表示整个表达式匹配的内容(后续具体看栗子)
  • 若只有一个结果,只能是$1$
 

Field to check

属性含义
Body响应体,不包括响应头;最常用
Body (unescaped)响应体,替换了所有HTML转义符;不建议使用
Body as a Document从不同类型的文件中提取文本;影响性能
Request Headers请求头
Response Headers响应头
URLURL
Response Code响应码
Response Message响应信息

Body

Jmeter系列(27)- 详解正则提取器第3张

Request Headers

Jmeter系列(27)- 详解正则提取器第4张

Response Headers

Jmeter系列(27)- 详解正则提取器第5张

URL

Jmeter系列(27)- 详解正则提取器第6张

Response Code、Message

Jmeter系列(27)- 详解正则提取器第7张

入门栗子

栗子的前提

这个栗子,我都会以这个地址的接口来完成 JSON 提取器的实战栗子,大家可以注册个账号玩一玩哦

http://api.yesapi.cn/docs.php?keyword=%E4%BC%9A%E5%91%98&channel=api

测试计划树结构

下面多个栗子都以这个测试计划为基础哦

Jmeter系列(27)- 详解正则提取器第8张

提取某个特定的值的栗子

登录接口响应

登录是执行其他接口的前置接口,所以要获取用户登录后的 token、uuid

Jmeter系列(27)- 详解正则提取器第9张

提取 token

Jmeter系列(27)- 详解正则提取器第10张

提取 uuid

Jmeter系列(27)- 详解正则提取器第11张

其他接口调用 token、uuid

Jmeter系列(27)- 详解正则提取器第12张

知识点

  • 提其他接口可以通过  ${var}  这种格式,来获取提取到的值
  •  ( ) 里面写匹配规则,用于解析正则表达式
  •  .*? 表示匹配任意长度的任意字符,这也是最常用的正则表达式
  • 一般 (.+?) 和 (.*?) 能够满足我们 80%的使用场景

一般正则表达式都可以写成下面两种

  •  左边界(.+?)右边界 
  •  左边界(.*?)右边界 

举更多栗子前的一些话

  • 上面讲的是使用正则提取器时的一个流程,也是实际工作中最简单的栗子
  • 在实际项目中,我们可能会出现一条正则表达式有多个提取结果的情况

JSON 字符串

下面的栗子都以这个 JSON 字符串为基础,从里面提取结果

这 JSON 字符串也是某个接口的响应内容,货真价实,感兴趣也可以自己玩一玩:http://api.yesapi.cn/docs-api-App.User.GetList.html

{
    "ret": 200,
    "msg": "V2.5.1 YesApi App.User.GetList",
    "data": {
        "total": 4,
        "err_msg": "",
        "err_code": 0,
        "users": [
            {
                "role": "user",
                "status_desc": "正常",
                "reg_time": "2020-06-22 20:45:05",
                "role_desc": "普通会员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                },
                "uuid": "0564CE592B4CE914365D8922F6FC4CEC",
                "username": "luojunjiess286",
                "status": 0
            },
            {
                "role": "user",
                "status_desc": "正常",
                "reg_time": "2020-06-22 14:27:17",
                "role_desc": "普通会员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                },
                "uuid": "0164DC0680F84DCE40D3DD4A36640ECA",
                "username": "luojunjiessa",
                "status": 0
            },
            {
                "role": "admin",
                "status_desc": "正常",
                "reg_time": "2020-03-23 22:48:32",
                "role_desc": "管理员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                    "yesapi_reg_source": ""
                },
                "uuid": "079BF6BB82AFCFC7084F96AECAF0519F",
                "username": "luojunjiess",
                "status": 0
            }
        ]
    }
}

一条正则表达式只有一个提取结果的栗子

什么叫只有一个提取结果

就是正则表达式里只有一个 ( ) ,且  Match No. 不是 -1

未填写模板

提取器

Jmeter系列(27)- 详解正则提取器第13张

测试结果

uuid1=
uuid1_g=1
uuid1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_g1=0564CE592B4CE914365D8922F6FC4CEC

知识点

如果正则匹配到值,但是没有填模板,则返回

$0$

提取器

Jmeter系列(27)- 详解正则提取器第14张

测试结果

uuid2="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g=1
uuid2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g1=0564CE592B4CE914365D8922F6FC4CEC

知识点

  •  $0$ 模板其实返回的就是 uuid2_g0 的值
  • 返回了整个正则表达式,不只是 ( ) 内匹配到的值

$1$

提取器

Jmeter系列(27)- 详解正则提取器第15张

测试结果

uuid3=0564CE592B4CE914365D8922F6FC4CEC
uuid3_g=1
uuid3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid3_g1=0564CE592B4CE914365D8922F6FC4CEC

知识点

  •  $1$  模板其实返回的就是 uuid2_g1 的值
  • 仅返回 ( ) 内匹配到的值

$2$

提取器

Jmeter系列(27)- 详解正则提取器第16张

测试结果

uuid4=null
uuid4_g=1
uuid4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid4_g1=0564CE592B4CE914365D8922F6FC4CEC

知识点

 $2$ 模板并不存在,其实就是 uuid4_g2 变量不存在,即使勾了使用空默认值,也返回 null,

总结

  • 其实 uuid 在 JSON 字符串中有三个可匹配到的值,如果不填写匹配数字 Match No. ,则会随机取一个 uuid 并返回
  • 像上述的几个栗子,都填了 1 ,所以都返回了第一个匹配到的 uuid

一条正则表达式有多个提取结果的栗子

什么叫有多个提取结果

有两种情况

  • 一条表达式有多个 ( ) 
  • 一个 ( ) 匹配到多个值,且 Match No 填了 -1

一个 ( ) 匹配到多个值 

提取器

Jmeter系列(27)- 详解正则提取器第17张

测试结果

手动分成四部分

uuid1_1=0564CE592B4CE914365D8922F6FC4CEC
uuid1_1_g=1
uuid1_1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_1_g1=0564CE592B4CE914365D8922F6FC4CEC

uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid1_2_g=1
uuid1_2_g0="uuid":"0164DC0680F84DCE40D3DD4A36640ECA"
uuid1_2_g1=0164DC0680F84DCE40D3DD4A36640ECA

uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid1_3_g=1
uuid1_3_g0="uuid":"079BF6BB82AFCFC7084F96AECAF0519F"
uuid1_3_g1=079BF6BB82AFCFC7084F96AECAF0519F

uuid1_matchNr=3

知识点

  • 一个 ( ) 匹配到多个值的场景 ,一般会结合 ForEach控制器,可以循环将提取到的值赋予到 HTTP 请求中
  • 可以看看下图的小栗子,这里不展开讲,后面会再详细讲解

结构树 + ForEach 控制器

Jmeter系列(27)- 详解正则提取器第18张

查看结果树

Jmeter系列(27)- 详解正则提取器第19张

一条表达式有多个( ),且模板为空

提取器

Jmeter系列(27)- 详解正则提取器第20张

测试结果

info1=
info1_g=2
info1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info1_g1=0564CE592B4CE914365D8922F6FC4CEC
info1_g2=luojunjiess286

一条表达式有多个( ),且只有一个模板

提取器

Jmeter系列(27)- 详解正则提取器第21张

测试结果

info2=0564CE592B4CE914365D8922F6FC4CEC
info2_g=2
info2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info2_g1=0564CE592B4CE914365D8922F6FC4CEC
info2_g2=luojunjiess286

知识点

  • info2 拿的就是 info2_g1 的值
  •  $1$ 获取的是第一个 ( ) 匹配到的值, $2$ 获取的是第二个 ( ) 匹配到的值,以此类推     

一条表达式有多个( ),且有两个模板

提取器

Jmeter系列(27)- 详解正则提取器第22张

Jmeter系列(27)- 详解正则提取器第23张

测试结果

info3=0564CE592B4CE914365D8922F6FC4CECluojunjiess286
info3_g=2
info3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info3_g1=0564CE592B4CE914365D8922F6FC4CEC
info3_g2=luojunjiess286

info4=0564CE592B4CE914365D8922F6FC4CEC,luojunjiess286
info4_g=2
info4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info4_g1=0564CE592B4CE914365D8922F6FC4CEC
info4_g2=luojunjiess286

正则表达式中有多个 ( ) 时的总结

  • 如果其中一个 ( ) 匹配不到元素,那也无法获取到值
  • 引用名称、匹配数字、缺省值三个字段也只需要填一个值即可,不需要跟 ( ) 的数量一致
  • 多个模板( $1$$2$ )的时候,可以用空格、, 、. 、 - 连接模板,最终会显示在变量上,如:info4

免责声明:文章转载自《Jmeter系列(27)- 详解正则提取器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue.set()和this.$set()源码解析IOS中UITableView异步加载图片的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.htaccess教程:简介、访问控制、验证、目录浏览控制

一、.htaccess简介 1.什么是.htaccess .htaccess是一个纯文本文件,里面存放着Apache服务器配置相关的一些指令,它类似于Apache的站点配置文件,如httpd.conf(Apache2已经支持多站点,因此你的站点配置文件可能在/etc/apache2/conf.d/目录下)。.htaccess与httpd.conf配置文件不...

Python源码.py文件打包为.whl文件

1 python源码.py文件打包  1.1 安装工具包 python源文件打包需要用到setuptools和wheel工具包:  1.2建立python项目源文件   建立一个名称为hello的项目包和setup.py文件    其中hello项目包中有一个hello_world.py文件和一个__init__.py文件 hello_world.py...

webpack2.x基础属性讲解

webpack作为构建工具平时作为前端作为优化、模块编程、和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x版本,webpack2的文档结构和代码提示都非常友善。 webpack从1.x升到2版,并没有作为大的更改改动,而且内部的接口文档形式也与1基本无修改,那么对...

Moco模拟服务器post&get请求 (二)

1、moco启动命令如下:java -jar moco-runner-0.12.0-standalone.jar 协议类型 -p 端口号 -c json配置文件 2、带参数的get请求 [ { "request":{ "method":"get", "uri":"/api/get_event_list", "queri...

Linux 内存监控

centos6 init进程是系统中的第一个进程,PID永远为1 查看系统在中静态进程的统计信息 命令: ps 格式: ps [可选项] ax: 显示所有的进程信息 -u: 使用以用户为主的格式输出进程信息 -e: select all processes 显示系统内的进程信息 -l: 使用长格式显示进程信息 -f: full 使用完整的格式显示进程信息...

document.cookie的使用

设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie:document.cookie="userId=828";如果要一次存储多个名/值对,可以使用分号加空格(; )隔开,例如: document.cookie="userId=828; userName=hulk"; 在cookie的名或值中不...