Jmeter:后置处理器

发布时间 2023-12-31 23:03:14作者: 工作手记

一 前言

环境:window 10
Jmeter 5.5

关于后置处理器器,官方描述如下
image

上面中文是自动翻译的,了解个大概意思,对于这些国外的技术文档,有些地方还是英语表述得比较准确
在工作中,后置处理器常用来解析请求的数据,从中提取一些我们需要的数据作为变量,满足后面其他地方的需要

二 正则表达式提取器

用正则的语法从选择的目标处提取数据,需要提前了解正则语法的使用
image

如上,apply to:从哪里提取数据,一般默认第2个就好,这几个选择的意思和断言那里是一样的,就不重复了
要检查的字段: 具体从哪里提取数据,和断言那里也很类似
引用名称: 即定义变量的名称,提取的数据最后要赋值给这个变量

正则表达式:要提取数据的正则表达式,这里一般至少要包括一组括号即(),除非模板那里为$0$
整个正则表示要寻找的文本,括号里面就是从匹配文本里要提取的最终需要的数据

模板:正则表达式一般至少有一组括号即(),括号里面的内容就是最终要提取的数据,填入$1$表示只要第一个括号里面的数据,$2$表示第2个括号里面的数据,以此类推
$0$ 表示随机
$-1$ 表示取所有

匹配数据:正则表达式可能匹配到多段内容
如 "country":"china","country":"usa" 这段文本
正则表达式写成 "country":"(.+?)"
则会匹配到两处,第一处匹配结果是"country":"china",第2处匹配结果是"country":"usa"
匹配数据填入1就是表示选择第一处的匹配结果,填入2就是第2处,0代表随机,1代表所有取值

缺省值:根据填写的内容未匹配到数据时,就使用这里填入的数据,相当于编程语言中变量的默认值

正则表达提取的例子

首先看官方的2个例子
image

image

这里放的的是自动翻译的中文,觉得拗口不好理解最好看英文原版或者自己动手试一试

自己的例子 一,还是用之前的httpbin来说明
image
image
image
执行 查看结果树
image

例子二
image
image
image
运行 查看结果树
image

三 json提取器

和json断言一样,使用JSON-PATH语法规则来从json中解析提取数据,语法json断言那里说过就不重复介绍了
JSON-PATH: https://github.com/json-path/JsonPath

image

理解了json断言与正则提取器的配置,上面的的字段配置也就容易了

例子

image
image
image

查看结果
image

四 json jmespath提取器

和json提取器很类似,只不过提取数据的表达式的预防规则不同,用的是jmespath的语法,jmespath断言也写过就不重复了

例子

image

image
image

查看结果树
image

五 beanshell

BeanShell是一种完全符合Java语法规范的脚本语言,在后置处理器中用编程语言来分析提取数据能满足更复杂一些的需求

例子

image

还是之前的例子,加一个beanshell 具体如下

//定义一个变量 my_year
String my_year = "2023";

// 将数据关联到jmeter中名为old_year的变量
vars.put("old_year", my_year);


// 访问jmeter中自定义地的变量contry_jmespath 并赋值给新的变量
String country_shell = vars.get("country_jmespath");

// 以日志的方式输出上面的变量
log.warn("========>>>>>>>my_year: " +my_year);
log.warn("========>>>>>>>old_year: " +old_year);
log.warn("========>>>>>>>country: " + country_shell);

//在日志输出中也可以直接访问jmeter中自定义的变量 但要放在字符串中,不能像上面那样拼接在字符串外面
log.warn("---- ${country_jmespath}");

为了方便查看,全部输出为warn级别
为了查看日志首先要配置一下
image
image
执行
image

上面日志中我们可以看到,old_year的值并没有打印出来

因为vars是beanshell中一种特殊的变量 vars.put(varxxx, dataxxx) 是把数据dataxx存到Jmeter中作为变量varxxx,这样在Jmeter中就可以用这个变量,而上面也说了,Jmeter变量在beanshll中不能用拼接的方式,要和jmeter中引用变量的方式一样形如${varxxx}这样

var.get(varxxx) :是从jmeter中获取变量值,比如我们在jmeter中自定义的变量,注意是"varxx"的形式,而不是像put的"${varxx}"的形式

而上面的my_year 和country_shell是beanshll中的变量不是jemeter,是用java相关语法来获得的,可以在beanshll中直接引用他们

总之特殊变量vars的get()和put()用来在jemter变量和beanshll脚本变量间互相转换的

beanshll中的一些特殊变量

形如vars的这种特殊变量还有一些 如下
image

注意 vars.put()和get()只能读写string类型的值,而vars.putObject()个getObject()可读写任何对象
vars的读写范围只限于同一个线程组
若要跨线程组读写就要用props变量,props.get()和props.put()