在加特林场景之外进行 Http 调用

Make Http call outside of a scenario in gatling

我的用例是进行 http 调用,从响应中的位置 header 获取重定向 url,然后使用此 url 执行我的负载测试。此 url 是动态生成的,因此是初始的第一个 http 调用。请注意,测试第一个 http 调用不是我测试的一部分。实现这一目标的最佳方法是什么?在 gatling 中是否有类似 @BeforeMethod 的等价物?加特林本身可以用来进行独立的 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的理解有限。因此这个基本问题。

您可以在 Simulation.

的构造函数中进行任何需要的处理

这将是 运行 加特林 运行 时间,就在场景开始之前。

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. 
  }
}

(场景 API 确实提供了 "before" 和 "after" 挂钩(参见 docs here)但是没有简单的方法将信息从这些挂钩传递到场景中配置,因为你需要在这里做。)

您可以将 URL 保存到 header 中的某个变量或在 运行 某些情况下从响应中保存。试试下面的代码也许有帮助:

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)

请同时检查这个postGatling in scala how to get url from redirect

这取决于您希望如何处理第一次 HTTP 调用。我看到两种可能性:

  1. 每次模拟获取重定向 URL 一次,然后在模拟中多次调用同一个重定向 URL。在那种情况下,从加特林的角度来看,第一次调用将不会成为模拟的一部分。
  2. 在模拟中为每个用户独立获取重定向 URL,然后调用不同的重定向 URL 一次(或 N-times)。在这种情况下,第一个呼叫将是模拟的一部分,但您可以使用 group(name){...} 对呼叫进行分组,这样您将获得每个组的单独统计信息。

如果我正确理解了你的问题,你就会对第一个解决方案感兴趣。在这种情况下,您将需要使用一些外部 HTTP 客户端并生成该重定向 URL。当你可以放置任何逻辑时,Gatling 有 before{} 块(尽管你不能在那里使用 Gatling DSL)但老实说我只会在模拟的构造函数中这样做 class 例如如果重定向 url 作为 Location header 返回,您可以使用 Apache HTTP 客户端获取它:

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)))
}