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); } }
代码说明
- 认证链
AUTHENTICATE:调用认证接口,通过jsonPath提取Token并存储到会话变量authToken,可根据实际接口返回格式调整提取规则。 - API调用链
CALL_PROTECTED_API:携带Authorization头调用受保护API,同时将响应状态码保存到responseStatus,用于后续重认证判断。 - 场景逻辑:
- 先校验会话中是否存在Token,确保首次调用有有效凭证。
- 首次调用API后,通过
doWhile循环监听状态:若返回403,立即重新获取Token并再次调用API,直到返回非403状态。 - 每个虚拟用户对应独立会话,Token状态会持续保留,完全符合复用线程不丢失状态的需求。
可调整项
- 若认证接口不是表单提交方式,可替换为
body或rawFileBody适配实际请求格式。 - 可结合
tryMax添加最大重试次数限制,避免无限循环。
内容的提问来源于stack exchange,提问作者Vishalendu
相关产品推荐
相关产品推荐

