jmeter的正则表达式

前言:

正则表达式,是对字符串操作的一种逻辑公式,也就是说事先定义好一些特殊字符,以及这些特定字符的组合,组成一个“规则字符串”

这里先说一下,正则表达式里面一些特殊字符的含义:

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

.:匹配任何字符

+:一次或多次

?:不要贪婪,在找到第一个匹配项后停止

.*:任意字符

d:数字字符匹配,等效于[0,9]

"name":"(.+?)"  大概意思就是左边界是name:右边括号内的匹配任何字符,至少匹配一次,找到匹配项后就停止

场景:

为什么要用正则表达式呢,有什么作用呢。这对我们测试有什么用?

一个很简单的例子,我们去12306买票的时候,是不是要先登录呢,登录完,再买票,这样系统才能识别到你这个用户,那登录后,服务器会返回一个凭证信息给你,表示

你这个用户有权利去购票,获得了网站的访问权利,那么这个凭证信息就是一个token,然后再点击购票操作,通过这个token,系统才能识别,诶,这个购票信息是这个用户的。

通过以上这个例子,不难理解,正则表达式就是运用在前面一个操作获取到的动态值,用到下面一个操作当中。(本人的理解,如有疏漏,可指正)那么这个动态值就可以用正则表达式提取出来,然后通过参数传递给其他要用到的请求当中。

配置说明:


点击前一操作(就是你要从这个请求中获取返回值的一个请求),右键-》添加-》后置处理器-》正则表达式提取

 名称:这个提取器的名称

apply to:运用于,一般是这个Main sample only

要检查的响应字段:样本数据源。

主体: 接口响应主体内容,一般要提取普通http响应结果的数据,都勾选这个。

信息头:响应头的所有内容。
Request Headers:请求头的所有内容。
url:是对sample的url进行匹配,也就是查看结果树里请求内容的第一行url,不包含data里的请求参数(即只能匹配protocol(协议)+host+path+querystring,如:https://www.baidu.com/index.php?tn=monline_3_dg)。
响应代码:http响应代码,如101,200,302,404,501等。
响应信息:http响应代码对应的响应信息,例如:OK, Found(HTTP/1.1 200 Ok;HTTP/1.1 302 Found)。

引用名称:就是其他人来用时写的名字

正则表达式:数据提取器

一般简单的通用语法就是:左边界(.*?)右边界,左右边界就是为了能准确定位到想匹配的内容,比如说"token":"(.*?)","sex":(.*?),"userName", 其中"token":"以及","sex": 和,"userName"这3个就是左右边界,(.*?) 是替换了想要提取的内容,里面的'?'为非贪婪匹配,(非贪婪模式就是说在遇到第一个右边界后就停止匹配,这样就可以精确拿到想要的内容)。建议均使用非贪婪匹配,除非特殊情况。

模板:对应正则表达式提取器类型,样式为:$n$。若模板为:$0$,则为整个表达式匹配到的内容,就是包括小括号内跟小括号外的内容,即("token":"83EEAA887F1D2F1AA1CDA9E197810992","sex":0,"userName")。若模板为:$1$,则对应正则表达式中的第一个(.*?)所匹配的内容,即(83EEAA887F1D2F1AA1CDA9E197810992) ,若模板为:$2$,则对应正则表达式中的第二个(.*?)所匹配的内容,即(0),若模板为$1$$2$,则把2个(.*?)所匹配的内容拼接起来,即(83EEAA887F1D2F1AA1CDA9E1978109920)。模板是可以自由组合的,后续案例中再介绍。

匹配数字:正则表达式匹配数据的最终结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。当为 0 时,随机返回匹配的数据。当为 1 时,表示返回匹配结果数组的第一个元素。当为负数(-1,-2,-100都可以)时,表示返回全部元素,并且同时会返回一个元素总数的变量token_matchNr,在引用时:通过${token_1}的方式来取第1个匹配的内容,${token_2}来取第2个匹配的内容。
缺省值:匹配失败时的默认值。通常用于后续的逻辑判断,建议使用一些特殊含义的,比如0,NULL,ERROR等。
 
 引用这篇博客,写的很详细,我这里记录下,到时候自己可以查看https://www.cnblogs.com/VashGu927/p/7640447.html
 
了解了这些后,下面开始实操啦
 
实操一:
 
测试场景:用户要登录系统,然后充500块钱。
首先,添加一个登录请求,添加一个查看结果树,看登录请求响应信息里,返回的cookie在哪里

 说明下:cookie是保持你访问权限的信息,session是限制访问权限信息的有效期,我们在访问网页时久了不操作是不是会提示会话超时什么的,这个时候要我们重新登录

cookie是在浏览器的,session是保存在服务器上的。客户端浏览器在访问服务器的时候,服务器会将客户信息以一种特殊的形式记录在session上,session是需要cookie支持的,所以session一般都保存在cookie上,有了这个session,才能保持会话。

回到主题。。。

既然我们知道了这个jsessionid在哪里,那这个时候就在登录请求后,添加一个正则表达式提取器

 配置一个引用名称,这个名称在我们充钱的时候要用到,正则表达式,就是根据我们的匹配规则配置,模板设置${1}表示获取匹配到的第一个数据

添加完正则表达式之后,添加一个debug sampler(调试样本),可以看正则表达式是不是可以返回对的数据

下面运行下,看看结果,看如下,在这个响应消息体里面就看到了正则表达式的结果了

接下来,配置充钱接口,在充钱接口后添加一个http cookie管理器

 运行,查看结果

 那么问题来了,如果我充值完,还要把钱取出来怎么办,还是要保持这个会话,也就是说,这个cookie运用在多个请求里面,这个时候,就需要把http cookie管理器放到测试计划里面这样的话里面配置的内容就适用于所有请求,(用到多个线程组,我没试过哈,大家可以试试)

 盘点下遇到的坑;

1、请求里面的jsessionid={1},看下面

找了半天原因,发现是我在正则表达式里面的模板写成了{1},相当于写死了,应该是$1$,谨慎啊,同志们。。。

坑二:通知请求调试器,发现死活都返回不了正则表达式返回的值,这个时候就应该去检查正则表达式的匹配写的对不对了,这里我重新复制了一下登录响应数据里面返回的set-cookie:...那一串。直接复制过去,不要手打!!!,因为你手打的话,可能会有写空格不对,或者符号不对,那复制是不是更省事呢???通过这个骚操作,再运行下,O了

每天进步一点点 分享快乐
原文地址:https://www.cnblogs.com/zhangyqn/p/11820465.html