Gatling.io как передать значение из csv файла?

Всем привет! Написал небольшой нагрузочный тест на gatling.io

import BasicLoad.start
import Requests.usersLogin
import io.gatling.core.ConfigKeys.socket
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.scenario.Simulation
import io.gatling.jsonpath
import io.socket.client.{Ack, IO, Socket}
import io.socket.emitter.Emitter
import io.socket.emitter.Emitter.Listener
import org.json.JSONObject

import scala.concurrent.duration._
import scala.language.postfixOps

class ServerLoad extends Simulation{

  val port = Integer.getInteger("port", 8080)
  val host = System.getProperty("host", "localhost")
  val wsUrl = "wss://$host:$port/socket.io/?EIO=3&transport=websocket&sid=" + "${sessionId}"
  val socketUrl = "https://testing.ros.chat:8080"
  val optConnect = new IO.Options()

  val users = csv("./users.csv")
    .circular
  val httpConf = http.baseUrl("https://localhost")
    /*.userAgentHeader("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) " +
      "Chrome/81.0.4044.138 YaBrowser/20.4.3.268 (beta) Yowser/2.5 Safari/537.36")*/
    .wsBaseUrl("wss://localhost:8080")
  val scn = scenario("UsersLogin").feed(users).during(5 second){
      //exec(usersLogin)
     exec(ws("Send user-agent").connect("/socket.io/?EIO=3&transport=websocket")
       .headers(
         Map(
           "User-Agent" -> "${device}"
         )
       )
     )
     .pause(1)
     .exec(session => {
       val obj = new JSONObject()
       obj.put("login", "${login}")
       obj.put("password", "${password}")
       obj.put("APILevel", "${level}")
       optConnect.forceNew = false
       optConnect.timeout = 10000
       val socket = IO.socket( socketUrl, optConnect )
       val printListener: Emitter.Listener = new Emitter.Listener {
         override def call(args: AnyRef*): Unit = {
         }
       }
       socket.on(Socket.EVENT_CONNECT, printListener)
       socket.connect()
       socket.emit("login",obj)
       session
      }
     )
       .pause(5)
     .exec(ws("Close connect").close)
    }

  setUp(scn.inject(rampUsers(1)  during(1 second)).
    protocols(httpConf))
    .maxDuration(2 second)
}

У меня 2 вопроса:

  1. Как передать значения из файла csv в exec с session
.exec(session => {
       val obj = new JSONObject()
       obj.put("login", "${login}")
       obj.put("password", "${password}")
       obj.put("APILevel", "${level}")
       optConnect.forceNew = false
       optConnect.timeout = 10000
       val socket = IO.socket( socketUrl, optConnect )
       val printListener: Emitter.Listener = new Emitter.Listener {
         override def call(args: AnyRef*): Unit = {
         }
       }
       socket.on(Socket.EVENT_CONNECT, printListener)
       socket.connect()
       socket.emit("login",obj)
       session
      }
     )

Сейчас отправляются значения ${login} вместо значения из файла

  1. Как в
socket.emit("login",obj)

обработать callback. Не нашёл в поисковиках информации по этой теме. Спасибо

Со вторым вопросом я потихоньку разбираюсь. Научился получать callback

socket.emit("login",obj, new Ack {
         override def call(args: AnyRef*): Unit = {
           println(args)
         }
       })

Получаю вот такой результат

WrappedArray({"uid":989,"APILevel":5,"status":"ok"})

Как преобразовать в JSON формат и проверить, что status = ok?

Вы хотя бы базовую документацию сначала почитали бы перед тем как такое выкладывать

С первым вопросом неочевидно. В примерах описано передача значения таким образом ${login}, но в блоке с session, почему-то не работает

Получилось конвертировать в JSON и получать значение status, теперь надо, как-то проверить, что статус ok вернулся

Победа)

import BasicLoad.start
import Requests.usersLogin
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.scenario.Simulation
import io.socket.client.{Ack, IO, Socket}
import io.socket.emitter.Emitter
import org.json.JSONObject

import scala.concurrent.duration._
import scala.language.postfixOps
import play.api.libs.json._

class ServerLoad extends Simulation{

  val socketUrl = "https://localhost:8080"
  val optConnect = new IO.Options()
  var status_ack: Boolean = false
  optConnect.forceNew = false
  optConnect.timeout = 5000
  val socket = IO.socket(socketUrl, optConnect)
  var start: Long = 0L
  var jsonContacts = new JSONObject()
  
  val users = csv("./users.csv")
    .queue
  val httpConf = http.baseUrl("https://localhost")
    /*.userAgentHeader("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) " +
      "Chrome/81.0.4044.138 YaBrowser/20.4.3.268 (beta) Yowser/2.5 Safari/537.36")*/
    .wsBaseUrl("wss://localhost:8080")
  val scn = scenario("UsersLogin")
      .feed(users)
      .during(60 seconds) {
        exec( ws( "Send user-agent" ).connect( "/socket.io/?EIO=3&transport=websocket" )
          .headers(
            Map(
              "User-Agent" -> "${device}"
            )
          )
        )
          .exec(
            session => {
              val obj = new JSONObject()
              status_ack = false
              obj.put( "login", session( "login" ).as[String] )
              obj.put( "password", session( "password" ).as[String] )
              obj.put( "APILevel", session( "level" ).as[String] )
              val printListenerLogin: Emitter.Listener = new Emitter.Listener {
                override def call(args: AnyRef*): Unit = {
                  println( "Login time: " + ((System.nanoTime - start) / 1000000) )
                }
              }
              socket.on( Socket.EVENT_CONNECT, printListenerLogin )
              socket.connect()
              socket.emit( "login", obj, new Ack {
                override def call(args: AnyRef*): Unit = {
                  val ackData = args.apply( 0 ).toString()
                  status_ack = (Json.parse( ackData ) \\ "status") ( 0 ).toString().contains( """ok""" )
                  if( ! status_ack){
                    exec( ws( "Close connect" ).close )
                  }else{
                    println("Send emit get-user-info")
                    socket.emit("get-user-info", "", new Ack {
                      override def call(info: AnyRef*): Unit = {
                        //println( info )
                      }
                    })
                    println("Send emit get-user-params")
                    socket.emit( "get-user-params", "", new Ack {
                      override def call(params: AnyRef*): Unit = {
                        //println( params )
                      }
                    } )
                    jsonContacts.put( "type", "global" )
                    socket.emit( "get-contacts", jsonContacts, new Ack {
                      override def call(args: AnyRef*): Unit = {
                        //print( args )
                      }
                    } )
                    jsonContacts.put( "type", "local" )
                    socket.emit( "get-contacts", jsonContacts, new Ack {
                      override def call(args: AnyRef*): Unit = {
                        //print( args )
                      }
                    } )
                  }
                }
              } )
              session
            }
          )
          .pause(5)
          .exec( ws( "Close connect" ).close )
    }

  setUp(scn.inject(rampUsers(100) during(10 seconds)).
    protocols(httpConf))
    .maxDuration(60 seconds)
}