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 是否按预期工作。