• 13
  • 13
分享

  如果你在JMeter脚本中看到这样一些符号:(.*?)(\d+),你是否会以为程序出现了乱码?拆开来看每个符号似乎都有固定的含义,组合在一起竟成了令人费解的天书。这些神秘符号究竟蕴含了哪些强大的功能,下面让我们一起来揭开它的面纱。

  一、什么是正则表达式

  上文提到的特定符号的组合叫做正则表达式,在JMeter工具中用来表达对字符串的一种逻辑过滤。正则表达式的功能分为“提取”和“匹配”,前者用来从字符串中获取我们想要的部分,后者用来将提取到的字符串和一个给定的字符串做比对。正则表达式的好处自然不言而喻,它实现了通过极其简单的方式达到字符串的复杂控制,同时兼具了灵活性与逻辑性。

  二、如何添加正则表达式

  1、添加正则表达式提取器

  HTTP请求->添加->后置处理器->正则表达式提取器。

  正则表达式的作用范围为线程组,因此正则表达式的层级应该位于需要提取返回值的请求器下面,即作为请求的子器件,并且需要通过正则表达式进行数据关联的两个请求应放在同一个线程组内。

1-1.jpg

  2、书写正则表达式

  正则表达式提取器包含以下元素:

  名称:定义了正则表达式的名称

  注释:编写脚本时的注解

  应用范围:应用于主取样器或子取样器,一般使用默认选项

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

  引用名称:在其他取样器中引用变量的名称,用法为${引用名称}

  正则表达式:数据提取器,()里面是响应报文中匹配数据的规则

  模板:用$$括起来,如果包含多个正则表达式,$1$表示提取第一个正则表达式解析出来的值,$2$表示第二个正则表达式提取结果,等等。

  匹配数字:正则表达式匹配数据的所有结果可以看做一个数组,匹配数字可以看做是数组的第几个元素。-1表示全部,0表示随机,1是第一个,2是第二个,依此类推。

  缺省值:如果提取失败,引用变量的默认值,可以为空。

1-2.jpg

  三、如何使用正则表达式

  那么,正则表达式要如何使用呢,它有哪些常见的使用场景呢,下面让我们通过几个例子来学习正则表达式的用法。

  场景一:获取网站登录信息Token

  我们在使用JMeter录制web脚本时,常常需要使用Token作为用户身份鉴别的标志。Token是服务端为每个用户创建的一个令牌,当该用户第一次登录时,将服务端生成的Token带回客户端,以后客户端请求只需带上这个Token,服务端就能识别出请求方的身份,而无需再次验证用户名和密码。

  那么,Token如何获取,又如何动态赋值给下一个请求呢。这里,我们给登录会话添加一个正则表达式提取器。

  首先,从登录会话的返回报文中,找到"token: ",然后在脚本中添加正则表达式提取器,引用名称为token,正则表达式为"token":"(.*?)",模板为$1$。这个正则表达式的含义是,()中封装了待返回的字符串,.表示匹配任意字符串,*?表示匹配零次或多次后停止。完整的含义是:匹配开始字符为: ",结束字符为最后一个",匹配两个引号之间的任意字符,匹配一次或者多次,当匹配到第一个字符串即停止,将字符串保存到变量token。

1-3.jpg

  在下一个查询交易请求中,可以直接使用变量${token}关联token信息。线程组循环多次执行,${token}始终保持当前登录状态的取值,并赋值给查询交易的请求。

1-4.jpg

  场景二:性能测试循环使用数据

  在进行性能测试时,某些特殊的场景往往导致数据不能循环使用,或者有使用次数限制,而高并发压力测试需要庞大的数据量,因此准备数据费时费力。这时,将两个“反向”的交易串联起来,便可轻松解决数据循环使用的困难。比如做理财购买交易的性能测试时,随着测试轮次的增加,账户余额越来越少,如何方便快捷地实现资金回退呢。根据不同理财产品业务逻辑的差异,有卖出和撤单两种选择。假如当前产品支持实时持有,让客户买完再卖出,相当于前面的购买行为被抵消了。

  在设计测试脚本时,需要把购买和卖出请求放在同一个线程组里。首先设计正则表达式,通过"NUM_SEQ_AR ":"(\d+)"提取买入成功返回的合约号,\d表示提取纯数字,一般金融机构合约号都是数字形式存储。

1-5.jpg

  然后通过${Seq}引用合约号,作为卖出交易的输入数据,客户账户信息可以和买入交易来自同一个CSV文件,实现前后交易一致。

