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

若是你想从头学习Jmeter,能够看看这个系列的文章哦php

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

 

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

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

 

需知

  • 正则表达式不少内容,在这篇文章中不会展开详细说的哦,主要仍是说提取器的使用
  • 想详细学习正则表达式能够看这篇文章:待补充

 

正则提取器

咱们经过实际栗子去讲述理论知识点正则表达式

 

正则提取器界面介绍

 

字段含义

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

可提取的字段api

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

正则表达式数组

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

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

 

Template

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

Field to check

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

 

Body

 

Request Headers

 

Response Headers

 

URL

 

Response Code、Message

 

入门栗子

栗子的前提

这个栗子,我都会以这个地址的接口来完成 JSON 提取器的实战栗子,你们能够注册个帐号玩一玩哦性能

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

 

测试计划树结构

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

 

提取某个特定的值的栗子

登陆接口响应

登陆是执行其余接口的前置接口,因此要获取用户登陆后的 token、uuidui

 

提取 token

 

提取 uuid

 

其余接口调用 token、uuid

 

知识点

  • 提其余接口能够经过  ${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

 

未填写模板

提取器

 

测试结果

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

 

知识点

若是正则匹配到值,可是没有填模板,则返回

 

$0$

提取器

 

测试结果

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

 

知识点

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

 

$1$

提取器

 

测试结果

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

 

知识点

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

 

$2$

提取器

 

测试结果

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

 

一个 ( ) 匹配到多个值 

提取器

 

测试结果

手动分红四部分

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 控制器

 

查看结果树

 

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

提取器

 

测试结果

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

 

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

提取器

 

测试结果

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

 

知识点

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

 

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

提取器

 

测试结果

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
相关文章
相关标签/搜索