14、JMeter 教程 - JMeter后置处理器

十四、JMeter后置处理器

1.简介

后置处理器是在发出“取样器请求”之后执行一些操作。取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的。例如系统登录成功以后我们需要获取SessionId,在后面的业务操作中服务器会验证这个SessionId,获取SessionId这个功能过程就可以用后置处理器中的正则表达式提取器来完成。

2.预览后置处理器

首先我们来看一下JMeter的后置处理器,路径:线程组(用户)->添加->后置处理器();我们可以清楚地看到共有11个后置处理器(不包括jp@gc开头的后置处理器,这个是安装的插件),如下图所示:

 

3.常用后置处理器详解

3.1CSS/JQuery提取器

CSS/JQuery提取器,是通过css选择器定位页面元素并读取数据 。

3、 1.1新建:线程组>添加>后置处理器>CSS/JQuery提取器,如下图所示:;

 

3、 1.2关键参数说明如下:;

Apply to:

  • Main sample and sub-samples 主要样本和子样本
  • Main sample only 仅适用于主要样本(默认)
  • Sub-samples only 仅适用于子样本
  • JMeter Variable Name to use 用作Jmeter变量名称

CSS选择器提取器实现:

  • JSOUP:不选时默认为JSOUP
  • JODD:JODD格式

引用名称:也就是jmeter里面的变量

CSS选择器表达式:CSS表达式

属性:要提取的元素的属性,提取内容可以不填。示例:蓝色
,那么这里的属性就是value,因为我们要提取blue

匹配数字:0 代表随机取值,n取第几个匹配值,-1匹配所有;比如:取1表示报文中的第1个对象匹配,取2表示报文中的第2个对象匹配)

缺省值:在无法提取内容的情况下放入变量的值。

3、 1.3CSS选择器或JQuery选择器是Jmeter支持的两种语法,下面对其两种语法进行简单介绍;

CSS选择器

选择

选择

.class

.intro

All elements with class="intro"

#id

#firstname

The element with id="firstname"

*

*

All elements

element

p

All <p> elements

element,element

div, p

All <div> elements and all <p> elements

element element

div p

All <p> elements inside <div> elements

JQuery选择器

选择

选择

*

$("*")

All elements

#id

`$`("#lastname")

The element with id="lastname"

.class

$(".intro")

All elements with class="intro"

.class,.class

$(".intro,.demo")

All elements with the class "intro" or "demo"

element

$("p")

All <p> elements

el1,el2,el3

$("h1,div,p")

All <h1>,<div> and <p> elements

3、 1.4实例(提取指定文本);

1、 新建测试计划,线程组下添加访问csdn主页的取样器;

2、 然后再添加CSS/JQuery提取器,如下图所示;

 

其中CSS选择器表达式就按如下图的方法获取,右键copy>copy selector,如下图所示:

 

3、 接着再添加一个调试取样器用来确认是否提取到我们要提取的东西;

4、 配置好以后,运行JMeter,查看结果,如下图所示:;

 

var1_x:可以看到,获取的文本信息

var1_matchNr:统计匹配的个数,如图,一共5个

3、 1.5实例(提取指定链接);

1、 新建测试计划,线程组下添加访问csdn首页的取样器;

2、 然后再添加CSS/JQuery提取器,如下图所示:;

 

3、 接着再添加一个取样器用来确认是否提取到我们要提取的东西,提取出来的值用来传参,如下图所示:;

 

4、 配置好以后,运行JMeter,查看结果,如下图所示:;

 

3、 1.6实例(随机提取链接);

1、 新建测试计划,线程组循环5次,添加随机变量和访问csdn主页的取样器,如下图所示:;

随机变量

 

2、 然后再添加CSS/JQuery提取器,如下图所示:;

 

3、 接着再添加一个取样器用来确认是否提取到我们要提取的东西,提取出来的值用来传参;

4、 配置好以后,运行JMeter,查看结果,如下图所示:;

 

3.2JSON JMESPath Extractor

作为5.2版本之后加入的后置处理器,其功能与JSON提取器类似,都是对JSON格式的返回数据进行提取,但使用的语法不同。JSON JMESPath Extractor使用JMESPath查询语言从Json结果中提取值。

