pbezpal5
(Pavel)
#1
Всем привет! Написал небольшой нагрузочный тест на 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 вопроса:
- Как передать значения из файла 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} вместо значения из файла
- Как в
socket.emit("login",obj)
обработать callback. Не нашёл в поисковиках информации по этой теме. Спасибо
pbezpal5
(Pavel)
#2
Со вторым вопросом я потихоньку разбираюсь. Научился получать 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?
kasheylm
(Denis Veselovskiy)
#3
Вы хотя бы базовую документацию сначала почитали бы перед тем как такое выкладывать
pbezpal5
(Pavel)
#4
С первым вопросом неочевидно. В примерах описано передача значения таким образом ${login}, но в блоке с session, почему-то не работает
pbezpal5
(Pavel)
#5
Получилось конвертировать в JSON и получать значение status, теперь надо, как-то проверить, что статус ok вернулся
pbezpal5
(Pavel)
#6
Победа)
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)
}