为什么这个 Gatling 作业不是按顺序 运行?
Why is this Gatling job not running sequentially?
我想做的是:
- 进行 GET 调用以获取
id
的列表
- 对所有这些 ID 进行一系列其他 GET 调用
这是我的代码:
/**
* 由 pbane3 创建于 2016 年 11 月 10 日。
*/
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.concurrent.forkjoin.ThreadLocalRandom
import scala.collection.mutable
import scala.collection.Map
class RunWithMePerfTest extends Simulation {
var idList = List[String]()
var count = 0;
def idFeeder(idString:String):Unit = {
idList = idString.split(",").map(_.trim).toList;
println(idList)
}
def getRunId() : String = {
println(count)
var id = idList(count);
count = count+1;
return id;
}
object GetAllRunDetails {
val getAllRunDetails = exec(http("Get Run Ids")
.get("**/**")
.check(status in (200 to 209))
// .check(bodyString.saveAs("GetResponse"))
.check(jsonPath("$..id").ofType[String].findAll.transform(_.mkString(",")).saveAs("runId")))
.exec(
session => {
var getJson = session.get("GetResponse").asOption[String];
var runId = session.get("runId").asOption[String]
// println("Run ID === ")
// println(runId.get)
idFeeder(runId.get)
session
}
)
}
object GetRunIdDetails{
println("Length=" + idList.length)
val getRunIdDetails = repeat(idList.length) {
exec(http("Getting Run Details")
.get(s"****/***" + getRunId())
.check(status in (200 to 209))
.check(bodyString.saveAs("GetRunIdResponse"))
)
.exec(
session => {
var getResponse = session.get("GetRunIdResponse").asOption[String];
println("Response from Get" + getResponse.get)
session
}
)
}
}
val scn = scenario("All run details")
.exec(GetAllRunDetails.getAllRunDetails, GetRunIdDetails.getRunIdDetails)
setUp(scn.inject(atOnceUsers(1)));
}
但是这里为什么GetAllRunDetails.getAllRunDetails
不是GetRunIdDetails.getRunIdDetails
之前的运行?那是我的 idList 永远不会被定义。
我收到的错误是:
Length=0
0
Exception in thread "main" java.lang.IndexOutOfBoundsException: 0
at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
at scala.collection.immutable.List.apply(List.scala:84)
at nike.runwithme.performance.RunWithMePerfTest.getRunId(RunWithMePerfTest.scala:27)
at nike.runwithme.performance.RunWithMePerfTest$GetRunIdDetails$.<init>(RunWithMePerfTest.scala:57)
at nike.runwithme.performance.RunWithMePerfTest.GetRunIdDetails$lzycompute(RunWithMePerfTest.scala:51)
at nike.runwithme.performance.RunWithMePerfTest.GetRunIdDetails(RunWithMePerfTest.scala:51)
at nike.runwithme.performance.RunWithMePerfTest.<init>(RunWithMePerfTest.scala:73)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at io.gatling.app.Gatling$.io$gatling$app$Gatling$$$anonfun(Gatling.scala:41)
at io.gatling.app.Gatling$lambda.apply(Gatling.scala:41)
at io.gatling.app.Gatling$lambda.apply(Gatling.scala:41)
at io.gatling.app.Gatling.run(Gatling.scala:92)
at io.gatling.app.Gatling.runIfNecessary(Gatling.scala:75)
at io.gatling.app.Gatling.start(Gatling.scala:65)
at io.gatling.app.Gatling$.start(Gatling.scala:57)
at io.gatling.app.Gatling$.fromArgs(Gatling.scala:49)
at io.gatling.app.Gatling$.main(Gatling.scala:43)
at io.gatling.app.Gatling.main(Gatling.scala)
您可以将场景按顺序链接到 运行。尝试创建两个场景,然后将它们链接起来,例如。
scn1 = scenario("Get All run details")
.exec(GetAllRunDetails.getAllRunDetails)
scn2 = scenario("bla").exec(GetRunIdDetails.getRunIdDetails)
seqScenario = scn1.exec(scn2)
添加到答案中:
exec 在 运行 之前被初始化。那时因为你正在调用 .get(s"****/***" + getRunId()) 方法,idList 中还没有数据,所以你的 运行 甚至在它之前就失败了开始。您可以添加另一个 exec,它将数据放入会话中,然后才能在 get 调用中使用它。
所以这是对我有用的答案。几乎相同的代码,但在第二个场景中添加了 session
。有道理,因为所有内容都添加到 session
:
/**
* Created by pbane3 on 11/10/16.
*
* The First test gets the Run Id's
*
* Then it creates a a List of all the RunIDs
*
* After that loops through each of the RunIDs
* and makes a GET call for each of them
*/
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.concurrent.forkjoin.ThreadLocalRandom
import scala.collection.mutable
import scala.collection.Map
import java.io.File
import java.io.PrintWriter
class RunWithMePerfTest extends Simulation {
//this is used to store the list of the runIds
var idList = List[String]()
var count = 0;
//used to build the list and feed to the session
def idFeeder(idString:String):Unit = {
idList = idString.split(",").map(_.trim).toList;
println(idList)
}
//used to access the list and feed to the session
def getRunId() : String = {
println(count)
var id = idList(count);
count = count+1;
return id;
}
//makes the initial call to get all the run IDs
object GetAllRunDetails {
println("I come in scn1")
val getAllRunDetails = exec(http("Get Run Ids")
.get("https://someUrl")
.check(status in (200 to 209))
// .check(bodyString.saveAs("GetResponse"))
.check(jsonPath("$..id").ofType[String].findAll.transform(_.mkString(",")).saveAs("runId")))
.exec(
session => {
var getJson = session.get("GetResponse").asOption[String];
var runId = session.get("runId").asOption[String]
idFeeder(runId.get)
session
}
)
}
//makes one get call for each of the run ids obtained from the last get call
object GetRunIdDetails{
val getRunIdDetails = repeat(session=>idList.length) {
exec(http("Getting Run Details")
.get(session => (s"https://someUrl" + getRunId()))
.check(status in (200 to 209))
.check(bodyString.saveAs("GetRunIdResponse"))
)
.exec(
session => {
var getResponse = session.get("GetRunIdResponse").asOption[String];
println("Response from Get:")
println(getResponse.get)
session
}
)
}
}
val scn1 = scenario("All run details")
.exec(GetAllRunDetails.getAllRunDetails)
val scn2 = scenario("All run ID Details")
.exec(GetRunIdDetails.getRunIdDetails)
setUp(scn1.inject(atOnceUsers(1)),scn2.inject(nothingFor(10 seconds),atOnceUsers(1)));
}
我想做的是:
- 进行 GET 调用以获取
id
的列表
- 对所有这些 ID 进行一系列其他 GET 调用
这是我的代码:
/** * 由 pbane3 创建于 2016 年 11 月 10 日。 */
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.concurrent.forkjoin.ThreadLocalRandom
import scala.collection.mutable
import scala.collection.Map
class RunWithMePerfTest extends Simulation {
var idList = List[String]()
var count = 0;
def idFeeder(idString:String):Unit = {
idList = idString.split(",").map(_.trim).toList;
println(idList)
}
def getRunId() : String = {
println(count)
var id = idList(count);
count = count+1;
return id;
}
object GetAllRunDetails {
val getAllRunDetails = exec(http("Get Run Ids")
.get("**/**")
.check(status in (200 to 209))
// .check(bodyString.saveAs("GetResponse"))
.check(jsonPath("$..id").ofType[String].findAll.transform(_.mkString(",")).saveAs("runId")))
.exec(
session => {
var getJson = session.get("GetResponse").asOption[String];
var runId = session.get("runId").asOption[String]
// println("Run ID === ")
// println(runId.get)
idFeeder(runId.get)
session
}
)
}
object GetRunIdDetails{
println("Length=" + idList.length)
val getRunIdDetails = repeat(idList.length) {
exec(http("Getting Run Details")
.get(s"****/***" + getRunId())
.check(status in (200 to 209))
.check(bodyString.saveAs("GetRunIdResponse"))
)
.exec(
session => {
var getResponse = session.get("GetRunIdResponse").asOption[String];
println("Response from Get" + getResponse.get)
session
}
)
}
}
val scn = scenario("All run details")
.exec(GetAllRunDetails.getAllRunDetails, GetRunIdDetails.getRunIdDetails)
setUp(scn.inject(atOnceUsers(1)));
}
但是这里为什么GetAllRunDetails.getAllRunDetails
不是GetRunIdDetails.getRunIdDetails
之前的运行?那是我的 idList 永远不会被定义。
我收到的错误是:
Length=0
0
Exception in thread "main" java.lang.IndexOutOfBoundsException: 0
at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
at scala.collection.immutable.List.apply(List.scala:84)
at nike.runwithme.performance.RunWithMePerfTest.getRunId(RunWithMePerfTest.scala:27)
at nike.runwithme.performance.RunWithMePerfTest$GetRunIdDetails$.<init>(RunWithMePerfTest.scala:57)
at nike.runwithme.performance.RunWithMePerfTest.GetRunIdDetails$lzycompute(RunWithMePerfTest.scala:51)
at nike.runwithme.performance.RunWithMePerfTest.GetRunIdDetails(RunWithMePerfTest.scala:51)
at nike.runwithme.performance.RunWithMePerfTest.<init>(RunWithMePerfTest.scala:73)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at io.gatling.app.Gatling$.io$gatling$app$Gatling$$$anonfun(Gatling.scala:41)
at io.gatling.app.Gatling$lambda.apply(Gatling.scala:41)
at io.gatling.app.Gatling$lambda.apply(Gatling.scala:41)
at io.gatling.app.Gatling.run(Gatling.scala:92)
at io.gatling.app.Gatling.runIfNecessary(Gatling.scala:75)
at io.gatling.app.Gatling.start(Gatling.scala:65)
at io.gatling.app.Gatling$.start(Gatling.scala:57)
at io.gatling.app.Gatling$.fromArgs(Gatling.scala:49)
at io.gatling.app.Gatling$.main(Gatling.scala:43)
at io.gatling.app.Gatling.main(Gatling.scala)
您可以将场景按顺序链接到 运行。尝试创建两个场景,然后将它们链接起来,例如。
scn1 = scenario("Get All run details")
.exec(GetAllRunDetails.getAllRunDetails)
scn2 = scenario("bla").exec(GetRunIdDetails.getRunIdDetails)
seqScenario = scn1.exec(scn2)
添加到答案中: exec 在 运行 之前被初始化。那时因为你正在调用 .get(s"****/***" + getRunId()) 方法,idList 中还没有数据,所以你的 运行 甚至在它之前就失败了开始。您可以添加另一个 exec,它将数据放入会话中,然后才能在 get 调用中使用它。
所以这是对我有用的答案。几乎相同的代码,但在第二个场景中添加了 session
。有道理,因为所有内容都添加到 session
:
/**
* Created by pbane3 on 11/10/16.
*
* The First test gets the Run Id's
*
* Then it creates a a List of all the RunIDs
*
* After that loops through each of the RunIDs
* and makes a GET call for each of them
*/
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.concurrent.forkjoin.ThreadLocalRandom
import scala.collection.mutable
import scala.collection.Map
import java.io.File
import java.io.PrintWriter
class RunWithMePerfTest extends Simulation {
//this is used to store the list of the runIds
var idList = List[String]()
var count = 0;
//used to build the list and feed to the session
def idFeeder(idString:String):Unit = {
idList = idString.split(",").map(_.trim).toList;
println(idList)
}
//used to access the list and feed to the session
def getRunId() : String = {
println(count)
var id = idList(count);
count = count+1;
return id;
}
//makes the initial call to get all the run IDs
object GetAllRunDetails {
println("I come in scn1")
val getAllRunDetails = exec(http("Get Run Ids")
.get("https://someUrl")
.check(status in (200 to 209))
// .check(bodyString.saveAs("GetResponse"))
.check(jsonPath("$..id").ofType[String].findAll.transform(_.mkString(",")).saveAs("runId")))
.exec(
session => {
var getJson = session.get("GetResponse").asOption[String];
var runId = session.get("runId").asOption[String]
idFeeder(runId.get)
session
}
)
}
//makes one get call for each of the run ids obtained from the last get call
object GetRunIdDetails{
val getRunIdDetails = repeat(session=>idList.length) {
exec(http("Getting Run Details")
.get(session => (s"https://someUrl" + getRunId()))
.check(status in (200 to 209))
.check(bodyString.saveAs("GetRunIdResponse"))
)
.exec(
session => {
var getResponse = session.get("GetRunIdResponse").asOption[String];
println("Response from Get:")
println(getResponse.get)
session
}
)
}
}
val scn1 = scenario("All run details")
.exec(GetAllRunDetails.getAllRunDetails)
val scn2 = scenario("All run ID Details")
.exec(GetRunIdDetails.getRunIdDetails)
setUp(scn1.inject(atOnceUsers(1)),scn2.inject(nothingFor(10 seconds),atOnceUsers(1)));
}