1-性能测试 - JMeter前/后置处理器
所谓的前/后置处理器,就是处理请求发送之前和响应之后要做的事情,常用的有:
- 前置处理器
- 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提取器了:
各参数:
- 名称/注释:略!
- 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 (\(i\) where i is capturing group number, starts at 1):模板使用
$n$
表示,此处,上面只有一个(),所以这里使用$1$
,如果上图中有两对()
,那么模板为$1$$2$
,以此类推。 -
Match No. (0 for Random):0 表示随机取值,1 表示取第一个,2表示提取第二个........
-
Default Value:缺省值,如果没有提取到值,则使用此缺省值。
然后,我们在察看结果树中的调试取样器中看到提取的值:
参考:25.后置处理器之JSON提取器 | Jmeter后置处理器-正则表达式提取器
前置处理器
前置处理器(Pre Processors)常用来在请求之前提前作一些处理,常见的前置处理器有:
- 在请求中,携带一些参数。
- HTML链接解析器
- HTTP URL重写修饰符
- JDBC预处理程序,用于jmeter链接数据库用。
- BeanShell预处理程序,可以通过编写脚本来说处理更为复杂的操作。
在前置处理器中,最常用的是JDBC和BeanShell两个处理器,其他的用的较少。
用户参数
提前准备一些参数用于在请求中携带一些参数,但是它只作用于当前的线程组中,不像在测试计划中的参数作用于全局。
http://www.neeo.cc:6001/get
# get
我们在测试计划中,新建两个线程组,并且都将线程数设置为2;新建一个查看一个察看结果树,移动到测试计划下,用来监听两个线程组的执行情况。
在第一个线程组tes1
内添加一个用户变量前置处理器:
配置如下:
在两个线程组内分别新建一个HTTP取样器,设置如下:
上面两个取样器的设置基本一致;其中参数用户名和密码都是从"用户变量"前置处理器中提取的。
来运行一波,察看结果树中:
可以看到,由于线程组的线程数设置的是2,那么每个线程组内的HTTP取样器应该执行两次;
并且线程组test1
的请求成功的从"用户变量"中提取出了值,而且是分别取的;由于线程组test2
内没有"用户变量",所以请求中没有提取到值,这也证明了,开头说的,"用户变量"只作用于当前线程组,而无法作用于全局。
欢迎斧正,that's all