性能测试-JMeter关联之正则表达式介绍
为什么要关联???
在客户端与服务器通信过程中,多个请求/响应间的数据会有相互依赖的关系。比如上一个请求返回的某些响应数据在后续的请求中需要用到。
下面是一些典型的例子:
1)比如第一次访问网站获取的session id在后续的请求都会将其传给网站;
2)服务器生成token返回给用户,在后续的请求中要带上token;
3)根据条件查询某记录,在查询结果集中选择记录进行操作(比如删除)
...
但是有些通信协议是无状态的,不存在上下文相关性。多个请求/响应之间的数据不能直接进行传递;
并且每次服务器返回的数据不是一成不变的,传递的数据不能通过硬编码(写死)保存来解决。
比如上面三种情况都会产生动态变化的数据:
1)session id的生命周期一般在关闭浏览器时就结束了,每次打开浏览器访问返回的session id并不相同;
2)token也有生命周期,一般也是随机,无状态的;
3)若查询条件参数化了或服务器返回的查询结果集改变了,后续的操作可能会失败。
在这些情况下,可以考虑将服务器返回的动态变化的数据保存到某个参数中,需要时再从中取出。
一、关联原理
举个例子,看电影,看电影过程有如下步骤:
1.购票
2.验票
3.观影
每个步骤可以看做一个请求/响应。观众相当于客户端,影院方相当于服务器。
过程如下图所示:
观众购买的电影票可以看成服务器返回的响应数据,要验票通过才能入场观影。
观众购票相当于一个请求,验票是下一个请求,这需要将上一个请求返回的响应数据(电影票)放在下一个请求中发送给服务器处理。
假设这部电影非常精彩,想重新再看一次,因为电影票只能使用一次,观众必须重新购票,才能验票通过入场;使用第一次购买的电影票入场肯定会被拒之门外。
为了解决这个问题,可以考虑做如下假设:
每次将购买的电影票放入随身携带的LV钱包,并且在放入之前将使用过的票丢弃,以防止入场时掏错票;入场的时,从钱包中取出票来验票,这样就万无一失了。
将电影票放入钱包中,相当于将服务器返回的数据保存起来了,这里钱包就是保存关联数据的参数。
二、关联的定义
将服务器返回的数据包中满足条件的数据保存到一个参数中的过程。
怎样将服务器返回的数据保存起啦,JMeter中可以使用后置处理器来处理关联数据,常见的方法有:
1、正则表达式提取器
2、JSON提取器
需要关联数据的特征
怎样确定哪些数据是需要做关联的,可以从关联数据的特征来识别出这些数据。关联数据有如下三个特征:
1.服务器返回
需要关联的数据一定是从服务器返回的。
客户端输入的数据不需要进行关联,比如输入的用户名与密码。此特征是必选的。
2.数据会再次发送给服务器处理
保存上一个请求响应的数据,其目的是为了将其用于下一个请求中,否则保存起来没有意义。
此特征是可选特征,也就是说不再次发送也是可以保存数据进行关联的。
3.数据动态变化
上一个请求响应的数据若不会动态变化,完全可以写死在脚本中,不需要花力气额外保存再次取出。
正是由于每次返回的数据动态变化,我们需要根据某种规则将这些动态变化的数据找出来保存,
然会取出实际返回的数据。但此特征也是可选的。不动态变化一样可以保存进行关联,但意义不大。
三、正则表达式介绍
JMeter通过内嵌的Apache Jakarta ORO软件来解析处理正则表达式。
Jakarta-ORO是用于处理文本的一组Java类,是目前功能最全性能最好的正则表达式API之一,它提供兼容Perl5类型的正则表达式。
单行模式与多行模式
元字符
扩展正则表达式