Сценарий входа в систему Gatling с CSV-фидером - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно написать несколько тестов с Гатлингом / Scala. В моем конкретном случае я должен войти на веб-сайт с именем пользователя и паролем (дополнительно есть также защита от кражи ключей). Существует файл CSV с большим количеством строк с именами пользователей и паролей, и моя цель - войти в систему с каждым пользователем / паролем из этого файла CSV.

Проблема в том, что я не знаю, как это сделать. Я могу войти в систему с именем пользователя / паролем и токеном ключа безопасности только с одним пользователем. Пока все хорошо, но недостаточно. Вот что я сделал до сих пор.

Первый класс:

class LasttestBestand extends Simulation {

  val context = Context.ladeContext("de", "integ")
  val userCredentials = TestdatenImport.ladeTestDaten("de")

  val httpProtocol = http
    .baseUrl(s"${context.protocol}://${context.host}")
    .inferHtmlResources(
      BlackList(""".*\.css""", """.*\.js""", """.*\.ico""", """.*\.woff"""),
      WhiteList()
    )
    .acceptHeader("application/json, text/plain, */*")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("de,en-US;q=0.7,en;q=0.3")
    .disableFollowRedirect
    .userAgentHeader(
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:63.0) Gecko/20100101 Firefox/63.0"
    )

  val scn = scenario("Lasttest Bestand")
    .feed(userCredentials.csvFeeder)
    .exec(Login.holeAccessToken("${Benutzername}", "${Passwort}", context))
    .exec(Suche.ladeKundensucheResourcen(context))

  setUp(
    scn.inject(
      atOnceUsers(1)
    )
  ).protocols(httpProtocol)
}

Класс фидера:

class TestdatenImport(val csvFeeder: BatchableFeederBuilder[String]) {}

object TestdatenImport {

  def ladeTestDaten(land: String) = {
    val csvFeeder = csv(s"data/eca-bb3-${land}-testdaten.csv").circular

    new TestdatenImport(
      csvFeeder
    )
  }
}

Логин:

object Login {
  def holeAccessToken(
      benutzer: String,
      passwort: String,
      context: Context
  ): ChainBuilder = {
    val keycloakUri = s"${context.protocol}://${context.keycloakHost}"
    val redirectUri =
      s"${context.protocol}%3A%2F%2F${context.host}%2Fapp%2F%3Fredirect_fragment%3D%252Fsuche"

    exec(
      http("Login Page")
        .get(
          s"$keycloakUri/auth/realms/${context.realm}/protocol/openid-connect/auth"
        )
        .queryParam("client_id", "bestand-js")
        .queryParam("redirect_uri", redirectUri)
        .queryParam("state", UUID.randomUUID().toString())
        .queryParam("nonce", UUID.randomUUID().toString())
        .queryParam("response_mode", "fragment")
        .queryParam("response_type", "code")
        .queryParam("scope", "openid")
        .header(
          "Accept",
          "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        )
        .header("Upgrade-Insecure-Requests", "1")
        .check(status.is(200))
        .check(
          css("#kc-form-login")
            .ofType[Node]
            .transform(variable => {
              variable.getAttribute("action")
            })
            .saveAs("loginUrl")
        )
    ).exec(
        http("Login")
          .post("${loginUrl}")
          .formParam("username", benutzer)
          .formParam("password", passwort)
          .header(
            "Accept",
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
          )
          .header("Upgrade-Insecure-Requests", "1")
          .check(status.is(302))
          .check(
            header("Location")
              .transform(url => {
                url.substring(url.indexOf("code=") + 5, url.length())
              })
              .saveAs("code")
          )
          .check(header("Location").saveAs("nextPage"))
      )
      .exec(
        http("Fetch Token")
          .post(
            s"$keycloakUri/auth/realms/${context.realm}/protocol/openid-connect/token"
          )
          .header("Accept", "*/*")
          .header("Origin", s"${context.protocol}://${context.host}")
          .formParam("code", "${code}")
          .formParam("grant_type", "authorization_code")
          .formParam("client_id", "bestand-js")
          .formParam("redirect_uri", redirectUri)
          .check(status.is(200))
          .check(
            jsonPath("$..access_token")
              .saveAs("accessToken")
          )
      )
  }
}

Как вы видите, я добавил в сценарий фидер, но я не знаю, как "повторить" вход в систему, сколько раз в файле CSV присутствовали строки пользователя / пароля. Что я делаю не так?

1 Ответ

0 голосов
/ 16 апреля 2020

Введите столько пользователей, сколько у вас есть записей в вашем файле CSV, например:

scn.inject(
  rampUsers(numberOfEntries) during(10 minutes)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...