JMeter教程|0到1学会接口性能压测第7课-关联及正则表达式提取器 JMeter是一款开源免费的接口性能压测工具在企业中用的较为广泛上节我们学习了JMeter JSON断言知识。今天分享JMeter关联技术后续文章都会系统分享干货带大家从0到1学会JMeter另外还有教程等同步资料文末加小编VX领取即可。01为什么要关联在客户端与服务器通信过程中多个请求/响应间的数据会有相互依赖的关系。比如上一个请求返回的 某些响应数据在后续的请求中需要用到。下面是一些典型的例子1) 比如第一次访问网站获取的session id在后续的请求都会将其传给网站;2) 服务器生成token返回给用户在后续的请求中要带上token;3) 根据条件查询某记录在查询结果集中选择记录进行操作(比如删除)...但是有些通信协议是无状态的不存在上下文相关性。多个请求/响应之间的数据不能直接进行传递; 并且每次服务器返回的数据不是一成不变的传递的数据不能通过硬编码(写死)保存来解决。比如上面三种情况都会产生动态变化的数据1) session id的生命周期一般在关闭浏览器时就结束了每次打开浏览器访问返回的session id并不相同;2) token也有生命周期一般也是随机无状态的;3) 若查询条件参数化了或服务器返回的查询结果集改变了后续的操作可能会失败。在这些情况下可以考虑将服务器返回的动态变化的数据保存到某个参数中需要时再从中取出。02关联原理举个例子看电影看电影过程有如下步骤1. 购票2. 验票3. 观影每个步骤可以看做一个请求/响应。观众相当于客户端影院方相当于服务器。过程如下图所示观众购买的电影票可以看成服务器返回的响应数据要验票通过才能入场观影。观众购票相当于一个请求验票是下一个请求这需要将上一个请求返回的响应数据(电影票)放在下 一个请求中发送给服务器处理。假设这部电影非常精彩想重新再看一次因为电影票只能使用一次观众必须重新购票才能验票通 过入场;使用第一次购买的电影票入场肯定会被拒之门外。为了解决这个问题可以考虑做如下假设每次将购买的电影票放入随身携带的LV钱包并且在放入之前将使用过的票丢弃以防止入场时掏错 票;入场的时从钱包中取出票来验票这样就万无一失了。将电影票放入钱包中相当于将服务器返回的数据保存起来了这里钱包就是保存关联数据的参数。03关联的定义将服务器返回的数据包中满足条件的数据保存到一个参数中的过程。怎样将服务器返回的数据保存起啦JMeter中可以使用后置处理器来处理关联数据常见的方法有1. 正则表达式提取器2. JSON提取器关联数据的特征怎样确定哪些数据是需要做关联的可以从关联数据的特征来识别出这些数据,关联数据有如下三个特征1. 服务器返回需要关联的数据一定是从服务器返回的。客户端输入的数据不需要进行关联比如输入的用户名与密码,此特征是必选的。2. 数据会再次发送给服务器处理保存上一个请求响应的数据其目的是为了将其用于下一个请求中否则保存起来没有意义。此特征是可选特征也就是说不再次发送也是可以保存数据进行关联的。3. 数据动态变化上一个请求响应的数据若不会动态变化完全可以写死在脚本中不需要花力气额外保存再次取出。正是由于每次返回的数据动态变化我们需要根据某种规则将这些动态变化的数据找出来保存 然会取出实际返回的数据,但此特征也是可选的,不动态变化一样可以保存进行关联但意义不大。04正则表达式介绍JMeter通过内嵌的Apache Jakarta ORO软件来解析处理正则表达式。Jakarta-ORO是用于处理文本的一组Java类是目前功能最全性能最好的正则表达式API之一它提 供兼容Perl5类型的正则表达式。扩展正则表达式05正则表达式提取器1、Apply to配置项与响应断言中用法一致不再赘述。2、Field to check配置项2.1 BodyResponse Body比如HTTP响应报文的实体主体不包含状态行与首部。2.2 Body(unescaped)Response Body(转换了转义字符)对HTTP响应报文的实体主体中的所有HTML转义字符进行了转义处理。由于转义时没有参照上下文在处理时可能会出错并且开启此选项会严重影响性能故不建议使用。2.3 Body as a Document通过Apache Tika从各种类型的文档中提取文本。此选项开启也会严重影响性能谨慎使用。2.4 Response Headers一般用于HTTP请求HTTP响应报文中的首部。2.5 Request Headers一般用于HTTP请求HTTP请求报文中的首部。2.6 URL一般用于HTTP请求。HTTP请求报文中的请求URL地址(未开启重定向功能);若开启了重定向功能 则包含原始请求中的请求URL地址与重定向后的URL地址。比如前面访问新浪的例子开启了重定向后则包括http://www.sina.com/http://www.sina.com.cn/和https://www.sina.com.cn/三个URL地址。2.7 Response code一般用于HTTP协议指的是HTTP响应报文中的状态码比如200、301、404等。2.8 Response Message一般用于HTTP协议指的是HTTP响应报文中的原因短语比如OK、Moved Permanently、Not Found等。Name of created variable用于存储结果的JMeter变量的名称。Regular Expression用于解析响应数据的正则表达式。使用正则表达式中的()来捕获响应字符串。可以使用一组或多组()来捕获一个或多个字符串。这样的分组称为捕获组每个捕获组都有一个编号与之对应以方便引用捕获组匹配的内容。若有多个捕获组编号规则为从左至右按照“(”出现的顺序从1开始依次递增进行编号123... n还有一个额外编号为0的捕获组用于表示匹配到的整个正则表达式字符串。比如正则表达式((\d{4})-(\d{2})-(\d{2}))\s((\d{2}):(\d{2}):(\d{2}))捕获组编号1 2 3 4 5 6 7 8响应文本2019-06-25 14:29:30匹配后各捕获组对应的内容如下g12019-06-25 g22019g306 g425 g514:29:30g614 g729 g830g02019-06-25 14:29:30Template($i$ where i is capturing group numberstarts at 1)Match No.(0 for Random)匹配序号从匹配的结果中怎样挑选匹配项 若正则表达式每个捕获组有多个匹配项。则1表示第一个匹配项2表示第二个匹配项... 依次类推;0表示从多个匹配项中随机选择一个;-i(i123... N-i即负整数)表示引用所有的匹配项。若有多个捕获组并且引用每个捕获组所有的匹配项则可以看是一个二维数组。假设捕获组为g1g2g3... gn;每个捕获组匹配项编号为123... m; 保存结果的JMeter变量为refName则refName_m_gn表示第n个捕获组中的第m个匹配项。比如refName_1_g1 表示第1个捕获组中的第1个匹配项;refName_2_g1 表示第1个捕获组中的第2个匹配项;...refName_1_g2 表示第2个捕获组中的第1个匹配项;refName_2_g2 表示第2个捕获组中的第2个匹配项;...Default Value如果正则表达式没有匹配到内容则保存结果的JMeter变量将设置为默认值这样会对调试JMeter 测试带来便利。如果没有提供默认值则很难判断正则表达式是否匹配失败或者RE元素是否未处理 或者是否使用了错误的变量。但是如果您有多个设置相同变量的测试元素那么如果表达式不匹配您可能希望保持变量不变。在 这种情况下请在调试完成后删除默认值。Use empty default value如果选中该复选框则默认值为空则JMeter会将保存结果的JMeter变量设置为空字符串。下期分享JMeter JSON提取器知识敬请关注