接口测试 如何利用 jmeter 进行接口测试时,对某参数进行 gzip 压缩后传递

soloblue · 2019年02月11日 · 最后由 soloblue 回复于 2019年02月18日 · 305 次阅读

用jmeter做接口测试时,遇到的一个问题,求教诸位

问题描述:
做接口测试时,该接口需要传递a,b,c,d等多个参数。
其中需传递的某参数a 为数据量超大的json串,故需要对其进行gzip压缩后再进行传输

我遇到的难题是 如何对参数a进行压缩并传递
查阅了很多资料,基本都是告知加请求头 才可以传递gzip类数据 但没有告知具体的数据压缩方法和传递方式

目前已知的一种方式可以对a进行压缩,代码如下

String bodyString = vars.get("a");
byte [] requestBody = bodyString.getBytes();
ByteArrayOutputStream out = new ByteArrayOutputStream(requestBody.length);
GZIPOutputStream gzip = new GZIPOutputStream(out);
s=gzip.write(requestBody);
gzip.close();

如果以上压缩方法可行,请问如何赋值回a 并进行传递? 应该是不支持vars.put这种方式的

希望有这方面经验的前辈可以给指点一下迷津

共收到 4 条回复 时间 点赞
吴宝林 回复

谢谢。另外还有一个疑问是为何放置数据时是out.toString(0),而不是out.toString()
此外这个接口是用php写的 应该涉及到了中文编码问题。传递不带中文参数仍无法通过gzip校验。
想请教一下php的gzencode方式 和 java的GZIPOutputStream 这两种是否通用,感觉压缩出来的数据不太一样

soloblue 回复

代码中最后一句
sampler.getArguments().getArgument(0).setValue(out.toString(0));
就是把压缩的数据设置回去

吴宝林 回复

你好,首先需求很明确 的确是仅针对 格式为json的参数a进行压缩
其次感谢你给出的代码,和我再stackoverflow上看到的是一样的 我的疑问在于 不知道如何把缓存中压缩后的数据流传递回去
之前我传参用的是parameter方式,你说的Body Data格式 我会尝试一下滴

一般来说不会对单个参数做gzip压缩,都是直接压缩整个Body的
how-to-post-gzip-request-with-apache-jmeter

  1. 设置请求的Body Data: a={}&b=1&c=2&d=3
  2. 前置处理器
import org.apache.commons.io.IOUtils;
import java.util.zip.GZIPOutputStream;


String bodyString = sampler.getArguments().getArgument(0).getValue();
byte [] requestBody = bodyString.getBytes();

ByteArrayOutputStream out = new ByteArrayOutputStream(requestBody.length);
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(requestBody);
gzip.close();

sampler.getArguments().getArgument(0).setValue(out.toString(0));
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册