You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gatling Java DSL实现带过期Token的REST API自动化测试方案问询

Gatling Java DSL(JDK 1.8)实现带自动重认证的REST API调用

核心实现思路

  • 复用虚拟用户会话存储Token,避免新建线程丢失状态
  • 首次执行时检查会话中是否存在Token,无则触发认证
  • 调用API后判断响应状态码,若为403则重新认证并再次调用API,直到返回非403状态

完整代码实现

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

public class AuthenticatedApiSimulation extends Simulation {

    // 定义HTTP协议基础配置
    private static final HttpProtocolBuilder HTTP_PROTOCOL = http
            .baseUrl("https://your-api-domain.com")
            .acceptHeader("application/json")
            .contentTypeHeader("application/x-www-form-urlencoded");

    // 认证流程:调用Token接口并将Token存入会话
    private static final ChainBuilder AUTHENTICATE = exec(http("获取认证Token")
            .post("/auth/token")
            .formParam("username", "your-username")
            .formParam("password", "your-password")
            .check(jsonPath("$.token").saveAs("authToken")));

    // 受保护API调用:携带Token并保存响应状态码
    private static final ChainBuilder CALL_PROTECTED_API = exec(http("调用受保护API")
            .get("/api/protected/resource")
            .header("Authorization", "Bearer ${authToken}")
            .check(status().saveAs("responseStatus")));

    // 主场景逻辑
    private static final ScenarioBuilder API_SCENARIO = scenario("带自动重认证的API调用")
            // 首次检查会话无Token则执行认证
            .doIf(session -> !session.contains("authToken"))
                .exec(AUTHENTICATE)
            // 首次调用API
            .exec(CALL_PROTECTED_API)
            // 循环处理403:重新认证后再次调用API
            .doWhile(session -> {
                Integer status = session.get("responseStatus");
                return status != null && status == 403;
            })
                .exec(AUTHENTICATE)
                .exec(CALL_PROTECTED_API);

    // 配置并发用户参数
    {
        setUp(
            API_SCENARIO.injectOpen(constantUsersPerSec(5).during(300)) // 5用户/秒,持续5分钟
        ).protocols(HTTP_PROTOCOL);
    }
}

代码说明

  1. 认证链AUTHENTICATE:调用认证接口,通过jsonPath提取Token并存储到会话变量authToken,可根据实际接口返回格式调整提取规则。
  2. API调用链CALL_PROTECTED_API:携带Authorization头调用受保护API,同时将响应状态码保存到responseStatus,用于后续重认证判断。
  3. 场景逻辑:
    • 先校验会话中是否存在Token,确保首次调用有有效凭证。
    • 首次调用API后,通过doWhile循环监听状态:若返回403,立即重新获取Token并再次调用API,直到返回非403状态。
    • 每个虚拟用户对应独立会话,Token状态会持续保留,完全符合复用线程不丢失状态的需求。

可调整项

  • 若认证接口不是表单提交方式,可替换为body或rawFileBody适配实际请求格式。
  • 可结合tryMax添加最大重试次数限制,避免无限循环。

内容的提问来源于stack exchange,提问作者Vishalendu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:45:50