JMeter快速入门知识系列(9)JMeter关联之正则表达式提取器

9.1 关联的定义

在客户端与服务器通信过程中,多个请求/响应间的数据会有相互依赖的关系。比如上一个请求返回的某些响应数据在后续的请求中需要用到。

下面是一些典型的例子:

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.数据动态变化

上一个请求响应的数据若不会动态变化,完全可以写死在脚本中,不需要花力气额外保存再次取出。

正是由于每次返回的数据动态变化,我们需要根据某种规则将这些动态变化的数据找出来保存,

然会取出实际返回的数据。但此特征也是可选的。不动态变化一样可以保存进行关联,但意义不大。

9.2 正则表达式介绍

JMeter通过内嵌的Apache Jakarta ORO软件来解析处理正则表达式。

Jakarta-ORO是用于处理文本的一组Java类,是目前功能最全性能最好的正则表达式API之一,它提供兼容Perl5类型的正则表达式。

单行模式与多行模式


元字符


扩展正则表达式


9.3 正则表达式提取器

配置项

Apply to:

与响应断言中用法一致,不再赘述。

Field to check:

Body

Response Body,比如HTTP响应报文的实体主体,不包含状态行与首部。

Body(unescaped)

Response Body(转换了转义字符),对HTTP响应报文的实体主体中的所有HTML转义字符进行了转义处理。

由于转义时没有参照上下文,在处理时可能会出错,并且开启此选项会严重影响性能,故不建议使用。

Body as a Document

通过Apache Tika从各种类型的文档中提取文本。

此选项开启也会严重影响性能,谨慎使用。

Response Headers

一般用于HTTP请求,HTTP响应报文中的首部。

URL

一般用于HTTP请求。HTTP请求报文中的请求URL地址(未开启重定向功能);

若开启了重定向功能,则包含原始请求中的请求URL地址与重定向后的URL地址。

比如前面访问新浪的例子,开启了重定向后,则包括:

http://www.sina.com/,http://www.sina.com.cn/和https://www.sina.com.cn/三个URL地址。

Response code

一般用于HTTP协议,指的是HTTP响应报文中的状态码,比如200、301、404等。

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 ii where i is capturing group number,starts at 1):

设置捕获到的字符串以怎样的格式保存到存储结果的JMeter变量中。

在此项中,可以用1 11表示引用捕获组1中的内容,2 22表示引用捕获组2中的内容,… ,n nn表示引用捕获组n中的内容,

0 00表示引用正则表达式匹配后的整个字符串。

注意除了使用n nn引用捕获组的内容外,还可以加入需要的字符,将匹配的内容按照某种格式保存。

沿用上面日期时间正则表达式的例子,举几个例子:

模板 变量值

1 11 2019-06-25

2 22 2019

1 11,5 55 2019-06-25,14:29:30

Date:1 11–>Time:5 55 Date:2019-06-25–>Time:14:29:30

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变量设置为空字符串。

9.4 应用案例

案例说明

业务操作步骤:

1.登录ECshop后台管理系统;

2.设置查询条件(比如按商品品牌)搜索商品;

3.在返回的查询结果集中选择第一个商品删除。

这里每一步骤对应一个HTTP请求,在第二个请求中每次返回的查询结果集不一样(因为每执行一次会删除一个商品),故向第三个请求传递的商品编号参数不能写死,需要从第二个请求对应的响应数据中提取出来。

操作步骤

这里对第二个步骤一些细节进行说明:

在第二个请求返回的响应数据中观察:

23)">8</span></td>\r\n <td align=“center”>\r\n

<a href="…/goods.php?id=23" target="_blank" title="\u67e5\u770b">

<img src=“images/icon_view.gif” width=“16” height=“16” border=“0”

发现返回的goods_id的左边界为goods.php?id=,右边界为",

但考虑到.与?以及\为元字符,故需要转义,则正则表达式可以设置为:

goods.php?id=(\d+)\"

在删除商品请求中将提取的商品编号替换写死的数据:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容