Как правильно передать значения сеанса в метод feed () в gatling - PullRequest
0 голосов
/ 21 марта 2020

У меня следующая проблема. Когда я пытаюсь выполнить симуляцию, я получаю эту ошибку:

Generating reports...
Exception in thread "main" java.lang.UnsupportedOperationException: There were no requests sent during the simulation, reports won't be generated
    at io.gatling.charts.report.ReportsGenerator.generateFor(ReportsGenerator.scala:49)
    at io.gatling.app.RunResultProcessor.generateReports(RunResultProcessor.scala:62)
    at io.gatling.app.RunResultProcessor.processRunResult(RunResultProcessor.scala:40)
    at io.gatling.app.Gatling$.start(Gatling.scala:88)
    at io.gatling.app.Gatling$.fromMap(Gatling.scala:41)
    at Engine$.delayedEndpoint$Engine$1(Engine.scala:11)
    at Engine$delayedInit$body.apply(Engine.scala:4)
    at scala.Function0.apply$mcV$sp(Function0.scala:39)
    at scala.Function0.apply$mcV$sp$(Function0.scala:39)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
    at scala.App.$anonfun$main$1$adapted(App.scala:80)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.App.main(App.scala:80)
    at scala.App.main$(App.scala:78)
    at Engine$.main(Engine.scala:4)
    at Engine.main(Engine.scala)

Process finished with exit code 1

Ниже мой код:

package simulations

import io.gatling.core.Predef._
import io.gatling.core.scenario.Simulation
import io.gatling.http.Predef._

class Load extends Simulation{

  val httpProtocol = http
    .baseUrl("http://localhost:8080/app/")
    .header("Accept", "application/json")

  val scn = scenario("Scenario").exec(SimpleExample.simple)

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


package simulations

import io.gatling.core.Predef._
import io.gatling.http.Predef._    
import scala.util.Random

object SimpleExample {

  var simple =
    exec(session => session
      .set("rndmSTR", randomString())
      .set("rndmINT", randomInt())
    ).
      exec(
        session => {
          exec(feed(Iterator.continually(Map(
            "game_ID" -> session("rndmINT").as[String].toInt,
            "game_Name" -> session("rndmSTR").as[String]
          ))))
            .exec(
              http("Post New Game")
                .post("videogames/")
                .body(ElFileBody("bodies/newtemplate.json")).asJson
            )
          session
        }
      )

  private def randomString() = {
    new Random().alphanumeric.filter(_.isLetter).take(5).mkString.toLowerCase
  }    
  private def randomInt() = {
    new Random().nextInt(100000)
  }

}

Это мой. json:

{
  "id": "${game_ID}",
  "name": "${game_Name}",
  "releaseDate": "2020-08-11",
  "reviewScore": 99,
  "category": "Driving",
  "rating": "Mature"
}

Я знаю, что могу использовать метод feed () следующим образом:

package simulations

import io.gatling.core.Predef._
import io.gatling.http.Predef._    
import scala.util.Random    

object NextSimpleExample {

  var rndName: String = null
  var rndID: String = null    
  var feeder = Iterator.continually(Map(
    "game_ID" -> rndID.toInt,
    "game_Name" -> rndName
  ))    

  var simple =
    exec(session => session
      .set("rndmSTR", randomString())
      .set("rndmINT", randomInt())
    ).
      exec(
        session => {
          rndID = session("rndmINT").as[String]
          rndName = session("rndmSTR").as[String]
          session
        }
      )
      .exec(feed(feeder)
        .exec(
          http("Post New Game")
            .post("videogames/")
            .body(ElFileBody("bodies/newtemplate.json")).asJson)
      )

  private def randomString() = {
    new Random().alphanumeric.filter(_.isLetter).take(5).mkString.toLowerCase
  }    
  private def randomInt() = {
    new Random().nextInt(100000)
  }

}

, но в этом случае все виртуальные пользователи получат аналогичные значения ...

Кроме того, я хочу использовать сгенерированные для каждого виртуального пользователя значения в следующих шагах. Например, вставьте сгенерированный идентификатор и имя в другой файл. json для другого тела в запросе post или put. Пожалуйста, помогите решить эту проблему.

1 Ответ

0 голосов
/ 21 марта 2020

Определяющий DSL определяет компоновщики, которые создаются один раз, поэтому любой тип ссылочного кода, например

exec(session => session
  .set("rndmSTR", randomString())
  .set("rndmINT", randomInt())
)

, приведет к одинаковым значениям для всех пользователей.

Ваш второй пример действительно запутанный способ восстановления первого путем перевода в простые scala переменные - вы все еще когда-либо запускаете свои «случайные» функции один раз.

Но вы были близки - если вы переместите свои случайные функции в определение фидера, это сработает, потому что функции будут оцениваться каждый раз, когда вызывается .feed.

var feeder = Iterator.continually(Map(
  "game_ID" -> randomString(),
  "game_Name" -> randomInt()
))    

Таким образом, вы не сможете вообще не нужны функции сеанса

...