3、 2.1新建:线程组>添加>后置处理器>JSONJMESPathExtractor,如下图所示:;

 

3、 2.2关键参数说明如下:;

Apply to(应用范围):

  • Main sample and sub-samples:主要样本和子样本

  • Main sample only:默认的是这个,应用于主要样本

  • Sub-samples only:应用于子样本

  • JMeter Variable Name to use:应用于变量命名的内容

  • Name of created Variable:保存的变量名,后面使用${Variable names}引用

JSON Path Expression:json表达式

Match No.(0 or Random):匹配的值是哪一个,默认不填写是获取符合条件的第一个,这个与正则表达式的类似(0为随机、N为获取第N个、-1获取所有)

Default Values:当没有获取到参数值时的默认值

3、 2.3实例;

1、 新建测试计划,线程组下添加微博的热搜接口请求,如图所示:;

 

2、 然后再在取样器下添加JSONJMESPathExtractor,如下图所示:;

 

3、 取一个调试取样器查看运行结果,如图所示:;

 

3.3JSON提取器

JSON提取器可以使用JSON-PATH语法从JSON格式的响应中提取数据。

该后处理器与正则表达式提取器非常相似。必须将其放置为HTTP Sampler或具有JSON响应的任何其他取样器的子级,可以以非常简单的方式提取JSON文本内容。这里不再进行举例说明。

3、 3.1JSONpathexpression语法;

JsonPath

描述

$

根节点

@

当前节点

.or[]

子节点

..

选择所有符合条件的节点

*

所有节点

[]

迭代器标示,如数组下标

[,]

支持迭代器中做多选

[start:end:step]

数组切片运算符

?()

支持过滤操作

()

支持表达式计算

3、 3.2JSONJMESPathExtractor与JsonPath提取器对比;

一个JsonPath提取器可以通过 ; 分离的方式,提取多个变量表达式

JSON JMESPath Extractor只支持提取一个变量,如果要提取多个变量,则需要添加多个JSON JMESPath Extractor

JsonPath提取器不支持函数,JSON JMESPath Extractor支持使用函数length()、max_by()、min_by(),可应用于部分特殊场景,所以可以根据场景实际需要,选择要用的提取器类型

3、 3.3举例说明;

{“store”:{ “book”:[ { “category”: “reference”, “author”: “Nigel Rees”, “title”: “Sayings of the Century”, “price”: 8.95 }, { “category”: “fiction”, “author”: “Evelyn Waugh”, “title”: “Sword of Honour”, “price”: 12.99 }, { “category”: “fiction”, “author”: “Herman Melville”, “title”: “Moby Dick”, “isbn”: “0-553-21311-3”, “price”: 8.99 }, { “category”: “fiction”, “author”: “J. R. R. Tolkien”, “title”: “The Lord of the Rings”, “isbn”: “0-395-19395-8”, “price”: 22.99 } ], “bicycle”: { “color”: “red”, “price”: 19.95 } }, “expensive”: 10 }

JSO JMESPath Extractor

JSON提取器

提取所有书的作者

store.book[*].author

$.store.book[*].author

提取store包含的所有分类数据

store.*

$.store.*

提取所有物品的价格

store.[bicycle.price,book[*].price]

$.store..price

提取第三本书的数据

store.book[2]

$..book[2]

提取倒数第二本书的数据

store.book[-2]

$..book[-2]

提取前两本书的数据

store.book[:2]

$..book[1,2]

提取索引1(包括)到索引2(不包括)的书的数据

store.book[1:2]

$..book[1:2]

提取最后两本书

store.book[-2:]

$..book[-2:]

所有带有isbn属性的书

store.book[?(@.isbn)]

$..book[?(@.isbn)]

所有书种类的数量 

length(store.book[*])

价格最高的书名 

max_by(store.book, &price).title

价格最低的书信息 

min_by(store.book, &price)

所有价格小于10的书

$..book[?(@.price < 10)]

所有价格小于属性“expensive”的书 

