背景:本文档主要内容是jmeter脚本入门配置以及调试方法,借助已有的jmeter脚本模板,快速理解并写出一个成功的jmeter脚本用例。
1. jmeter脚本编写
1.1 jmeter脚本模版
拿到脚本模板文件后,直接在模板上做相应更改就行,模板中包含了必备配置和选择配置,可以快速完成一个成功的脚本,减少试错节省时间。
模板可以看到很多组件。高亮的部分是必备配置,置灰的选择配置,可以根据自己的使用场景设置哪些需要高亮,哪些需要置灰。
2. jmeter必备配置
2.1 线程组
使用jmeter进行性能测试时,所有的任务都是基于线程组的,一个线程组可以模拟若干个用户:
2.1.1 添加线程组
右键测试计划,选择线程组,可以看到线程组面板如下:
1)线程组默认选择在取样器错误后,继续执行后面的请求
2)线程数、ramp-up时间、循环次数默认为1
2.1.2 调度器
调度器默认置灰的,勾选后可使用。调度器可配置持续时间和启动延迟时间,用来模拟稳定性能压测。
(延迟时间常用于多个线程组串行执行的时候,若是只有测试计划中只有一个线程组,可配置为0)
2.2 HTTP请求
2.2.1 添加http请求,面板中请求url配置如下:
2.2.2 除了url配置外,面板中传参模块有3种方式:
1)键值对传参
2)消息体数据传参(常用):
3)文件上传类型:
步骤一:部分接口传参可能需要导入一个文件,可以通过文件上传实现
步骤二:抓包查看接口头部中Content-Type的类型是什么?由下图可见,该接口传参类型为:image/jepg
步骤三:最重要的一步,勾选对post使用multipart/from-data,高级设置中选择java实现
2.3 断言
常用BeanSell断言,jmeter在它的bean shell中内置了变量,用户可以通过这些变量与jmeter进行交互。脚本常用内容如下:
代码语言:javascript复制//断言响应码为200的请求
if(!ResponseCode.equals("200")){
Failure = true;
FailureMessage=ctx.getPreviousResult() " 请求失败,返回码:" ResponseCode "n";
String response = new String(ResponseData);
log.info(FailureMessage);
log.info("=============================分割1==========================");
log.info(response);
return;
}
//断言响应体中的内容
String response = new String(ResponseData);
Failure = !(response.contains("<!--STATUS OK-->")); //需要修改contains中的内容,根据响应体中的实际内容进行断言
if (Failure) {
Failure = true;
FailureMessage=ctx.getPreviousResult() "未发现断言结果" response "n";
log.info("=============================分割2==========================");
log.info(response);
return;
}
断言只需要根据接口响应体中的内容更改 Failure = !(response.contains("<!--STATUS OK-->")) 这一句,其余无需更改!
2.4 HTTP信息头管理器
http信息头管理器在发送请求时起重要作用,通常在用jmeter向服务器发送请求的时候,往往后端需要一些验证信息。例如web服务器需要将cookie带过去给服务器验证,一般就是放在header头中。因此可以将请求头中的数据以键值对的形式放在http信息头管理器中。
以下是常用的头部字段:
2.4.1 content-type
content-type作用是告诉服务器我们发送的请求是哪种格式的。常用content-type有以下3种:
1)content-type: application/x-www-form-urlencoded
http请求默认值,若不指定content-type,默认使用这种格式。这种格式的参数可以在“参数”或者“消息体数据”里输入,格式不同,如下图所示:
2)content-type:application/json
支持格式为json
3)content-type:multipart/form-data
该类型是在post请求时,支持文件上传参数的方式。具体步骤见1.2.2 http请求中的传参方式。
步骤一:部分接口传参可能需要导入一个文件,可以通过文件上传实现
步骤二:抓包查看接口头部中Content-Type的类型是什么?由下图可见,该接口传参类型为:image/jepg
步骤三:最重要的一步,勾选对post使用multipart/from-data,高级设置中选择java实现
2.4.2 accept-encoding
accept-encoding是客户端表明自己接的编码方法,通常指定压缩方法,例如gzip,deflate等。实际从浏览器访问网页是默认带上该配置的,因此jmeter设计脚本时,可以在请求头中配置。
accept-encoding:gzip, deflate, br。意思是支持这3种压缩方法,服务器可能返回content-encoding:gzip,意思是服务器以gzip的方式进行压缩。
2.5 用户定义的变量
编写脚本过程中,常常有大量重复的变量需要设置,如果修改的话,要修改很多次。为了节省这部分耗时,我们可以配置用户定义的变量组件来定义全局变量,变量有改动只需要改动一次,并且更好管理。
- 使用步骤如下:
2、经常设置为变量的属性有哪些:
1)线程组相关属性:线程数、ramp-up时间、持续时间等,如上图一样
2)http请求中的域名或者ip:通常一个项目中使用的域名就几个,而接口有几十甚至上百,因此可以将域名或者ip设置为全局变量
2.6 HTTP请求默认值
该组件可以为我们设置http请求默认值,当一个测试计划中有多个请求都发送到同一个server,就可以直接设置默认的域名或者ip,然后http请求中不填写域名,最终请求时会默认使用http请求默认值中的值。
注意:若出现以下2种配置情况:
1) 若是一个测试计划中设置了两个http请求默认值,最终以前一个为准
2)若是测试计划中,设置了全局http默认请求值,某个线程组下也设置了一个http默认请求值,最终以线程组下的设置为准
2.7 查看结果树
查看结果树组件主要是调试脚本,配置后不用做任何设置,就可以看到请求的发送和返回信息。以下说明查看结果树如何快速调试脚本:
2.7.1 面板左侧展示请求成功/失败的状态,后侧取样器中可以看到状态码。以下是常见状态码:
200:服务器已经成功处理了请求
400:错误请求,服务器不理解请求的语法
401:未授权,通常是未登录或者登陆态失效
503:服务不可用,无法处理请求
2.7.2 请求中分两部分,一部分是请求体,一部分是请求头
2.7.3 响应数据中分两部分,一部分是响应体,一部分是响应头
2.8 聚合报告
2.9 后端监听器
后端监听器是一个异步监听器,可以将压测数据推到数据库中,提供了influxDB、graphite选项可选择。我们压测时选择influxdb做持续存储,结合grafana面板监控jmeter压测数据。
2.9.1 后端监听器的面板如下:
2.9.2 如何配置监控面板
1)拿到默认的脚本模版后,更改influxdbUrl,从默认的host_to_change改成自己使用的地址
我们一般使用为:http://jmeter-influxdb:8086/write?db=jmeter
2)更改application为自己的项目名称,可快速辨认即可。
3. jmeter脚本调试
将脚本模板的信息修改为自己要用的接口后,需要调试脚本,看单接口能否调试通过。
3.1 脚本启动方法
调试脚本只需要跑一条数据即可,以下有两种调试方法,推荐第二种:
1)修改线程组配置,将threads和loop count改成1,点击start运行
2)右键线程组,点击validate,该线程组下的请求只运行一次
3.2 调试结果查看-查看结果树
脚本调试的结果首选查看结果树组件,配置后不用做任何设置,就可以看到请求的发送和返回信息。以下说明查看结果树如何快速调试脚本:
3.2.1 面板左侧展示请求成功/失败的状态,后侧取样器中可以看到状态码。以下是常见状态码:
200:服务器已经成功处理了请求
400:错误请求,服务器不理解请求的语法
401:未授权,通常是未登录或者登陆态失效
503:服务不可用,无法处理请求
3.2.2 请求中分两部分,一部分是请求体,一部分是请求头
3.2.3 响应数据中分两部分,一部分是响应体,一部分是响应头
3.3 调试结果查看-jmeter日志查看器
当脚本运行后,查看结果树中无响应的时候,可以查看日志进行错误分析。
选择jmeter选项->勾选日志查看,面板右下角会展示日志模块:
日志模块中错误信息一般会以info或者error的前缀打印出来