Сделать Http-вызов вне сценария в gatling - PullRequest
2 голосов
/ 08 ноября 2019

Мой вариант использования - сделать http-вызов, получить URL-адрес перенаправления из заголовка Location в ответе и использовать этот URL-адрес для выполнения моего нагрузочного тестирования. Этот URL-адрес генерируется динамически, и, следовательно, первоначальный первый HTTP-вызов. Обратите внимание, что тестирование первого http-вызова не является частью моего теста. Каков наилучший способ достичь этого? Есть ли что-то вроде эквивалента @BeforeMethod здесь в gatling? Можно ли использовать сам gatling для выполнения http-вызова в автономном режиме, или мне нужно использовать простой scala для этого? Пока у меня есть это:

val httpConfig = http
  .inferHtmlResources()
  .acceptHeader("*/*")
  .acceptEncodingHeader("gzip, deflate")
  .acceptLanguageHeader("en-US,en;q=0.5")
  .header("Authorization", "Negotiate " + token)
  .doNotTrackHeader("1")
  .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")

val scn = scenario("My Tests").exec(http("Health check")
  .get("https://example-server.com")
  .check(status.is(200)))

setUp(
  scn.inject(atOnceUsers(10))
).protocols(httpConfig)

Мое понимание gatling и scala ограничено. Отсюда и этот основной вопрос.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2019

Вы можете выполнить любую необходимую обработку в конструкторе вашего Simulation.

Это будет выполнено средой выполнения Gatling непосредственно перед запуском сценария.

т.е.

class MyTestWithDynamicTarget extends Simulation {

  val targetUrl = loadTarget()

  val scn = scenario("My Tests")
    .exec(http("Health check")
      .get(targetUrl)
      .check(status.is(200)))

  setUp(
    scn.inject(atOnceUsers(10))
  ).protocols(httpConfig)

  /**
   * Fetch the current location of the service under test, which is returned
   * in the "Location" header of an HTTP request
   */
  def loadTarget() = {
    ??? // see e.g. /1945745/java-kak-naiti-perenapravlennyi-url-adres-url
  }
}

(Scenario API предлагает хуки «до» и «после» (см. документы здесь ), но нет простого способа передать информацию из этих хуков в конфигурацию сценария, так как вынужно сделать тут.)

0 голосов
/ 13 ноября 2019

Это зависит от того, как вы хотите обработать этот первый HTTP-вызов. Я вижу две возможности:

  1. Получить URL перенаправления один раз за симуляцию, а затем сделать несколько вызовов на один и тот же URL перенаправления в симуляции. В этом случае первый вызов не будет частью имитации с точки зрения Гатлинга.
  2. Получите URL перенаправления независимо для каждого пользователя в симуляции, а затем вызовите разные URL перенаправления один раз (или N раз). В этом случае первый вызов будет частью симуляции, но вы можете группировать вызовы с помощью group(name){...}, поэтому вы получите отдельную статистику для каждой группы.

Если я правильно понимаю ваш вопрос, вас интересуетв первом решении. В этом случае вам нужно будет использовать некоторый внешний HTTP-клиент и сгенерировать этот URL перенаправленияУ Gatling есть блок before{}, когда вы можете поместить любую логику (хотя вы не можете использовать там Gatling DSL), но, честно говоря, я бы просто сделал это в конструкторе класса моделирования, например, если URL перенаправления возвращается как заголовок Location, вы можете получить его с помощьюHTTP-клиент Apache:

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients

class RedirectSimulation extends Simulation {

  val redirectUrl = HttpClients.createDefault
    .execute(new HttpGet("http://redirectgenerator/getRedirect"))
    .getLastHeader("Location")
    .getValue

 val scn = scenario("Test redirect url")
   .exec(
     http("Get response").get(redirectUrl)
   )

 setUp(scn.inject(atOnceUsers(10)))
}
0 голосов
/ 13 ноября 2019

Вы можете сохранить URL-адрес какой-либо переменной из заголовка или из ответа при выполнении некоторого сценария. Попробуйте приведенный ниже код, может быть, это поможет:

val httpConfig = http
  .inferHtmlResources()
  .acceptHeader("*/*")
  .acceptEncodingHeader("gzip, deflate")
  .acceptLanguageHeader("en-US,en;q=0.5")
  .header("Authorization", "Negotiate " + token)
  .doNotTrackHeader("1")
  .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")

val scn = scenario("My Tests").exec(http("Health check")
  .get("https://example-server.com")
  .check(status.is(200)))

  val scnForGetLocation = scenario("GetLocationHeader").exec(http("Location")
  .get("https://example-server.com")
  .check(status.is(200))  
  .check(header("Location").saveAs("url")))

  val testOne = scenario("testOne").exec(http("testOne") //Your actual test
  .get("${url}")
  .check(status.is(200)))

setUp(
  scn.inject(atOnceUsers(10))
).protocols(httpConfig)

Пожалуйста, проверьте этот пост также Gatling в Scala, как получить URL из перенаправления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...