1

我们正在使用 Gatling 对我们的应用程序进行负载测试(效果很好)。我们正在尝试通过对 Gatling 类进行可组合扩展来干掉一些代码(如ScenarioBuilder/ ChainBuilder/ 等,见io.gatling.core.structure)。

这是我们的一个场景的示例:

val scn = scenario("Whatever")
  .exec(Authentication.FeederLogin(userCsvFile, password))
  .exec(User.ExtractId(User.SignIn()))
  .exec(FindPeople(50, "personIds"))

  // SPA load
  .exec(User.FetchLandingPageFor("${userId}"))

  .during(durationSeconds.seconds) {
    pace(3.seconds, 8.seconds)
      .exec(Person.Search("${personIds.random()}"))
      .pause(3.seconds, 10.seconds)

      // start the upload
      .exec(Upload.create())
  }

我们想做是开始制作一些可组合的,以便我们可以在其他场景中重复使用它们。像这样的东西:

val scn = scenario("Whatever")
  .login()

  .during(durationSeconds.seconds) {
    pace(3.seconds, 8.seconds)
      .uploadFor("${personIds.random()}")
  }

// ...

object WhateverScenarios {
  implicit class ScenarioBuilderWithWhatevers(b: ScenarioBuilder) {

    def login() : ScenarioBuilder = {
      b.exec(Authentication.FeederLogin(userCsvFile, password))
      .exec(User.ExtractId(User.SignIn()))
      .exec(FindPeople(50, "personIds"))
    }

    def uploadFor(whom : String) : ScenarioBuilder {
      b.exec(Person.Search("${personIds.random()}"))
      .pause(3.seconds, 10.seconds)

      // start the upload
      .exec(Upload.create())
    }
  }
}

全面披露; 我对 Scala 不是很熟悉。这行得通,但问题uploadFor在于此时它正在使用 a ChainBuildervs. a ScenarioBuilder

我想

哦,简单!只需使用泛型!

除了我不能让它工作:(它看起来像大多数,extend StructureBuilder[T]但我似乎无法定义一个通用定义,我可以WhateverScenarios任何上下文中使用 my StructureBuilder[T]

提前感谢您提供的任何信息。

4

1 回答 1

0

所以我能够解决我的问题,但我不完全确定为什么我必须这样做。解决我的问题的原因如下:

object WhateverScenarios {
  implicit class StructureBuilderWithWhatevers[B <: io.gatling.core.structure.StructureBuilder[B]](b: B) {

    def login() : B = {
      b.exec(Authentication.FeederLogin(userCsvFile, password))
      .exec(User.ExtractId(User.SignIn()))
      .exec(FindPeople(50, "personIds"))
    }

    def uploadFor(whom : String) : ScenarioBuilder {
      b.exec(Person.Search("${personIds.random()}"))
      .pause(3.seconds, 10.seconds)

      // start the upload
      .exec(Upload.create())
    }
  }
}

让我陷入循环的事情,最初是我试图这样定义它:

object WhateverScenarios {
  implicit class StructureBuilderWithWhatevers[B <: StructureBuilder[B]](b: B) {
  // ...
}

但是当我这样做时,它没有识别loginuploadFor作为 or 的ScenarioBuilder一部分ChainBuilder。不知道为什么,但我已经指定了完全限定的包名让它工作¯\_(ツ)_/¯

编辑

原来,完全限定的包名是我机器上的一些奇怪的工件。解决./gradlew clean了这个问题,我不再需要使用完全限定的路径名​​。

于 2018-05-23T01:06:49.463 回答