十三、JMeter实战-关联-正则表达式
一、关联
讲关联之前先熟悉一下后置处理器,因为关联取的数据就是请求后的数据。
后置处理器:
后置处理器(Post Processors)负责在请求后进行工作。后置处理器常作为处理响应的数据,后置处理器中的正则表达式提取器常常用于提取动态关联的数据。后置处理器放在请求的子集中。
什么时候需要关联?
1. 服务器返回的动态变化而且对业务有影响的需要关联。
2. 回放脚本看是否正确,检查下脚本,是否有动态数据影响
3. 一大串字符串,每次请求参数是否有变化
4. 可以找开发问问,接口是开发做的,最清楚了
动态数据关联:
1.在HTTP请求的参数中经常会遇到一些参数的值是服务器的响应中的动态数据,这些数据需要进行关联才能使得每一次请求都能成功地被服务器接受,在JMeter中常用正则表达式或者JSON提取器来获取这些动态数据。
2.正则表示式允许用户从服务器响应中获取数据,作为后置处理器,正则表示式在每个请求执行后再执行。正则表示式提取出来的数据放在变量中,供后续的请求使用。
正则表达式提取器:
添加 》 后置处理器 》 正则表达式提取器
- 名称:该节点的名称,自行定义
- 注释:节点的注释
- Apply to:默认选择Main sample only,从主请求中获取数据
- 要检查的响应字段:响应包含响应行、响应头、body等,选择从主体即可。
- 引用名称:正则取出来的数据放在变量中,变量的名称自己根据实际情况写,比如:token、id等。把值放在变量中,供后续的请求使用。
- 正则表示式:用于解析响应数据的正则表达式。
- 模板:取一个数据的模板$1$,取两个数据的模板$1$$2$。
- 匹配数字(0代表随机):正则取出来的数据可能是多个,0代表随机一个。
- 缺省值:正则取不到数据,要展示的信息。
正则表示式:
- .点:匹配任何单个字符,除了\n\r之外
- +加号:匹配前面的子表示式一次或者多次
- ?问号:当该字符紧跟在任何一个其他限制符(*,+,?)后面时,匹配模式是非贪婪的,非贪婪模式尽可能少地匹配所搜索的字符串
- *星号:匹配前面的子表达式任意次
- ()小括号:将()之间的表示式定义为“组”,并且将匹配这个表示式的字符保存到一个临时区域
举例:要获取token的正则表达式为:”token”:”(.+?)”
如果想获取响应的所有结果使用(.+)即可
----------------------------- 使用到部分正则进行断言:
实例讲解:
要实现这样一个功能:新建一个学校,然后再把刚才新建的学校禁用了。
通过抓包工具抓到禁用学校的接口
通过分析,id和schoolid则为禁用那个学校的字段,而这两个值一般都会在禁用接口前面的接口中获取的。在列表页的接口中可以看到
所以只需要把列表页接口的响应中的这两个数据取出来,然后供给禁用的接口使用,就能实现:新建一个学校,然后把新建的学校禁用了。
分开取数据,先取id:
加一个调试取样器,在查看结果树好查看正则表达式有没有取出数据。
如果里面有特殊字符,根据实际情况需要进行转义:
把id取出来了。
接下来取schoolid,一样的方法。
在查看结果树中看到schoolid取出来了。
把取出来的id和schoolid引用到禁用学校的接口即可。
通过 ${变量名}把取出来的值引用过来。
到此即可实现,新建一个学校,然后把刚新建的学校禁用。
可以到页面上看效果。
正则表达式取多个值:
接口的响应
{"code":1,"message":"","costTime":0,"data":[{"id":386739,"schoolId":449,"laccount":null,"pwd":null,"loginTime":null,"loginTotal":null,"islogin":null,"disable":"0","isadmin":null}],"start":0,"page":0,"total":0}
应取这个接口中code对应的值1和costTime对应的值0这两个数据。
在查看结果树中看一下结果:
引用的时候要注意,引用的是${id_g1}
和${id_g2}
这两个。
还有一种情况就是,要取的这两个值,如果中间的字段比较多的话,可以使用正则来代替。
这样也可以实现的,这样就省去了中间可能要填写很多字符串。