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

Gatling Java实现单次登录复用Token的技术求助

问题:Gatling中实现全局唯一Token复用,避免重复登录

我需要让登录操作仅执行一次(登录由第三方服务管理),整个测试期间只获取一次Token,后续所有API调用都复用这个Token作为Cookie头部注入。但目前代码受Gatling的Session管理机制影响,登录操作和其他API调用执行次数相同,达不到预期效果。

初始实现代码

import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicReference;

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

@Slf4j
public class MySimulation extends Simulation {

    private static final String BASE_URL_DEV = "myurl";
    private static final String BASE_URL_STAGE = "myotherurl";
    private static final String ENV = System.getProperty("env");
    private static final String BASE_URL = ENV.equals("dev") ? BASE_URL_DEV : BASE_URL_STAGE;
    private static final String API_PATH = ENV.equals("dev") ? "" : "mypath";

    private static final AtomicReference<String> authCookieRef = new AtomicReference<>();

    private final HttpProtocolBuilder httpProtocol = http
            .disableFollowRedirect()
            .baseUrl(BASE_URL)
            .acceptHeader("application/json");

    private final ScenarioBuilder scn = scenario("MyScenario")
            .exec(session -> {
                if (authCookieRef.get() != null) {
                    System.out.println("User does not need cookie");
                    return session.set("authCookie", authCookieRef.get());
                }
                else {
                    System.out.println("User needs cookie");
                }
                return session.set("needLogin", true);
            })
            .doIf(session -> session.contains("needLogin")).then(
                    exec(http("Login")
                            .post("/login")
                            .header("Content-Type", "application/x-www-form-urlencoded")
                            .formParam("username", "username")
                            .formParam("password", "password")
                            .formParam("login-form-type", "token")
                            .check(status().is(302), header("Set-Cookie").saveAs("authCookie")))
                            .exec(session -> {
                                String authCookie = session.getString("authCookie").split(";")[0];
                                authCookieRef.set("auth_token=" + authCookie);
                                return session.set("authCookie", authCookieRef.get());
                            })
            )
            .exec(http("LastRefreshDate")
                    .get(API_PATH + "/last-refresh-date")
                    .header("cookie", "#{authCookie}")
                    .check(status().is(200))
            );

    {
        setUp(
                scn.injectOpen(atOnceUsers(2))
        ).protocols(httpProtocol);
    }
}

更新后的尝试代码

我尝试将测试拆分为两个不同场景,根据Gatling文档编写了获取Token的代码:

package com.mycompany.performancetests;

import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;
import lombok.extern.slf4j.Slf4j;

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

@Slf4j
public class MySimulation extends Simulation {

    private static final String BASE_URL_DEV = "myurl";
    private static final String BASE_URL_STAGE = "myanotherurl";
    private static final String ENV = System.getProperty("env", "dev");
    private static final String BASE_URL = ENV.equals("dev") ? BASE_URL_DEV : BASE_URL_STAGE;
    private static final String API_PATH = ENV.equals("dev") ? "" : "mypath";

    private final HttpProtocolBuilder httpProtocol = http
            .disableFollowRedirect()
            .baseUrl(BASE_URL)
            .acceptHeader("application/json");

    private final ScenarioBuilder loginScn = scenario("LoginScenario")
            .exec(http("Login")
                            .post("/login")
                            .header("Content-Type", "application/x-www-form-urlencoded")
                            .formParam("username", "username")
                            .formParam("password", "password")
                            .formParam("login-form-type", "token")
                            .check(status().is(302))
                    //      .check(mycompany("Set-Cookie").saveAs("auth_token"))
            )
            .exec(getCookieValue(CookieKey("auth_token")));

    private final ScenarioBuilder mainScn = scenario("MainScenario")
            .exec(addCookie(Cookie("auth_token", "value")))
            .exec(http("LastRefreshDate")
                    .get(API_PATH + "/last-refresh-date")
                    .check(status().is(200))
            )
            .exec(addCookie(Cookie("auth_token", "#{auth_token}")))
            .exec(http("Notifications")
                    .get(API_PATH + "/notifications")
                    .check(status().is(200))
            );

    {
        setUp(
                loginScn.injectOpen(atOnceUsers(1)).andThen(
                        mainScn.injectOpen(atOnceUsers(2))
                )
        ).protocols(httpProtocol);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:29:56