Пользовательский DSL за счет расширения Gatling: как использовать Scala? - PullRequest
0 голосов
/ 22 мая 2018

Мы используем 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 в том, что в этот момент он работает с ChainBuilder против ScenarioBuilder.

Я думал

О, просто!Просто используйте дженерики!

За исключением того, что я не могу заставить его работать :( Это выглядит , как большинство из них extend StructureBuilder[T], но я не могу показатьсячтобы получить общее определение, в котором я могу использовать свой WhateverScenarios в любом контексте StructureBuilder[T].

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

1 Ответ

0 голосов
/ 23 мая 2018

Так что я смог обойти мою проблему, но я не совсем уверен, почему я должен был это сделать.Моя проблема была исправлена ​​следующим образом:

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) {
  // ...
}

Но когда я это сделал, он не распознал login или uploadFor как часть ScenarioBuilder или ChainBuilder.Не знаю почему, но у меня было указано полное имя пакета, чтобы он работал ¯ \ _ (ツ) _ / ¯

Edit

Оказывается, что полное имя пакета былостранный артефакт, который у меня был на моей машине.Выполнение ./gradlew clean решило проблему, и мне больше не нужно использовать полное имя пути.

...