Jmter前/后置处理器

所谓的前/后置处理器,就是处理请求发送之前和响应之后要做的事情,常用的有:

  • 前置处理器
    • beanshell处理程序
  • 后置处理器
    • json提取器
    • 正则表达式提取器
    • beanshell处理程序

我们先来说后置处理器,而beanshell我们将单独拿出来说。

后置处理器

后置处理器常用来从响应中提取数据用作它用,主要包括:

  • json提取器:当响应体的数据类型是json时,用json提取器相当方便。
  • 正则表达式提取器:正则表达式提取器比json提取器更加的灵活、强大,适用于各种复杂的场景中。
  • beanshell处理程序:暂时理解为我们可以他通过编写脚本来完成更加复杂的操作。

json提取器

http://www.neeo.cc:6001/get?user=admin&pwd=1234

# response body
{
  "args": {
    "pwd": "1234", 
    "user": "admin"
  }, 
  "headers": {
    "Connection": "keep-alive", 
    "Host": "www.neeo.cc:6001", 
    "User-Agent": "Apache-HttpClient/4.5.10 (Java/1.8.0_201)"
  }, 
  "origin": "222.35.243.75", 
  "url": "http://www.neeo.cc:6001/get?user=admin&pwd=1234"
}

我们使用json提取器提取向响应体中的的args的user值。

在线程组内,新建一个HTTP请求取样器,然后配置如下:

如何提取响应体的中的指定字段呢?

这里就要用到了json提取器了:

image-20200602101718780

各参数:

  • 名称/注释:略!
  • Apply to:
    • Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器。
    • Main sample only:默认,仅作用于父节点的取样器。
    • Sub-samples only:仅作用于子节点的取样器。
    • JMeter Variables Name to use:作用于jmeter变量(输入框内可输入jmeter的变量名称)。
  • Names of create variables:提取的json数据存储的变量名字。
  • JSON Path expressions:提取JSON数据的JSON Path表达式路径,json path参考:https://github.com/json-path/JsonPath
  • Match No. (0 for Random):匹配第几个值,不填写默认获取符合条件的第一个, 0为随机、N为获取第N个、-1获取所有(匹配项是-1且匹配结果有多个值时,会通过逗号将多个值拼接,可以通过 参数名_ALL 的方式进行调用)。
  • Compute concatenation var (suffix _ALL):勾选此项后,匹配到多个结果时,插件将使用“ , ”分隔符将它们连接起来,并将其存储在名为_ALL的var中(需配合Match Numbers:-1 使用)。
  • Default Value:缺省值,如果json提取器没有提取到值,则使用此缺省值

然后,我们在察看结果树中的调试取样器中看到提取的值:

此时,提取出来的user值是全局的,可以在别处直接使用。当然,具体的使用方式,后续结合实际的应用场景来讲解。

正则提取器

json提取器有一定的限制,它做不到正则匹配那么灵活,所以我们还需要学习在jmeter中如何使用正则表达式提取器。

正则表达式提取器三步走,轻松提取数据:

  • 拷贝目标数据和左右边界
  • 把目标数据用括号括起来
  • 把目标数据用.+?代替

OK啦,这里正则提取非常的简单。

http://www.neeo.cc:6002/pinter/bank/api/login
# post
# 参数
userName=admin
password=1234

如上示例,我们提取该请求的返回的cookies值。

在线程组内,新建一个HTTP请求取样器,然后配置如下:

该请求的返回的cookies值在响应头中:

那如何使用正则表达式提取器来响应头中提取呢?

说实话,jmeter汉化的是在不太好,有些情况下倒不如英文那么原汁原味,所以,下图语言是英语。

常用的参数:

  • Field to check:

    • Body:响应体
  • Body as a Document:文本类型的响应体

    • Response Headers:响应头中提取。
  • Request Headers:请求头中提取。

    • URL:URL中提取。
  • Names of create variables:提取的数据存储的变量名字。

  • Reguler Experession:正则表达式规则,参考上面的三部走套路。

  • Template (ii where i is capturing group number, starts at 1):模板使用$n$表示,此处,上面只有一个(),所以这里使用$1$,如果上图中有两对(),那么模板为$1$$2$,以此类推。

  • Match No. (0 for Random):0 表示随机取值,1 表示取第一个,2表示提取第二个........

  • Default Value:缺省值,如果没有提取到值,则使用此缺省值。

 

.*:贪婪匹配原则:整个表达式匹配成功的前提下,尽可能多的匹配,即匹配到不能匹配为止
.*?:非贪婪匹配:在匹配成功的情况下尽可能少的匹配

Template:模板是对应正则表达式提取器类型,样式为:$n$

        若为:$0$,则为整个表达式匹配到的内容,就是包括小括号内跟小括号外的内容

        若为:$1$,则对应正则表达式中的第一个(.*?)所匹配的内容

        若为:$2$,则对应正则表达式中的第二个(.*?)所匹配的内容

        若为:$1$$2$,则把2个(.*?)所匹配的内容拼接起来

 

然后,我们在察看结果树中的调试取样器中看到提取的值:

 

前置处理器

前置处理器(Pre Processors)常用来在请求之前提前作一些处理,常见的前置处理器有:

  • 在请求中,携带一些参数。
  • HTML链接解析器
  • HTTP URL重写修饰符
  • JDBC预处理程序,用于jmeter链接数据库用。
  • BeanShell预处理程序,可以通过编写脚本来说处理更为复杂的操作。

在前置处理器中,最常用的是JDBC和BeanShell两个处理器,其他的用的较少。

用户参数

提前准备一些参数用于在请求中携带一些参数,但是它只作用于当前的线程组中,不像在测试计划中的参数作用于全局。

http://www.neeo.cc:6001/get
# get

我们在测试计划中,新建两个线程组,并且都将线程数设置为2;新建一个查看一个察看结果树,移动到测试计划下,用来监听两个线程组的执行情况。

在第一个线程组tes1内添加一个用户变量前置处理器:

配置如下:

在两个线程组内分别新建一个HTTP取样器,设置如下:

上面两个取样器的设置基本一致;其中参数用户名和密码都是从"用户变量"前置处理器中提取的。

来运行一波,察看结果树中:

可以看到,由于线程组的线程数设置的是2,那么每个线程组内的HTTP取样器应该执行两次;

并且线程组test1的请求成功的从"用户变量"中提取出了值,而且是分别取的;由于线程组test2内没有"用户变量",所以请求中没有提取到值,这也证明了,开头说的,"用户变量"只作用于当前线程组,而无法作用于全局。

posted @ 2022-05-16 01:02  断浪狂刀忆年少  阅读(640)  评论(0编辑  收藏  举报