JMeter中使用动态 Header 和 Request Body
2025年6月15日
本文介绍了如何在 JMeter 测试工具中使用动态的 Request Header 和 Request Body。
JMeter简介与使用
Apache JMeter 是 Apache 组织的开放源代码项目,是一个纯Java桌面应用,用于压力测试和性能测试。具体的使用方法可以参考之前的博文使用 JMeter 对 API 进行压力测试
HTTP Header Manager
在 JMeter 中,如果需要为 HTTP 请求添加 Header,可以使用 HTTP Header Manager 组件。具体步骤为:在 HTTP Request 组件右键 –> Add –> Config Element –> HTTP Header Manager
在 HTTP Header Manager 中,可以添加多个 Header 键值对。如果需要使用动态的 Header 值,可以使用 JMeter 的内置函数或变量。例如,使用 ${__time(YMDHMS)} 函数获取当前时间戳作为 Header 值。
JSR223 PreProcessor
如果需要为 HTTP 请求的 Body 部分使用动态内容,可以使用 JSR223 PreProcessor 组件。在 HTTP Request 组件右键 –> Add –> Pre Processors –> JSR223 PreProcessor
在 JSR223 PreProcessor 中,可以编写 Groovy 脚本来动态管理请求的 Header 和 Body。下面是一个示例脚本,展示了如何根据不同的 HTTP Method 动态生成 Cookie Header:
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase
import org.apache.jmeter.protocol.http.control.Header
if (sampler instanceof HTTPSamplerBase) {
// 1. 根据 HTTP Method 区分 counter
def method = sampler.getMethod() // POST / GET / PUT ...
def counterVar
if (method == "POST") {
counterVar = "token_create_counter"
} else if (method == "GET") {
counterVar = "token_get_counter"
} else {
counterVar = "token_other_counter"
}
// 2. 读取并递增对应 counter(线程内独立)
def counter = vars.get(counterVar)
if (counter == null) {
counter = 1
} else {
counter = counter.toInteger() + 1
}
vars.put(counterVar, counter.toString())
// 3. 构造 Cookie
def cookieValue = "token=${counter}"
// 4. 移除旧 Cookie,添加新 Cookie
def headerManager = sampler.getHeaderManager()
if (headerManager != null) {
headerManager.removeHeaderNamed("Cookie")
headerManager.add(new Header("Cookie", cookieValue))
}
}
为了快速快速生成脚本,可以使用 Gen AI 工具,例如ChatGPT。
执行测试
./jmeter -n -t ./folder/test.jmx -l folder/result/test.txt -e -o test
完成上述配置后,即可执行测试。JMeter 会根据配置的动态 Header 和 Body 生成请求,并发送到目标服务器。可以通过监听器查看测试结果,验证动态 Header 和 Body 是否按预期工作。