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 Body
Response 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开始依次递增进行编号:1,2,3,... ,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
匹配后各捕获组对应的内容如下:
g1:2019-06-25 g2:2019
g3:06 g4:25 g5:14:29:30
g6:14 g7:29 g8:30
g0:2019-06-25 14:29:30
Template($i$ where i is capturing group number,starts at 1):
Match No.(0 for Random):
匹配序号
从匹配的结果中怎样挑选匹配项, 若正则表达式每个捕获组有多个匹配项。
则1表示第一个匹配项,2表示第二个匹配项,... ,依次类推;
0表示从多个匹配项中随机选择一个;
-i(i=1,2,3,... ,N,-i即负整数)表示引用所有的匹配项。
若有多个捕获组,并且引用每个捕获组所有的匹配项,则可以看是一个二维数组。
假设,捕获组为g1,g2,g3,... ,gn;每个捕获组匹配项编号为1,2,3,... ,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提取器知识,敬请关注!