0
点赞
收藏
分享

微信扫一扫

jmeter之正则表达式的提取与应用


一、提取单个字符

分析数据:

{
"pageSize":20,
"totalPageNum":1,
"totalItemNum":1,
"currentPageNum":1,
"data":[
{
"domain":"testdomainadd0002.com",
"bookEndTime":"2020-08-25 22:50:00",
"type":"PreRelease",
"deleteTime":"2020-08-11",
"channels":[
{
"id":"91",
"name":"GuoYu",
"price":1,
"transferPrice":69
}
],
"_map":{

}
}
],
"code":"200",
"msg":"操作成功"
}

jmeter之正则表达式的提取与应用_字符串

上面的特殊字符包括如下几个:

():封装了待返回的匹配字符串

. : 匹配任何字符

? :不要太贪婪,在找到第一个匹配后停止,如果没有?,在找到第一个name后,还会继续往后找,知道找完并输出最后一个数据

jmeter之正则表达式的提取与应用_字符串_02

尽管上面的表达式可以达到目的,但是更有效率的表达式是:

jmeter之正则表达式的提取与应用_正则表达式_03

 

其中[^"]-意味着匹配任何东西(除了")。在这种情况下,匹配引擎在找到第一个右侧"后,就会停止搜索。而 上面例子中的匹配引擎会去寻找

二、提取多个字符串

假如我要提取上述name的值GuoYu以及price的值1.0

符合要求的正则表达式:

"name":"([^"]+)","price":([^"]+)

这会创建两个组合,并用于jmeter正则表达式的模板,如$1$和$2$

JMeter正则表达式提取器会将组合的值放在指定变量中。

jmeter之正则表达式的提取与应用_正则表达式_04

三、关键字

正则表达式使用特定字符作为关键字,这些字符对正则表达式引擎有特殊意义。在字符串中使用这些字符必须进行转义(使用反斜杠"\"),目的是将它们当成原始字符,而非正则表达式的关键字。下面是关键字和它们的含义

 ^ :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。

[abc] : 字符组,匹配包含括号内元素的字符。

* : 重复零次或更多(贪婪模式)。例如"cccccc" 匹配字符串中所有的c 正则:”c*” 会出到所有的字符”c”。

( ):组合。

[ ]:字符集合。

{n} : 重复n次。例如从"aaaaaaaa" 匹配字符串的a 并重复3次 正则:"a{3}" 结果就是取到3个a字符 "aaa"。

{n,} : 重复n次或更多次。与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则"a{3,}" a至少要重复3次。

{n,m} : 重复n到m次。例如正则 "a{3,4}" 将a重复匹配3次或者4次;所以供匹配的字符可以是三个"aaa"也可以是四个"aaaa"正则都可以匹配到。

{n,m}? : 重复n到m次,但尽可能少重复。如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空

+ : 重复一次或更多次(懒惰模式)。例如"aaaaaaaa" 匹配字符串中所有的a; 正则:"a+"会取到字符中所有的a字符,"a+"与"a*"不同在于"+"至少是一次而"*" 可以是0次。

? : 重复零次或一次。例如"aaaaaaaa" 匹配字符串中的a 正则 : "a?" 只会匹配一次,也就是结果只是单个字符a。

*? : 重复任意次,但尽可能少重复。如 "acbacb" 正则"a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"。

+? : 重复1次或更多次,但尽可能少重复。

?? : 重复0次或1次,但尽可能少重复。如 "aaacb" 正则 "a.??b"只会取到最后的三个字符"acb"。

.:任意匹配字符。

\:转义字符。

\w :匹配字母,数字,下划线,例如我要匹配”12345BCD__TTz" 正则:"\w+" 这里的"+"字符为一个量词指重复的次数。

\s :匹配空格。例如字符 "a b c" 正则:"\w\s\w\s\w" 一个字符后跟一个空格,如有字符间有多个空格直接把"\s" 写成 "\s+" 让空格重复

| -:选择符。

^ $:字符串或行的起始和结尾。

注意:ORO不支持\Q和\E关键字。

例如:需要提取_map中 的括号就得用到转义

jmeter之正则表达式的提取与应用_字符串_05

 

四、实操项目例子

话不多说,我们来看一个例子,例子场景是我们需要在预订列表获取可预订的域名后,再根据其中一个域名获取其可预订的通道

1、首先可以像我一样,对一些服务器的参数做一个全局的参数化,server.csv文件遵循按行读取,逗号分隔多个参数的规则不多讲了

jmeter之正则表达式的提取与应用_正则_06

 

2、分别建立线程组、并建立HTTP Request、Regular Expression、View Results Tree,简单的架构大概是长这样:

jmeter之正则表达式的提取与应用_正则表达式_07

3、可预订列表返回的参数有点复杂:可以像我一样,用RegExp Tester模式下进行正则表达式调试

 

jmeter之正则表达式的提取与应用_字符串_08

4、调试正确后,即可在Regular Expression Extractor中设值

jmeter之正则表达式的提取与应用_字符串_09

说明:

Name of created variable:引用名称,在HTTP等请求中,引用此数据,需要用到的名称

Regular Expression:正则表达式,用于将需要的数据提取出来

Template:模板,表示使用提取到的第几个值:

$-1$:表示取所有值

$0$:表示随机取值

$1$:表示取第1个

$2$:表示取第二个

以此类推:$n$:表示取第n个

Match No:匹配数字,0 代表随机取值,1 代表全部取值

Default Value:缺省值,如果正则表达式没有搜找到值,则使用此缺省值

5、${domain}可以引用到获取可预订列表返回的域名

jmeter之正则表达式的提取与应用_正则_10

 

6、查看结果可以发现返回成功

jmeter之正则表达式的提取与应用_字符串_11

这就是一个简单的应用正则表达式串联关联接口测试的例子!

举报

相关推荐

0 条评论