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

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

用 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 条回复 时间 点赞

一般来说不会对单个参数做 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));
arrow 回复

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

soloblue 回复

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

arrow 回复

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册