Jmeter接口自动化-如何解决请求头Content-Type冲突问题

目录

1、前言

2、原始脚本

3、原始脚本优化1

4、原始脚本优化2

5、原始脚本最终优化


1、前言

通常我们在使用Jmeter做接口自动化时,在线程组里添加HTTP信息头管理器,用来管理公共的请求头信息。普通的接口自动化是没问题的,但是对于有些特殊的操作流程,如:先上传文件接口(信息头使用Content-Type: multipart/form-data),之后操作传json格式的接口(信息头使用Content-Type: application/json),这两种接口的请求头信息就会有冲突。

接下来会根据示例来一步步的解决此问题。

2、原始脚本

例如有以下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信息头管理器里的请求头信息。

3、原始脚本优化1

将原始脚本进行优化

将公共的HTTP信息头管理器的位置调整一下,不作为公共请求头,而是给需要该请求头的接口指定添加。

“1-图片上传”接口为上传类型的接口,已经在请求里设置了Content-Type: multipart/form-data

“2-获取服务数据”、“5-获取服务状态”接口不需要添加请求头。

“3-设置服务图片”、“4-设置服务状态”接口需要添加请求头(Content-Type: application/json),所以在这两个接口下添加HTTP信息头管理器即可。

脚本结构:

执行脚本:

全部接口执行成功。

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

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

缺点:当接口很多时,如果大量接口都需要指定的HTTP信息头管理器,维护起来有些麻烦、而且脚本看起来有些臃肿,不方便统一修改等。

4、原始脚本优化2

将原始脚本进行优化

将“1-图片上传”接口从原有的线程组里抽出来,单独放进新建的线程组里,即两个线程组。“1-图片上传”接口在一个线程组里,其他接口在一个线程组里。

其他接口所在的线程组里的HTTP信息头管理器,请求头值不变。

脚本结构:

执行脚本:

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

缺点:两个线程组所组成的自动化脚本虽然在业务流程上是可以跑通的,但是这种把线程组分出来,看起来不像一个整体。尤其是线程组脚本越来越多的时候,执行起来有些不方便。

5、原始脚本最终优化

将原始脚本进行优化

因为“1-图片上传”接口不需要公共信息头里的请求头信息,所以添加BeanShell PreProcessor前置处理器,删除公共请求头里的信息。

脚本代码:

// 公众号:AllTests软件测试
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前置处理器,添加请求头信息到公共请求头里。

脚本代码:

// 公众号:AllTests软件测试
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信息头管理器禁用或删除,执行脚本会报错。

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangmcn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值