$..book[?(@.price

3.4正则表达式提取器

允许用户使用正则表达式从服务器响应中提取值。作为后处理器,此元素将在其范围内的每个Sample请求之后执行,应用正则表达式,提取请求的值,生成模板字符串,并将结果存储到给定的变量名称中。

3、 4.1新建:线程组>添加>后置处理器>正则表达式提取器,如下图所示:;

 

3、 4.2关键参数说明如下:;

要检查的响应字段:要提取的字段范围

  • 主体:响应体,不包含响应头;最常用
  • body(unescaped):响应体,替换了所有HTML转义符;不建议使用
  • body as a Document:从不同类型的文件中提取文本;影响性能
  • 信息头:响应头
  • Requeste Headers:请求头
  • URL:URL
  • 响应代码:响应码(Response code)
  • 响应信息:响应信息(Response message)

引用名称:接收提取值的变量名,*必传

正则表达式:正则表达式

模板:从找到的匹配项中创建字符串的模板

如果一条正则表达式有多个提取结果,则提取结果是数组形式,模板1、2…表示把解析到的第几个值赋值给变量,从1开始匹配,0表示整个表达式匹配的内容,若只有一个结果,只能是1

匹配数字(0代表随机):取第几个值(0:随机,默认;-1所有;1第一个值),非必传

缺省值:缺省值,匹配不到值的时候取该值,非必传

使用空默认值:勾选后,提取不到值时,则返回空字符串

3、 4.3实例;

1、 新建测试计划,线程组下添加百度取样器;

2、 使用正则表达式提取器提取度娘取样器响应中(百度一下,你就知道),如下图所示:;

 

3、 然后再在取样器下添加正则表达式提取器,如下图所示:;

 

说明:

(1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它。

(2)正则表达式:

():括起来的部分就是要提取的。

.:匹配任何字符串。

+:一次或多次。

?:不要太贪婪,在找到第一个匹配项后停止。

(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值

(4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填0

(5)缺省值:如果参数没有取得到值,那默认给一个值让它取。

4、 紧接着再添加一个调试取样器用来查看结果;

5、 配置好以后,运行JMeter,查看表格结果,如下图所示:;

 

3.5边界提取器

边界提取器,使用JMeter5.0的边界提取器,不需要写复杂的正则表达式,只要填写左右边界即可,我们想从接口中提取一些想用的东西,不习惯用正则提取器和json提取器,可以使用边界提取器,相对前者较简单些。它通过左右边界来提取需要的内容,它可以匹配任何格式的内容,如文本、json、xpath、html等等,使用也很简单,分别填写要提取内容的左右边界即可,很灵活。

3、 5.1新建:线程组>添加>后置处理器>边界提取器,如下图所示:;

 

2、 关键参数说明如下:;

Apply to(应用范围):

Main sample and sub-samples:主要样本和子样本

Main sample only:默认的是这个,应用于主要样本

Sub-samples only:应用于子样本

JMeter Variable Name to use:应用于变量命名的内容

Name of created Variable:保存的变量名,后面使用${Variable names}引用

要检查的响应字段:要提取的字段范围

  • 主体:响应体,不包含响应头;最常用
  • body(unescaped):响应体,替换了所有HTML转义符;不建议使用
  • body as a Document:从不同类型的文件中提取文本;影响性能
  • 信息头:响应头
  • Requeste Headers:请求头
  • URL:URL
  • 响应代码:响应码(Response code)
  • 响应信息:响应信息(Response message)

引用名称:请求要引用的变量名称,如填写 result_num

左边界:要匹配的左边界值

右边界:要匹配的右边界值

Match No.(0 or Random):匹配的值是哪一个,默认不填写是获取符合条件的第一个,这个与正则表达式的类似(0为随机、N为获取第N个、-1获取所有)

Default Values:当没有获取到参数值时的默认值

3、 5.3实例;

1、 新建测试计划,线程组下添加百度取样器;

2、 使用边界提取器提取度娘取样器响应中(百度一下,你就知道);

3、 然后再在取样器下添加边界提取器,如下图所示:;

 

说明:

(1)Apply to:选Main sample only。

(2)要检查的响应字段:选主体。

(3)引用名称:提取出来参数引用的名称。

(4)提取值左边界 :要匹配的左边界值。

(5)提取值右边界 :要匹配的右边界值。

(6)匹配数字:0代表随机取值,1代表全部取值,通常情况下填0

(7)缺省值:如果参数没有取得到值,那默认给一个值让它取。

3、 紧接着再添加一个调试取样器用来获取结果;

4、 配置好以后,运行JMeter,查看表格结果,如下图所示:;

 

3.6JSR223 后置处理程序

JSR223后置处理程序,用法和JSR223 PreProcessor类似,可以参考:JMeter(十三)-JMeter前置处理器

3、 6.1新建:线程组>添加>后置处理器>JSR223后置处理程序,如下图所示:;

 

3、 6.2关键参数说明如下:;

参数:要传递到脚本文件或脚本的参数列表;

文件名:用于执行的脚本文件,若没有脚本文件,将执行脚本;

Script:传递给JSR223执行的脚本;如果提供了脚本文件,则执行脚本文件,否则执行脚本。

3.7调试后置处理程序

调试后置处理程序,使用正则表达式为从另一个HTTP请求中提取的HTTP参数指定动态值,配合regular expression extractor使用。暂时没找到好的例子,后面想到补充。。

3、 7.1新建:线程组>添加>后置处理器>调试后置处理程序,如下图所示:;

 

3、 7.2关键参数说明如下:;

JMeter 属性:jmeter.properties定义的系统级的属性变量。因其变化不大,所以脚本调试时通常不显示,默认False(不显示)

JMeter 变量:JMeter中定义的变量。常用的四种变量定义可参考文章:JMeter常见四种变量简介,默认为True(显示)

取样器属性:样本属性及变量信息。默认为True(显示)

系统属性:系统配置的环境变量等。若系统环境变量在当前脚本中有用到,可以设置为True(显示),默认为False(不显示)

3、 7.3实例;

1、 新建测试计划,线程组下添加调试取样器,如下图所示:;

 

3、 然后再在取样器下添加调试后置处理程序,如下图所示:;

 

4、 配置好以后,运行JMeter,查看表格结果,如下图所示:;

 

如图,响应数据,响应体中获取到了 JMeter 变量。JMeterVariables

调试取样器中,只有JMeter 变量选了 True,所以只获取 JMeter 变量

 

如图,这个调试取样器-0获取到的就是调试后置处理程序

如图,响应数据,响应体中获取到了取样器属性和 JMeter 变量。SamplerProperties、JMeterVariables

调试后置处理程序中,只有JMeter 变量和取样器属性选了 True,所以只获取 JMeter 变量和取样器属性

3、 8JDBC后置处理程序;

JDBC 后置处理程序,实际上JIBC PostProcessor就是一个JDBC Request,它与JDBC Request功能相同,都可以执行SQL语句。在测试的过程中可能会遇到这样的测试场景:我们用JDBC Request修改了一些数据,当测试完成后,我们希望还原到原先状态,此时我们可以用JDBC PostProcessor来完成,当然用JDBC Request也可以完成。具体的JDBC PostProcessor的使用参考:JMeter(六)-建立数据库测试计划实战

3、 8.1新建:线程组>添加>后置处理器>JDBC后置处理程序,如下图所示:;

 

3.9XPath2 Extractor

Xpath2提取器,虽然JMeter官方文档说可以使用XPath2查询语言从结构化响应(XML或(X)HTML)中提取值,但目前测试只支持从XML响应中提取值;从HTML中提取会报错,这个可以通过查看结果树中选择XPath2 Tester来验证。

3、 9.1新建:线程组>添加>前置处理器>Xpath2提取器,如下图所示:;

 

3、 9.2关键参数说明如下:;

APPly to:作用范围(返回内容的断言范围)

  • Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
  • Main sample only:仅作用于父节点的取样器
  • Sub-samples only:仅作用于子节点的取样器
  • JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)

引用名称:存放提取出的值的参数。

XPath Query:用于提取值的XPath表达式。

Match No 匹配数字:取第几个匹配结果,0随机,-1全部,1代表第一个,2代表第二个,....以此类推

Default Value:参数的默认值。

Namespaces aliases list:命名空间别名列表。就是这个功能,能让使用命名空间比使用旧的XPath提取器更方便。关于命名空间含义,可以看官方文档:XML命名空间。由于XPath2对于表达式的要求比较严格,对于带命名空间的XML(包括默认的命名空间),使用不带命名空间前缀的表达式是查询不到结果的。

Return entire XPath fragment of text content:返回文本内容的整个XPath片段。

3.10XPath提取器

Xpath提取器,如果请求返回的消息为xml或html格式的,可以用XPath提取器来提取需要的数据。

3、 10.1新建:线程组>添加>后置处理器>Xpath提取器,如下图所示:;

 

3、 10.2关键参数说明如下:;

APPly to:作用范围(返回内容的断言范围)

  • Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
  • Main sample only:仅作用于父节点的取样器
  • Sub-samples only:仅作用于子节点的取样器
  • JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)

XMLParsing Options:要解析的XML参数

  • UseTidy:当需要处理的页面是HTML格式时,必须选中该选项;如果是XML或XHTML格式(例如RSS返回),则取消选中;

  • Quiet表示只显示需要的HTML页面

  • 报告异常表示显示响应报错

  • 显示警告;

  • Use Namespaces:如果启用该选项,后续的XML解析器将使用命名空间来分辨;

  • Validate XML:根据页面元素模式进行检查解析;

  • Ignore Whitespace:忽略空白内容;

  • Fetch external DTDs:如果选中该项,外部将使用DTD规则来获取页面内容;

Return entire XPath fragment of text content:返回文本内容的整个XPath片段;

引用名称:存放提取出的值的参数。

XPath Query:用于提取值的XPath表达式。语法参考:XPath

匹配数字:取第几个匹配结果,0随机,-1全部,1代表第一个,2代表第二个,....以此类推

Default Value:参数的默认值。

xpath语法参考:xpath语法

3、 10.3实例;

1、 新建测试计划,线程组下添加1个取样器csdn首页;

2、 返回HTML,然后再添加xpath提取器,如下图所示:;

举例://*[@class="def"]//a/@href

选取带有class属性为de的href属性节点。 注释://*选取文档中的所有元素。 @选取属性 /@href 从根节点选取所有的href属性

 

Xpath提取器设置

 

3、 继续添加调试取样器、http请求,获取xpath提取到的参数,如下图所示:;

 

4、 配置好以后,运行JMeter,查看表格结果,如下图所示:;

调试取样器:

 

http请求:

 

3.11结果状态处理器

结果状态处理器,实际上在测试的时候我们也经常会遇到这样的测试场景:在一些测试用例失败之后我们需要进行一些操作,例如停止测试,这里可以使用结果状态处理器。

3、 9.1新建:线程组>添加>后置处理器>结果状态处理器,如下图所示:;

 

2、 关键参数说明如下:;

在取样器错误后要执行的动作:

  • 继续:忽略错误继续执行。
  • Break Current Loop:跳出当前迭代
  • 启动下一进程循环:本次线程不执行,开始执行下一个线程迭代
  • Go to the next iteration of Current Loop:继续当前线程的下一个迭代,报错后,本次迭代不执行,执行本线程的下一个迭代
  • 停止测试:执行完本次迭代,再停止测试
  • 立即停止测试:立刻停止线程组
  • 停止线程:将异常的线程移出线程组,不再执行,其他线程继续执行。

3.12BeanShell 后置处理程序

BeanShell 后置处理程序,用法和BeanShell PreProcessor类似,可以参考:JMeter(十三)-JMeter前置处理器

BeanShell 后置处理程序,如果请求返回的消息为xml或html格式的,可以用XPath2提取器来提取需要的数据。这个估计是JMeter5.0新加的吧,具体用法和Xpath提取器的应该差不多的,可以参考上边Xpath提取器的用法。

3、 12.1新建:线程组>添加>后置处理器>BeanShell后置处理程序,如下图所示:;

 

3、 12.2关键参数说明如下:;

重置解释器: 每次迭代是否重置解释器

参数:传递给脚本的参数;

文件名:本地开发的脚本文件(会覆盖在JMeter里编写的脚本);

Script:要运行脚本。编写脚本的区域。