如果你在JMeter脚本中看到这样一些符号:(.*?)(\d+),你是否会以为程序出现了乱码?拆开来看每个符号似乎都有固定的含义,组合在一起竟成了令人费解的天书。这些神秘符号究竟蕴含了哪些强大的功能,下面让我们一起来揭开它的面纱。
一、什么是正则表达式
上文提到的特定符号的组合叫做正则表达式,在JMeter工具中用来表达对字符串的一种逻辑过滤。正则表达式的功能分为“提取”和“匹配”,前者用来从字符串中获取我们想要的部分,后者用来将提取到的字符串和一个给定的字符串做比对。正则表达式的好处自然不言而喻,它实现了通过极其简单的方式达到字符串的复杂控制,同时兼具了灵活性与逻辑性。
二、如何添加正则表达式
1、添加正则表达式提取器
HTTP请求->添加->后置处理器->正则表达式提取器。
正则表达式的作用范围为线程组,因此正则表达式的层级应该位于需要提取返回值的请求器下面,即作为请求的子器件,并且需要通过正则表达式进行数据关联的两个请求应放在同一个线程组内。
2、书写正则表达式
正则表达式提取器包含以下元素:
名称:定义了正则表达式的名称
注释:编写脚本时的注解
应用范围:应用于主取样器或子取样器,一般使用默认选项
要检查的响应字段:样本数据源
引用名称:在其他取样器中引用变量的名称,用法为${引用名称}
正则表达式:数据提取器,()里面是响应报文中匹配数据的规则
模板:用$$括起来,如果包含多个正则表达式,$1$表示提取第一个正则表达式解析出来的值,$2$表示第二个正则表达式提取结果,等等。
匹配数字:正则表达式匹配数据的所有结果可以看做一个数组,匹配数字可以看做是数组的第几个元素。-1表示全部,0表示随机,1是第一个,2是第二个,依此类推。
缺省值:如果提取失败,引用变量的默认值,可以为空。
三、如何使用正则表达式
那么,正则表达式要如何使用呢,它有哪些常见的使用场景呢,下面让我们通过几个例子来学习正则表达式的用法。
场景一:获取网站登录信息Token
我们在使用JMeter录制web脚本时,常常需要使用Token作为用户身份鉴别的标志。Token是服务端为每个用户创建的一个令牌,当该用户第一次登录时,将服务端生成的Token带回客户端,以后客户端请求只需带上这个Token,服务端就能识别出请求方的身份,而无需再次验证用户名和密码。
那么,Token如何获取,又如何动态赋值给下一个请求呢。这里,我们给登录会话添加一个正则表达式提取器。
首先,从登录会话的返回报文中,找到"token: ",然后在脚本中添加正则表达式提取器,引用名称为token,正则表达式为"token":"(.*?)",模板为$1$。这个正则表达式的含义是,()中封装了待返回的字符串,.表示匹配任意字符串,*?表示匹配零次或多次后停止。完整的含义是:匹配开始字符为: ",结束字符为最后一个",匹配两个引号之间的任意字符,匹配一次或者多次,当匹配到第一个字符串即停止,将字符串保存到变量token。
在下一个查询交易请求中,可以直接使用变量${token}关联token信息。线程组循环多次执行,${token}始终保持当前登录状态的取值,并赋值给查询交易的请求。
场景二:性能测试循环使用数据
在进行性能测试时,某些特殊的场景往往导致数据不能循环使用,或者有使用次数限制,而高并发压力测试需要庞大的数据量,因此准备数据费时费力。这时,将两个“反向”的交易串联起来,便可轻松解决数据循环使用的困难。比如做理财购买交易的性能测试时,随着测试轮次的增加,账户余额越来越少,如何方便快捷地实现资金回退呢。根据不同理财产品业务逻辑的差异,有卖出和撤单两种选择。假如当前产品支持实时持有,让客户买完再卖出,相当于前面的购买行为被抵消了。
在设计测试脚本时,需要把购买和卖出请求放在同一个线程组里。首先设计正则表达式,通过"NUM_SEQ_AR ":"(\d+)"提取买入成功返回的合约号,\d表示提取纯数字,一般金融机构合约号都是数字形式存储。
然后通过${Seq}引用合约号,作为卖出交易的输入数据,客户账户信息可以和买入交易来自同一个CSV文件,实现前后交易一致。
通过添加JMeter调试工具,后置处理器->Debug PostProcessor,观察正则表达式运行情况。
正则表达式提取合约号与买入返回报文一致,正则表达式书写正确。
正则表达式看着复杂,其实只要理解了它的用法,在实际使用场景中只需具体问题具体分析,结合资料多动手实践,不管多棘手多复杂的问题都有办法化解。正则表达式蕴含了强大的功能,本文也只是做了最基本的介绍,同学们可以自行摸索更多用法,让我们的性能测试、接口测试变得更加easy!
作者:高晶晶
来源:51Testing软件测试网原创