-
2020-06-11 10:16:21
应用场景:在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器,其中最方便最常用的就是正则表达式提取器了。
正则表达式提取器:
允许用户从作用域内的sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。
先上个图:
各配置项介绍:APPly to:作用范围(返回内容的断言范围)
1、Main sample and sub-samples:作用于主节点的取样器及对应子节点的取样器
2、Main sample only:仅作用于主节点的取样器
3、Sub-samples only:仅作用于子节点的取样器
4、JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值。
Field to check:要检查的响应报文的范围
1、主体:响应报文的主体,最常用
2、Body(unescaped):主体,是替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用
3、Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
4、Response Headers:响应信息头(如果你使用的是中文版的Jmeter,会看到这一项是信息头,这是中文翻译问题,应以英文为准)
5、Request Headers:请求信息头
6、URL:请求url
7、Response Code:响应状态码,比如200、404等
8、Response Message:响应信息
***可以看出,这里已经提供了各种场景下的提取功能,非常全面!
引用名称(Reference Name):
Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名,后文中引用方法是$
正则表达式(Regular Expression):
使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容。
***正则的基本使用方法可参考正则表达式的官方说明,本文下方也会有更详细介绍。
模板(Template):
正则表达式的提取模式。
如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。
若只有一个结果,则只能是$1$;
匹配数字(Match No):
正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
缺省值:
匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR等。
重点分析:
下面重点分析一下正则表达式的匹配规则及注意事项:
一、下面是常用的正则表达式操作符
二、贪婪和非贪婪提到正则表达式,必须要说一下匹配的两种模式:贪婪和非贪婪。
1、贪婪与非贪婪模式是两种不同的表达式匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
2、下面举个例子,假设有如下响应结果(只截取了其中一部分):
"code":"0","msg":"请求成功","bizSeqNo":"1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239"
3、现在从中提取bizSeqNo的值:
"bizSeqNo":"(.*)":贪婪模式,提取结果是:1804242UD01154300109392900987311" ,"result":{"bizSeqNo":"1804242UD01154300109423800987316","transactionTime":"20180424094239
"bizSeqNo":"(.*?)":非贪婪模式,提取结果是:1804242UD01154300109392900987311
大家可以自行体会一下其中的差别。
三、进阶匹配问题
1、如何获取数组结果?
如果有多个匹配的结果,则获取到的是个数组,此时若要提取其中的内容,调用方式为${ bizSeqNo _1},$...,如果想要得到匹配出的结果的个数,用$,如果想随机选取一个,只需要将匹配数字设为0,使用$调用即可。
2、如何获取唯一的匹配结果?
如果想要避免上面获取多种结果的情况,则需要注意把正则表达式写成非贪婪模式,或者增加正则表达式的前后边界,使结果唯一匹配既可。
最后告诉大家一个小技巧:
在调试过程中可结果察看结果树和Debug PostProcessor来帮助分析结果。
更多相关内容 -
Jmeter正则表达式提取器实现过程图解
2020-08-18 16:53:41主要介绍了Jmeter正则表达式提取器实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Jmeter正则表达式提取器
2021-12-14 17:22:18Jmeter正则表达式提取器简介用于获取提取器的部分内容作用范围(Apply to)要检查的响应字段范围(Field to check) 简介 Jmeter后置处理器(post processors)的一种,补入这篇博客。 用于获取提取器的部分内容 当...Jmeter正则表达式提取器
简介
Jmeter后置处理器(post processors)的一种,用于将取样器请求到的结果——以正则表达式的方式——读取出来。
用于获取 每个请求 取样器 返回的 不同内容
当用于获取提取器的内容时,应置于取样器下方。
Apply to(作用范围)
- Main sample and sub-sample:匹配范围包括当前父取样器并覆盖至子取样器;
- Main sample only:匹配范围是当前父取样器;
- Sub-samples only:仅匹配子取样器;
- Jmeter Variable Name to use:支持对Jmeter变量值进行匹配
Field to check(设置匹配响应字段的查找范围)
即要在多大的范围内匹配正则表达式。
- Body:仅对响应数据的主体部分进行正则表达式匹配;
- Body(unescaped):针对替换了转义码的Body部分 匹配正则表达式;
- Body as a Document:对请求返回内容的文档部分进行正则表达式匹配;
- Response Headers:只匹配信息头部分的内容;
- Request Headers
- URL:只匹配URL链接;
- Response Code:匹配响应代码,比如状态码200;
- Response Message:匹配响应信息,比如返回成功;
Name of created variable(将通过正则表达式截取到的值,存到变量中,指定该变量的名称)
当使用正则表达式从一个请求返回信息中,截取多个字段时,此处也可只填写一个变量,如下图所示。
此时,截取到的多个值将会以变量名_g1
、变量名_g2
来使用,详见下图,这是自己专门实验的截图。
- 变量=截取的全部字段,彼此字段间以空格相隔,如上图第一行。
- 变量_g:应代表截取的变量个数?
- 变量_g0: 根据正则表达式匹配到的(截取前的)完整字段。
- 变量_g1:截取到的第一个字段,使用时
${变量名_g1}
。 - 变量_g2:截取到的第二个字段,使用时
${变量名_g2}
,如下图所示。
Regular Expression(正则表达式)
可百度
在线正则表达式
来练习正则表达式,此处先给出一个在线正则网址。Template(
$1$
表示会拿到第一个正则表达式匹配到的数据,待确认)自己的理解,
模板Template
的含义是提取结果的返回格式模板(当你在Regular Expression(正则表达式)
处设置多个提取点时,例如"errmsg":"(.*)","access_token":"(.+?)"
,那么提取的多个值将以模板Template设置的格式来返回给用户)。目前自己从其他网商博客了解的信息是,如果在提取器的
正则表达式
处填写了多个提取点(例如,"errmsg":"(.*)","access_token":"(.+?)"
。这对于Jmeter来说,会将此表达式当作两个正则表达式来处理——"errmsg":"(.*)","access_token":
和,"access_token":"(.+?)"
,则可以在Template
处填写$1$
、$2$
等等。$1$
代表第一个正则表达式"errmsg":"(.*)","access_token":
的截取结果,$2$
代表第二个正则表达式,"access_token":"(.+?)"
的截取结果,依次类推(注:如果在Template处填写的$1$
和$2$
间有空格,提取出的(.*)
和(.+?)
也会以对应空格间隔)。$0$
指全文匹配,$1$ $2$
指同时获取第一个和第二个提取点。Match No.(第几个匹配成功的)
Default Value(当未匹配到时,使用此值返回)
用于获取 每个请求 取样器 返回的 数组内容
即获取一个请求的多条重复数据,补入这篇博客(三),是否有效待验证
-
jmeter正则表达式提取器
2022-04-25 09:34:251)如何创建提取器 右击Http请求--添加--后置处理器--正则表达式提取器。 2)比如要拿到手机号的归属地 3)想要查看数据有没有拿到可以用--Debug Sampler查看 右击线程组--sample--添加Debug Sampler ...案例:拿到手机号归属地的值去查询该城市的天气
1)如何创建提取器 右击Http请求--添加--后置处理器--正则表达式提取器。
2)比如要拿到手机号的归属地
3)想要查看数据有没有拿到可以用--Debug Sampler查看
右击线程组--sample--添加Debug Sampler
4)使用Debug Sampler查询提取出来的数据
5)把提取出来的数据放到天气查询里,作为参数使用
6)最后在查看结果树里面看结果是不是提取的手机号归属地
-
JMeter关联:JMeter正则表达式提取器与JSON提取器
2019-06-21 17:22:31JMeter关联的实现1、关联的释义与简单示例2、常用正则表达式详解3、正则表达式提取器2、JSON值提取 前言:下文中会多次使用到【BeanShell Sampler】和【Debug Sampler】,前者的作用是模拟一个请求,返回自定义的...JMeter使用正则表达式和JSON提取器实现关联
前言
本文主要内容是:使用使用正则表达式提取器和JSON提取器实现关联。
下文中会多次使用到
BeanShell Sampler
和Debug Sampler
,前者其实是起到一个mock server
的作用,返回自定义的响应结果,后者能够输出JMeter
的变量情况。关于JMeter的使用,花费大量精力写了JMeter的一系列文章,有图有案例,一方面总结起来作为备忘,一方面希望能给初学者一些帮助。觉得有所帮助的朋友,请点个赞,对于疏漏之处也欢迎指教。
- JMeter逻辑控制器:https://blog.csdn.net/mu_wind/article/details/91879280
- JMeter配置元件:https://blog.csdn.net/mu_wind/article/details/92796646
- JMeter操作Mysql数据库: https://blog.csdn.net/mu_wind/article/details/93312052
- BeanShell Sampler与BeanShell断言:https://blog.csdn.net/mu_wind/article/details/93506974
- JMeter Linux下执行测试:https://blog.csdn.net/mu_wind/article/details/95733081
- JMeter自定义日志与日志分析:https://blog.csdn.net/mu_wind/article/details/95752633
1 关联的释义与示例
关联在接口测试中是一个非常重要的概念,它的意思是在两个或多个接口间建立逻辑上的依赖与联系。
关联的使用场景往往要满足以下条件:
- A接口响应结果中的数据被后续的接口所引用
- A接口响应结果中被后续接口引用的数据是动态变化且无法提前预知的
例如,登录接口-下订单接口这样2个接口组成的流程,就是非常典型的关联案例。
首先,登录接口返回包含用户身份认证信息的
token
,后续的下订单接口需要附带上这个token
才能被服务器识别身份。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
要想实现这个场景,我们需要这么做:
- 在登录接口响应结果中将
token
提取出来并保存在变量中,这里可以使用【正则表达式提取器】和【JSON提取器】。 - 在后续接口中引用已经保存好的
token
,一般通过【HTTP信息头管理器】
形成的脚本如下。
1、登录接口的响应结果:
{ "code" : 200, "msg" : "SUCCESS", "data" : { "accessToken" : "PJqx4566Ggf10qJv6firYAFS408p0us", "info" : { "id" : 10000, "level" : 0, "twiceGoogleAuth" : false, "twiceMobileAuth" : true, "twiceEmailAuth" : false, "tradePwdAlways" : false, "tradePwdHours" : false, "lastLoginDate" : null, "lastLoginAddress" : null, "depositFlag" : true, "loginCount" : 0, "emailRegister" : false, "nation" : 211, "webLoginCount" : 0 } } }
2、从登录接口响应结果中提取
token
的值,并保存到名称为myToken
的变量中:
3、引用前面保存的token值(前面保存变量为什么,这里就引用什么)
4、后续接口中,成功引用了到了myToken
的值:
接下来,我们以 WeatherWS 这个网站的两个接口为示例,使用【正则表达式提取器】完成一个关联实现。
接下来的测试场景是这样的:
- 请求
getRegionProvince
接口,得到包含各个省份code
的列表,并在这个列表里提取北京的code
- 将北京的
code
作为getSupportCityDataSet
接口theRegionCode
参数的参数值,请求接口得到北京下辖的行政区域列表。
getRegionProvince的接口说明如下:GET /WebServices/WeatherWS.asmx/getRegionDataset? HTTP/1.1 Host: ws.webxml.com.cn HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <schema xmlns="http://www.w3.org/2001/XMLSchema">schema</schema>xml</DataSet>
getSupportCityDataSet的接口说明如下:
GET /WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=string HTTP/1.1 Host: ws.webxml.com.cn HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <schema xmlns="http://www.w3.org/2001/XMLSchema">schema</schema>xml</DataSet>
根据上面的接口说明,先建立下面的脚本:
整体的脚本结构如上图所示,下面依次看每个组件的内容和作用。1、【HTTP请求】
getRegionProvince
:
- IP:ws.webxml.com.cn
- 路径:/WebServices/WeatherWS.asmx/getRegionDataset
- 作用:获得中国省份、直辖市、地区;国家名称(国外)和与之对应的ID
- 相应结果(为节省篇幅,删除了大量无关数据):
<?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <xs:schema id="getRegion" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <getRegion xmlns=""> <Province diffgr:id="Province5" msdata:rowOrder="4"> <RegionID>3117</RegionID> <RegionName>河北</RegionName> </Province> <Province diffgr:id="Province29" msdata:rowOrder="28" diffgr:hasChanges="inserted"> <RegionID>311101</RegionID> <RegionName>北京</RegionName> </Province> <Country diffgr:id="Country1" msdata:rowOrder="0"> <RegionID>3320</RegionID> <RegionName>阿尔及利亚</RegionName> </Country> </getRegion> </diffgr:diffgram> </DataSet>
观察相应结果,北京的
RegionID
是311101,但如何将它提取出来并保存到变量中呢?这就要用到【正则表达式提取器】了。在HTTP请求getRegionDataset
上添加【后置处理器】-【正则表达式提取器】。2、【正则表达式提取器】:
- 引用名称:code,后面引用该值时,将使用
${code}
的固定写法。 - 正则表达式:
<RegionID>(.+?)</RegionID>\r\n\ <RegionName>北京</RegionName>
,注意中间的8个空格,不能多一个也不能少一个。 - 模板:
$1$
,表示取第一列,下文【正则表达式提取器】会有详细解释。 - 匹配数字:1,表示取第一行,下文【正则表达式提取器】会有详细解释。
3、【HTTP请求】
getSupportCityDataSet
:
- IP:ws.webxml.com.cn
- 路径:/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=${code}
- 作用:获得支持的城市/地区名称和与之对应的ID
- 相应结果:
2 常用正则表达式详解
正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式是相对繁琐抽象的,理解和记忆难度较高,因此这里对JMeter中能用到的正则表达式语法(主要是限定符)进行一下讲解。
据我个人经验,(.+?)这个表达式基本就够用了,何况正则表达式提取远不如JSON提取器使用频率高,所以这一节大可以略过,直接看第三节。
字 符 描 述 . 匹配除换行符 \n 之外的任何单字符 * 贪婪,匹配前面的子表达式零次或多次,等价于{0,} + 占有,匹配前面的子表达式一次或多次,等价于{1,} ? 懒惰,匹配前面的子表达式零次或一次 ,等价于 {0,1} {n} n 是一个非负整数。匹配确定的 n 次。例如a{3}匹配“aaaaa”,能匹配到“aaa” {n,m} 重复n到m次,例如正则 “a{3,4}” 将a重复匹配3次或者4次 *? 重复任意次,但尽可能少重复,如 “acbacb” 正则 “a.*?b” 只会取到第一个"acb" +? 重复1次或更多次,但尽可能少重复,与上面一样,不同的是至少重复一次 ?? 重复0次或1次,但尽可能少重复,如 “aaacb” 正则 “a.??b” 只会取到最后的三个字符"acb" {n,m}? 重复n到m次,但尽可能少重复,如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是0次所以取到结果为空 {n,}? 重复n次以上,但尽可能少重复,如 “aaaaaaa” 正则 “a{1,}” 最少是1次所以取到结果为 “a” 部分表达式使用【正则表达式测试器】实测结果如下:
*
:0次或多次,因为0个也被能匹配,所以b、c和末尾被匹配成空
+
:一个或多个,因为至少要匹配一个,不会有空字符串
?
:0个或一个,同*一样,没有a的被匹配成空字符串
a{n}
:
a{n,m}
:
a{n,}
:
3 正则表达式提取器
正则表达式提取器一般在取样器上创建,它的作用是在取样器(包括HTTP请求和BeanShell Sampler及其他取样器)的结果中按照一定的规则提取特定的值,并保存到内存中的某一个字段上,正则表达式所在的取样器之后的组件,都能通过引用方式(格式:
${XXX}
)使用该值。
3.1 参数详解
名称 描述 必须 名称 脚本中显示的这个元件的描述性名称 是 Apply to Main sample only:仅适用于主样本,默认用这个就可以了 是 Field to check 要检查的响应字段,即在取样器响应内容的哪个区域进行匹配 是 Name of created variable 引用名称,即匹配到的变量存储的名称,一般会有[refname]_g(匹配数量)、[refname]_g0 (整体)、[refname]_gn(某个具体匹配值)等多个变量, 是 Regular Expression 正则表达式,用于分析响应数据的正则表达式,除非使用$0$组,否则必须至少包含一组括号 是 Template 模板,如果在正则表达式中有多列结果,则可以是$2$$3$等等,表示解析到的第几个值给title,如:$1$表示解析到的第1个值 是 Match No. (0 for Random) 匹配数字,取第几行,0代表随机取值,-1代表全部取值,1、2、3等表示多行返回值取第几个值。 是 Default Value 缺省值,如果表达式没有取得到值,就使用这个默认值 是 Use empty default value 勾选此项后,如果未提取到值,则给变量赋予空字符串,而不是null 是 3.2 使用示例
先看这么一个场景,假如响应内容
ccBBmmAABBAAddBBAA
,想在该响应内容中提取AAddBB
并存储到参数test
中,该如何处理?首先,观察待匹配字符串的左右边界分别是
BB
和AA
,那么正则表达式应写成BB(.+?)AA
,在【正则表达式测试器】中测试一下:
可以看到,第1列(列从0开始计数)第二行是我们想要的结果,因此【正则表达式提取器】中按下图填写:
接下来,我们使用【BeanShell Sampler】模拟服务,来测试一下:
HTTP请求IP中引用正则表达式提取器提取到的test
:
4 JSON提取器
在【后置处理器】中,有一个【JSON提取器】,与【正则表达式提取器】有类似的作用,不同的是,前者专为处理JSON型的响应结果而生。
4.1 参数详解
名称 描述 必须 Name 名称,脚本中显示的这个元件的描述性名称 是 Names of chreated variables 匹配到的数据存储的变量名称,后续可以使用 ${variable name}
引用它是 JSON Path Expressions JSON路径表达式 是 Default Values 默认值,如果JSON 路径表达式未能匹配到值,将使用该默认值 是 Match No. (0 for Random) 如果匹配到多个结果,选择使用哪个。0代表随机,-1代表全部,x代表第x个 是 Compute concatenation var 勾选此项后,如果匹配到多个结果,JMeter会使用","将他们连接起来,存储在的变量中 是 4.2 使用示例
接下来,我们看一个示例:
假如接口返回下面的JSON数据,我们想在其中提取“周芷若”到“name”参数中。
{ "status":200, "data":[{"id":101,"name":"张无忌"},{"id":102,"name":"周芷若"}] }
首先,构造脚本结果如下图,【BeanShell Sampler】作为mock server返回上面的数据:
return "{\"status\":200,\"data\":[{\"id\":101,\"name\":\"张无忌\"},{\"id\":102,\"name\":\"周芷若\"}]}";
在【BeanShell Sampler】下面添加【后置处理器】–【JSON Extractor】
这里解释一下【JSON Path expression】的写法,- . 首先
$.
这部分是固定写法 data
表示在JSON串以"data"为key获取value,也就是"[{\"id\":101,\"name\":\"张无忌\"},{\"id\":102,\"name\":\"周芷若\"}]
"。data
所对应的值是一个JSONArray
(JSON数组)格式,里面有两个JSONObject(JSON对象),第二个JSONObject是我们需要的,因此再按索引值"1"去获取,写作data[1]
,写到这里,我们得到了{\"id\":102,\"name\":\"周芷若\"}
这个JSONObject
,接下来再根据name
这个key去获取相应的值,就得到"周芷若"了。
运行脚本,查看结果树中的【Debug Sampler】的响应数据:
后来在自己开发接口自动化框架的过程中,借鉴JMeter的这个功能,做了一个工具类,在响应结果是JSON串的接口中提取数据十分方便。
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author guozhengMu * @version 1.0 * @date 2018/12/20 13:07 * @description 根据自定义的字符串解析提取json中的特定内容 * @modify */ public class JsonPathExpression { public static void main(String[] args) { String str = "{\"data\" : {\"deth\" : {\"bids\" : [[\"3.637\", \"360000\"]],\"asks\" : [[\"4.273\", \"662\"],[[{\"a\":[1,2]}]]]}}}"; // String result = jsonPathExpression("{\"status\" : 200,\"employees\" : [{\"firstName\" : \"Bill\",\"lastName\" : \"Gates\"}, {\"firstName\" : \"George\",\"lastName\" : \"Bush\"}]}", "$.employees[1].firstName"); String result = jsonPathExpression(str, "$.data.deth.asks[1].[0].[0].a[1]"); System.out.println(result); } /** * 根据路径表达式解析JSON * * @param jsonString 待处理的字符串 * @param matcher 路径表达式 * @return */ public static String jsonPathExpression(String jsonString, String matcher) { String[] jsons = matcher.split("\\."); JSONObject object = JSON.parseObject(jsonString); JSONArray array = new JSONArray(); String result = ""; int index; for (int i = 1; i < jsons.length; i++) { if (jsons[i].contains("[")) { // 解析数字 index = getIndex(jsons[i]); if (i == jsons.length - 1) { // 最后一层 // 特殊情况处理 if (jsons[i].length() <= 3) { // []必然是从array中取值 result = array.getString(index); } else { array = object.getJSONArray(jsons[i].split("\\[")[0]); result = array.getString(index); } } else { // 不是最后一层 if (jsons[i].length() <= 3) { try { array = array.getJSONArray(index); } catch (Exception e) { object = array.getJSONObject(index); } } else { // 不知道下一层是array还是object try { array = object.getJSONArray(jsons[i].split("\\[")[0]).getJSONArray(index); } catch (Exception e) { object = object.getJSONArray(jsons[i].split("\\[")[0]).getJSONObject(index); } } } } else { if (i != jsons.length - 1) { object = object.getJSONObject(jsons[i]); } else { result = object.getString(jsons[i]); } } } return result; } /** * 将字符串中的数字解析出来 * * @param string:待处理的字符串 * @return */ public static int getIndex(String string) { try { String regEx = "[^0-9]"; Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(string); String index = matcher.replaceAll("").trim(); return Integer.valueOf(index); } catch (Exception e) { return 0; } } }
5 疑难杂症
这一节主要记录一些比较特殊的场景和其解决方案。
5.1 提取多个值
- 响应结果:
{ "result" : { "similar" : [{ "id" : "us-B072HFDHKY", "asin" : "B072HFDHKY" }, { "id" : "us-B073WM827B", "asin" : "B073WM827B" }, { "id" : "us-B07GY17KFZ", "asin" : "B07GY17KFZ" }, { "id" : "us-B076NYPS7M", "asin" : "B076NYPS7M" }, { "id" : "us-B07NSBBX7L", "asin" : "B07NSBBX7L" }, { "id" : "us-B077W9GHDV", "asin" : "B077W9GHDV" } ] }, "code" : 0, "message" : "操作成功!" }
- 实现目标:在响应结果中前3个 asin 的值。
以上场景,响应结果是JSON格式,在正常情况下,使用【后置处理器】中的【JSON Extractor】显然是很方便的(提取路径:
$.result.similar[0].asin
即可获取第一个 asin 的值)。但由于要提取不止一个 asin 值,【JSON Extractor】就不太适用了,这时候要用到【正则表达式提取器】。- 建立下面的脚本结构:
【BeanShell Sampler】的作用依然是模拟接口响应:
return "{\"result\":{\"similar\":[{\"id\":\"us-B072HFDHKY\",\"asin\":\"B072HFDHKY\"},{\"id\":\"us-B073WM827B\",\"asin\":\"B073WM827B\"},{\"id\":\"us-B07GY17KFZ\",\"asin\":\"B07GY17KFZ\"},{\"id\":\"us-B076NYPS7M\",\"asin\":\"B076NYPS7M\"},{\"id\":\"us-B07NSBBX7L\",\"asin\":\"B07NSBBX7L\"},{\"id\":\"us-B077W9GHDV\",\"asin\":\"B077W9GHDV\"}]},\"code\":0,\"message\":\"操作成功!\"}";
-
【正则表达式提取器】:
正则表达式:"asin":(.+?)"}
-
运行脚本,查看结果:
可见,所有 asin 值已经被提取并保存在内存中,后续的组件中可以任意引用。 -
引用值
5.2 多个值合并
如果响应内容是
<name = Author value = Muguozheng>
,我们同时提取到Author:Muguozheng
、Author
、Muguozheng
作为下次请求参数,该如何做呢?首先,去【正则表达式试验器】中测试
根据匹配要求和正则表达式的测试结果,【正则表达式提取器】如下:
正则表达式:<name = (.+?) value = (.+?)>
模板:$1$;$2$
运行后查看结果树,后面的sampler(取样器)引用规则如下:
- 使用
${test}
可以引用Author:Muguozheng
- 使用
${test_g}
可以引用2
这个数值 - 使用
${test_g0}
可以引用<name = Author value = Muguozheng>
- 使用
${test_g1}
可以引用Author
- 使用
${test_g2}
可以引用Muguozheng
5.3 左右边界不好确定
假如响应结果是这么一个字符串:
<name = Readers value = 马云,马化腾,刘强东>
(向三位大佬致敬),想要提取马化腾
这个值。这个例子的难点在于,正则表达式的左右边界无法确定,因为
马化腾
的右边界,刘强东
也是响应内容中的动态值(这里的动态指的是,下次请求整体的响应内容可能变成"<name = Readers value = 张三,李四,王五>")。这里,正则表达式写成下面的样式即可:
于是,【Beanshell Sampler】写入模拟数据return "<name = Readers value = 马云,马化腾,刘强东>";
【正则表达式提取器】可以如下图输入:
正则表达式:<name = Readers value = (.+?),(.+?),(.+?)>
模板:$2$
运行后查看结果树:
5.4 多个匹配结果
在实际工作中,接口响应结果可能是一个集合,具有同样的左右边界,但我们需要的是最新的那条,一般是最后一条。
如下,新建一个【Beanshell Sampler】模拟接口:
return "<td>您的验证码是:400836,切勿将验证码告诉他人<td><td>您的验证码是:54297,切勿将验证码告诉他人<td><td>您的验证码是:65291,切勿将验证码告诉他人<td>";
接下来在【Beanshell Sampler】下创建【正则表达式提取器】(匹配数字写-1,表示取所有匹配结果):
正则表达式:您的验证码是:(.+?),切勿将添加【Debug Sampler】和【查看结果树】后运行脚本,在【查看结果树】中可以看到,【正则表达式提取器】匹配结果:
code_1=400836 code_1_g=1 code_1_g0=您的验证码是:400836,切勿将 code_1_g1=400836 code_2=54297 code_2_g=1 code_2_g0=您的验证码是:54297,切勿将 code_2_g1=54297 code_3=65291 code_3_g=1 code_3_g0=您的验证码是:65291,切勿将 code_3_g1=65291 code_matchNr=3
那么我们想获得匹配结果的最后一个,该怎么操作呢?这个问题的难点在于,事先无法确定匹配结果的数量,而解决这个难点的关键就在于
code_matchNr
这个参数,它的含义是匹配到的结果的数量,它的值就是最后一个匹配结果的索引。很明显,取
code_${code_matchNr}
就等值于code_3,无论匹配结果的数量是多少,code_${code_matchNr}
都代表着最后一条结果。JMeter不支持嵌套引用,所以
${code_${code_matchNr}}
这种写法是不正确的。想正确引用该值,需要打开【Tools】-【函数助手对话框】,选择_V
,填入code_${code_matchNr}
,点击生成:
${__V(code_${code_matchNr})}
这个表达式就表示引用了匹配结果的最后一个。5.5 其他特殊用法
在身份证中匹配提取出生日期,正则表达式如下图:
以上就是如何使用正则表达式提取器和JSON提取器实现关联的全部内容,觉得不错的朋友请点个赞和收藏,有不准确之处,欢迎指正。
-
Jmeter 正则表达式提取器的用法
2021-04-25 15:48:29一、正则表达式提取器各名词解 (1)Apply to Main sample and sub-samples( 作用于主节点的取样器及对应子节点的取样器) Main sample only( 仅作用于主节点的取样器) Sub-samples only( 仅作用于子节点的取样... -
Jmeter正则表达式提取器:模板&匹配数字详解
2021-02-25 10:52:40正则表达式2.模板3.匹配数字二、例子1.【模板&匹配数字】2.【例-贪婪&非贪婪】3.【例-普通】 一、相关理论 1.正则表达式 ():要提取的内容 .:匹配任意单个字符串 *: 匹配(之前的符号)0次或多次 +:匹配... -
Jmeter 正则表达式提取器 的使用
2020-09-12 17:44:04正则表达式提取器 应用场景:上一接口请求回来的参数下一个接口需要用到某一个参数 比如页面展示列表 点击某个列表查看详情,这时我们就需要用到 正则表达式提取器了。因为查看详情需要用到点击该列表的 id 在HTTP... -
Jmeter正则表达式提取器和Json Extractor使用
2020-07-16 01:12:55一:正则表达式提取器 HTTP请求-后置处理器-正则表达式提取器 2.看一下需要提取的响应信息,在察看结果树的响应信息里查看 (此为访问一个登录系统的响应信息) 提取登录后获取的token,作为请求参数,用于其它... -
Jmeter正则表达式提取器获取Token-简单实例
2020-03-13 11:16:59上图中Login接口的Response中有用户token,该token需要在下一个需求提报的接口中使用,所以在Login下添加“正则表达式提取器” 步骤2:选择Login,鼠标右键选择“添加->后置处理器->正则表达式提取器” ... -
jmeter设置全局变量与正则表达式提取器过程图解
2020-08-25 13:25:58主要介绍了jmeter设置全局变量与正则表达式提取器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
JMeter正则表达式提取器实践
2020-04-22 11:09:04我们在使用JMeter做接口自动化的过程中,对正则表达式...现在的问题是,如果我们要使用正则表达式提取后的:使用其中的第1个和第10个值,我们应该怎么去实现呢? 肯定会有小伙伴会说,可以使用第三方的插件来实现,... -
Jmeter正则表达式提取器-一些常用技巧
2020-07-28 08:59:211、提取全部:^(.*)$ 2、提取中间某一段:(.*?) 或(.+?) 3、从中间某处提取到末尾:([^"]+) 4、转义:\ 5、换行:\n 6、\d+ 是来匹配1个或更多连续的数字 ps:(.+?) 和 (.*?) 的区别: (.+?)提取1个字符串及... -
jmeter 正则表达式提取器详细讲解
2019-07-23 15:18:51正则表达式入门教程:http://deerchao.net/tutorials/regex/regex.htm 表1.常用的元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d ... -
jmeter的正则表达式提取器的用法和正则
2021-10-27 17:07:23这里介绍的是jmeter的正则表达式提取器 1,把正则表达式添加到需要提取返回内容的http请求里,添加步骤是,,右键http请求--添加--后置处理器--正则表达式处理器 2,在正则表达式提取器配置设置页里, 1)要... -
JMeter正则表达式提取器使用详解
2020-04-04 08:37:37Jmeter正则表达式提取器使用详解 整体目录结构: http请求的访问地址为: http://www.stats.gov.cn//tjsj/tjbz/tjyqhdmhcxhfdm/2019/14/1402.html 需要抓取的内容为: <tr class='countytr'><td... -
Jmeter正则表达式提取
2022-02-21 17:12:00Jmeter提供边界值提取、正则表达式提取、JSON提取、xpath提取 提取器主要功能: 可以提取接口返回体(响应结果)的内容。实现从上一个请求获取下一个请求需要回传回去的数据 例如: Jmeter接口测试时,许多请求都... -
JMETER正则表达式提取器
2021-03-19 22:25:40正则表达式提取器的位置: 你想谁用,你就放在谁的下面 这个正则表达式是用途是:你想在某个请求的响应结果里面拿到某个值 如果想要取值:例如:“msg”:“登陆成功”} 步骤如下: 1.确定他的左右边界 2.写正则... -
jmeter 正则表达式提取器 遇见请求响应参数编译符号\怎么解决
2019-04-12 14:59:29jmeter 正则表达式提取器 下面是各参数值的含义: 参数 释义 引用名称 在HTTP等请求中,引用此数据,需要用到的名称 正则表达式 用于将需要的数据提取出来 模板 表示使用提取到的第几个值: $ 1$ :表示取第1... -
JMeter练习(六):正则表达式提取器的简单使用示例
2022-03-10 15:00:381. 正则表达式提取器页面解析 2. 示例:通过HTTP请求取样器获取MySQL数据库表的数据,用正则表达式提取器从数据中提取需要的用例信息 2.1 准备工作:数据库表中的用例信息 2.2 准备工作:启动SpringBoot项目 2.3... -
jmeter 正则表达式提取器获取数组数据
2019-08-23 16:14:46当我们的请求有 这种类型的多种数据,我们要怎么获取到全部?...首先,先在正则表示式提取器里面添加我们找到的左右边界 然后写好正则表达式 最后确定边界是唯一的 然后我们运行一下,一下只就运行全部出来了 ... -
jmeter-正则表达式提取器
2021-07-23 17:38:46jmeter-正则表达式提取器jmeter-正则表达式提取器 jmeter-正则表达式提取器 引用名称:在HTTP等请求中,引用此数据需要用到的名称 正则表达式:用于将需要的数据提取出来 模板:表示使用提取到的第几个值。"$ 1 $... -
jmeter正则表达式提取器-获取数组数据
2019-10-04 18:25:14场景: ... 把以下菜单名字获取到 ...2、添加正则表达式提取器 -1表示获取所有匹配到的值 发送请求,查看结果,已经全部匹配到了 转载于:https://www.cnblogs.com/feichuyan/p/11133417.html... -
详解JMeter正则表达式提取器
2018-07-10 16:06:27应用场景:在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器,其中最方便最常用的就是正则表达式提取器了。...