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
相关产品推荐
相关产品推荐