1-6.jpg

  通过添加JMeter调试工具,后置处理器->Debug PostProcessor,观察正则表达式运行情况。

1-7.jpg

  正则表达式提取合约号与买入返回报文一致,正则表达式书写正确。

1-8.jpg

  正则表达式看着复杂,其实只要理解了它的用法,在实际使用场景中只需具体问题具体分析,结合资料多动手实践,不管多棘手多复杂的问题都有办法化解。正则表达式蕴含了强大的功能,本文也只是做了最基本的介绍,同学们可以自行摸索更多用法,让我们的性能测试、接口测试变得更加easy!


作者:高晶晶   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、目前正在研究jmeter,请问初期做性能,应先从几点做起?Jmeter和LR都是目前性能测试的首选工具,如果你有LR的学习背景,那么Jmeter上手会很快,重点理解线程和进程的概念,流程和LR是类似的。如果没有,从入门的角度我建议先了解常用网络协议和操作系统线程和进程的概念,Jmeter用java比较理想,可以考虑了解一些编程基础。 PS:其实用Jmeter先学习接口测试会更好理解性能。2、请问零基础,计算机硬件专职业转行到这个行业,需要准备哪些?计算机硬件已经具备了基础的计算机知识,要转软件是相对容易的,可以考虑从如下维度准备:1)先准备自己拿手的网络和操作系统部分,网络主要是应用层协议...
            1 1 2389
            分享
          •   苹果与医疗科技公司 Masimo 之间的专利纠纷持续发酵,近期更是发展到 ITC 裁决苹果侵犯 Masimo 专利,可能导致 Apple Watch Series 9 和 Apple Watch Ultra 2 在美国禁售的地步。  根据最新消息,苹果正在探索多种解决方案,其中之一便是通过 Apple Watch OS 10 系统的软件更新尝试规避 Masimo 的专利。  IT之家此前报道,今年 10 月,ITC 裁定苹果手表的血氧传感器侵犯了 Masimo 的两项专利,涉及五项独立的专利侵权行为。目前该案件已进入为期 60 天的总统审查期,将于 12 月 25 日截止。拜登政府可以介入...
            0 0 516
            分享
          • 项目描述被测网址:www.sogou.com指标:相应时间以及错误率场景:线程数20、Ramp-UpPeriod(inseconds)10、循环次数10测试步骤打开jmeter工具,右击“测试计划”-->“添加”-->“线程组”,创建一个线程组。线程组设置(线程数20、Ramp-UpPeriod(inseconds)10、循环次数10):线程数:虚拟用户数。rampupperiod:设置的虚拟用户数需要多长时间全部启动。如果线程数为20,时间为10,也就是每秒钟启动2个线程。循环次数:每个线程发送请求的次数。如果线程数为20,循环次数为100,那么每个线程发送100次请求。总请求数...
            0 0 1201
            分享
          •   当你来到一个项目不规范的技术团队,你会怎么处理呢:  1、流程不规范,没有需求评审和设计评审,需求经常是业务或者项目经理直接跟开发提,有时候开发自己都不明白需求,糊里糊涂地就要开发,也没有设计评审,开发想怎么设计就怎么设计,代码质量差。有时候下游或者上游开发并没有接到需求,然后这边开发完给到测试,测试也一脸懵逼。  2、没有计划,上线时间不是根据开发和测试同学排期和评估来定,而是业务和项目经理说了算。开发完了就跟测试同学说一声,有这么个需求,这个需求今晚/这周上线,你测一下,好像测试是个很随意的工作,并且每个任务给过来都说是紧急需求,测试时间也是不够的,导致测试非常被动。  3、测试在项目...
            0 0 1282
            分享
          • 说到测试或者测试工程师,人们的第一反应大概是“找碴”、“鸡蛋里找骨头”、“背锅侠”……其实这是对于测试这行的一个很大的误解。测试过程对于绝大多数行业来说是非常重要的一环,厨师在烹饪的时候会尝一尝菜品的味道,一栋楼在建造之前和竣工之后要进行检测,软件在发布之前也要进行很多轮的测试来验证软件的各项性能指标。作者从事多年测试工作,经历了对测试一无所知到略知皮毛,也对测试工作有了更深的理解。如何成为一个合格的测试工程师是一个很大的话题,无论从事这行的工程师还是研究测试的专家都在思考怎么进行更有效的测试,如何提高相关从业者的认知水平。如果有人问我是不是一个合格的测试工程师?这是一个很难回答的问题。从事多...
            0 0 1232
            分享
      • 51testing软件测试圈微信