Запрос Gatling Java будет вызываться только один раз для получения информации для входа в систему для других запросов, которые выполняются несколько раз

Я хочу, чтобы мой вход в систему выполнялся только один раз, поскольку он управляется сторонней службой, поэтому после того, как токен будет получен один раз в течение всего времени тестов, он не должен выполняться снова. Этот токен должен быть внедрен в качестве заголовка 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);
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала используйте встроенные инструменты Gatling для получения и настройки файлов cookie: https://docs.gatling.io/reference/script/protocols/http/helpers/#dealing-with-cookies

Затем, насколько я понимаю, вы хотите выполнить вход в систему только один раз и поделиться файлом cookie аутентификации для всех виртуальных пользователей. Вам нужно реализовать 2 разных сценария:

  • один работает с 1 в.у. для получения файла cookie и сохранения его в глобальной переменной благодаря exec (функции)
  • ваш реальный сценарий, который ожидает завершения первого (см. и Затем) и устанавливает общий файл cookie с помощью функции
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);
  }
}

Спасибо за ваш ответ. Я приложил все усилия, чтобы реализовать то, что понял из вашего предложения, но не уверен, что получил правильную реализацию получения и добавления токена. Извините, я немного запутался в документации и синтаксисе. Не могли бы вы взглянуть на обновление, которое я добавил в этой попытке, пожалуйста? Еще раз спасибо.

Francislainy Campos 28.06.2024 16:21

Смотрите мой отредактированный ответ

Stéphane LANDELLE 28.06.2024 18:20

Другие вопросы по теме