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":"操作成功"
}

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

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

. : 匹配任何字符

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

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

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

二、提取多个字符串

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

符合要求的正则表达式:

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

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

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

三、关键字

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

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

[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中 的括号就得用到转义

四、实操项目例子

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

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

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

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

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

说明:

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

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

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

$-1$:表示取所有值

$0$:表示随机取值

$1$:表示取第1个

$2$:表示取第二个

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/LYX_WIN/article/details/108082933
今日推荐