Я хочу, чтобы мой вход в систему выполнялся только один раз, поскольку он управляется сторонней службой, поэтому после того, как токен будет получен один раз в течение всего времени тестов, он не должен выполняться снова. Этот токен должен быть внедрен в качестве заголовка cookie для других вызовов API, не меняясь независимо от того, сколько вызовов было выполнено для этих других запросов в рамках одного и того же выполнения тестов. Ниже приведено то, что у меня есть, но, возможно, из-за того, как Гатлинг управляет сеансами, он не работает, и вход в систему выполняется столько раз, сколько другие вызовы 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 DebugSimulation extends Simulation {
private static final String BASE_URL_DEV = "https://aml-ar-reporting.apps.stl.bnw-dev-pas.mycompany.int";
private static final String BASE_URL_STAGE = "https://dtl.mycompanyconnect.com/";
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") ? "" : "aml-account-risk/api";
private static final AtomicReference<String> authCookieRef = new AtomicReference<>();
private final HttpProtocolBuilder httpProtocol = http
.disableFollowRedirect()
.baseUrl(BASE_URL)
.acceptHeader("application/json")
.header("X-AmlArReporting-CID", "125283")
.header("X-AmlArReporting-ICAs", "5655,9529,14516,15662,20929,31627,31931");
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("/heracles/login")
.header("Content-Type", "application/x-www-form-urlencoded")
.formParam("username", "aml_ar_stg")
.formParam("password", "1234")
.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 + "/notifications/last-refresh-date")
.header("cookie", "#{authCookie}")
.check(status().is(200))
);
{
setUp(
scn.injectOpen(atOnceUsers(2))
).protocols(httpProtocol);
}
}
Спасибо.
Обновлять
Попытка разделить симуляцию на два разных сценария и сделать максимально возможное предположение о синтаксисе Гатлинга для получения токена, основываясь на моем понимании их документации.
package com.mastercard.amlar.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 DebugSimulation extends Simulation {
private static final String BASE_URL_DEV = "https://aml-ar-reporting.apps.stl.bnw-dev-pas.mastercard.int";
private static final String BASE_URL_STAGE = "https://dtl.mastercardconnect.com/";
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") ? "" : "aml-account-risk/api";
private final HttpProtocolBuilder httpProtocol = http
.disableFollowRedirect()
.baseUrl(BASE_URL)
.acceptHeader("application/json")
.header("X-AmlArReporting-CID", "125283")
.header("X-AmlArReporting-ICAs", "5655,9529,14516,15662,20929,31627,31931");
private final ScenarioBuilder loginScn = scenario("LoginScenario")
.exec(http("Login")
.post("/heracles/login")
.header("Content-Type", "application/x-www-form-urlencoded")
.formParam("username", "aml_ar_stg")
.formParam("password", "1234")
.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 + "/notifications/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);
}
}
Сначала используйте встроенные инструменты Gatling для получения и настройки файлов cookie: https://docs.gatling.io/reference/script/protocols/http/helpers/#dealing-with-cookies
Затем, насколько я понимаю, вы хотите выполнить вход в систему только один раз и поделиться файлом cookie аутентификации для всех виртуальных пользователей. Вам нужно реализовать 2 разных сценария:
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 DebugSimulation extends Simulation {
private static final String BASE_URL_DEV = "https://aml-ar-reporting.apps.stl.bnw-dev-pas.mastercard.int";
private static final String BASE_URL_STAGE = "https://dtl.mastercardconnect.com/";
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") ? "" : "aml-account-risk/api";
private String cookie;
private final HttpProtocolBuilder httpProtocol = http
.baseUrl(BASE_URL)
.acceptHeader("application/json")
.header("X-AmlArReporting-CID", "125283")
.header("X-AmlArReporting-ICAs", "5655,9529,14516,15662,20929,31627,31931");
private final ScenarioBuilder loginScn = scenario("LoginScenario")
.exec(
http("Login")
.post("/heracles/login")
.formParam("username", "aml_ar_stg")
.formParam("password", "1234")
.formParam("login-form-type", "token")
.asFormUrlEncoded(),
getCookieValue(CookieKey("auth_token")),
exec(session -> {
cookie = session.getString("auth_token");
return session;
})
);
private final ScenarioBuilder mainScn = scenario("MainScenario")
.exec(
addCookie(Cookie("auth_token", session -> cookie)),
http("LastRefreshDate")
.get(API_PATH + "/notifications/last-refresh-date")
.check(status().is(200)),
http("Notifications")
.get(API_PATH + "/notifications")
.check(status().is(200))
);
{
setUp(
loginScn.injectOpen(atOnceUsers(1)).andThen(
mainScn.injectOpen(atOnceUsers(2))
)
).protocols(httpProtocol);
}
}
Смотрите мой отредактированный ответ
Спасибо за ваш ответ. Я приложил все усилия, чтобы реализовать то, что понял из вашего предложения, но не уверен, что получил правильную реализацию получения и добавления токена. Извините, я немного запутался в документации и синтаксисе. Не могли бы вы взглянуть на обновление, которое я добавил в этой попытке, пожалуйста? Еще раз спасибо.