当前位置:网站首页>Jmeter接口自动化-如何解决请求头Content-Type冲突问题
Jmeter接口自动化-如何解决请求头Content-Type冲突问题
2022-07-27 16:23:00 【测试小鬼】
一、前言
通常我们在使用Jmeter做接口自动化时,在线程组里添加HTTP信息头管理器,用来管理公共的请求头信息。普通的接口自动化是没问题的,但是对于有些特殊的操作流程,如:先上传文件接口(信息头使用Content-Type: multipart/form-data),之后操作传json格式的接口(信息头使用Content-Type: application/json),这两种接口的请求头信息就会有冲突。
接下来会根据示例来一步步的解决此问题。
二、原始脚本
例如有以下5个接口,连起来就是一个自动化操作流程。
1-图片上传
2-获取服务数据
3-设置服务图片
4-设置服务状态
5-获取服务状态
其中:
“1-图片上传”接口请求头为Content-Type: multipart/form-data
“3-设置服务图片”、“4-设置服务状态”接口请求头为Content-Type: application/json
在线程组下添加HTTP信息头管理器,添加值为Content-Type: application/json

“1-图片上传”接口设置了Content-Type: multipart/form-data

每个接口都添加了响应断言。

脚本结构:

执行脚本:
“1-图片上传”接口的请求头是Content-Type: application/json,而不是Content-Type: multipart/form-data
所以“1-图片上传”接口,不能使用公共的HTTP信息头管理器里的请求头信息。

三、原始脚本优化1
将原始脚本进行优化
将公共的HTTP信息头管理器的位置调整一下,不作为公共请求头,而是给需要该请求头的接口指定添加。
“1-图片上传”接口为上传类型的接口,已经在请求里设置了Content-Type: multipart/form-data
“2-获取服务数据”、“5-获取服务状态”接口不需要添加请求头。
“3-设置服务图片”、“4-设置服务状态”接口需要添加请求头(Content-Type: application/json),所以在这两个接口下添加HTTP信息头管理器即可。

脚本结构:

执行脚本:
全部接口执行成功。

“1-图片上传”接口请求头信息。

“3-设置服务图片”接口请求头信息。

缺点:当接口很多时,如果大量接口都需要指定的HTTP信息头管理器,维护起来有些麻烦、而且脚本看起来有些臃肿,不方便统一修改等。
四、原始脚本优化2
将原始脚本进行优化
将“1-图片上传”接口从原有的线程组里抽出来,单独放进新建的线程组里,即两个线程组。“1-图片上传”接口在一个线程组里,其他接口在一个线程组里。
其他接口所在的线程组里的HTTP信息头管理器,请求头值不变。

脚本结构:

执行脚本:
同时运行两个线程组,全部接口执行成功。


缺点:两个线程组所组成的自动化脚本虽然在业务流程上是可以跑通的,但是这种把线程组分出来,看起来不像一个整体。尤其是线程组脚本越来越多的时候,执行起来有些不方便。
五、原始脚本最终优化
将原始脚本进行优化
因为“1-图片上传”接口不需要公共信息头里的请求头信息,所以添加BeanShell PreProcessor前置处理器,删除公共请求头里的信息。
脚本代码:
import org.apache.jmeter.protocol.http.control.HeaderManager;
// 获得请求头信息
HeaderManager headers = sampler.getHeaderManager();
// 打印全部请求头信息
log.info("删除前" + headers.getHeaders().getStringValue());
// 删除请求头指定的信息
sampler.getHeaderManager().removeHeaderNamed("Content-Type");
// 打印全部请求头信息
log.info("删除后" + headers.getHeaders().getStringValue());
此时公共请求头里的指定信息被删除了,之后的接口要用到这个信息,所以在后续的接口上再添加回来,例如“3-设置服务图片”接口会用到公共的信息头,在此接口上添加BeanShell PreProcessor前置处理器,添加请求头信息到公共请求头里。
脚本代码:
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.Header;
// 获得请求头信息
HeaderManager headers = sampler.getHeaderManager();
// 打印全部请求头信息
log.info("添加前" + headers.getHeaders().getStringValue());
// new一个Header对象
myHeader = new Header("Content-Type", "application/json");
// 添加Header到请求头管理器
headers.add(myHeader);
// 打印全部请求头信息
log.info("添加后" + headers.getHeaders().getStringValue());
请求头信息添加成功后,后续的接口若要用到这个信息,则无需再添加(BeanShell PreProcessor前置处理器),就可以使用了。
公共的HTTP信息头管理器,请求头值不变。

脚本结构:

执行脚本:
全部接口执行成功。

“1-图片上传”接口请求头信息。

“3-设置服务图片”接口请求头信息。

查看执行时打印的日志,打印出删除与添加请求头信息。

注意:公共的HTTP信息头管理器禁用或删除,执行脚本会报错。

即使脚本添加了请求头信息,但还是找不到所指定的请求头。

边栏推荐
- MySQL 05 存储过程
- Kinect for Unity3d----KinectManager
- Talking about JVM (frequent interview)
- Product recommendation and classified product recommendation
- Multifunctional wireless remote control moxibustion instrument chip dltap703sd
- Redis注解
- Openstack login dashboard prompt authentication error
- Join query and subquery
- Wechat payment and payment callback
- Unity学习笔记(实现传送带)
猜你喜欢

订单超时取消 及 按类别查询商品

`this.$emit` 子组件给父组件传递多个参数

Unity-显示Kinect深度数据

Overview of Baidu map technology, and application development of basic API and webapi

MySQL 03 advanced query (I)

MySQL 05 stored procedure

Uploading and downloading of files

个人中心--订单业务流程

Nodejs template engine EJS

I'm stupid. When completable future is used with openfegin, it even reports an error
随机推荐
模仿线程扣除
商品评论信息与评论信息分类
Latex使用--subfigure竖排图形
飞机大战碰撞检测
Nodejs 模板引擎ejs
Talking about JVM (frequent interview)
Household mute mosquito repellent lamp chip-dltap703sd-jericho
PHP字符串操作
JDBC-MySql 02 数据访问和DAO模式
功率单位(power control)
MySQL 03 advanced query (I)
Use mobaxtermto establish a two-tier springboard connection
JS to realize simple form verification and select all functions
浅谈JVM(面试常考)
Infrared hyperspectral survey
Typescript installation
The understanding of string in C.
【微信小程序】项目实战—抽签应用
Jianmu continuous integration platform v2.5.2 release
npm 基本使用