我有代码,如果失败,目前无法运行我的方案;
//Defined outside of the scenario scope
var simulationHealthy = true
//defined within the scenario
.exec((session: io.gatling.core.session.Session) => {
if (session.status == KO) {
simulationHealthy = false
}
session
})
然而,我的模拟一直在运行,直到为模拟设置的持续时间结束,但场景不会继续执行。
我想要做的是在我定义的条件下(类似于断言)使场景失败,并且整个模拟在此时也失败,并且还生成报告。
由于
编辑:我在IntelliJ IDE中运行这些测试。需要以编程方式结束模拟。
答案 0 :(得分:3)
您可以在没有报告的情况下自行运行测试,并生成报告,第二次调用仅生成来自simulation.log
运行模拟没有报告(-nr
标志),即
gatling.sh -nr -s YourSimulationClass
生成报告(-ro
标志):
gatling.sh -ro yoursimulation
(您的结果是结果文件夹下面的路径,可以使用-rf
指定,其中包含simulation.log
文件)
在IntelliJ中,您可以在之前定义另一个要执行的LaunchConfiguration。因此,您可以定义用于执行Gatling Test(带有-nr
标志)的操作和用于生成报告的另一个配置(带有-ro
标志),该操作在之前执行Gatling Test运行操作。
或者你可以使用gatling-maven-plugin并使用相同的标志定义两个执行(run,report)。
根据此group thread,您可以有条件地执行步骤或将其静音。条件可能是出现错误,但也有其他任何错误。如果条件取决于全局状态,即全局变量,则会使所有用户静音(与exitHereIfFailed
不同)
例如:
val continue = new AtomicBoolean(true)
val scn = scenario("MyTest")
.exec(
doIf(session => continue.get) {
exec(http("request_0").get("/home").check(status.is(200)))
.exec((session: io.gatling.core.session.Session) => {
if (session.status == KO) {
continue.set(false)
}
session
})
})
如上所述,这只会停止向SUT发送请求。似乎目前没有其他选择(System.exit(0)
除外)
答案 1 :(得分:2)
您可以在exitHereIfFailed
返回的ScenarioBuilder
中使用exec()
。
.exec(http("login")
.post("/serviceapp/api/auth/login")
...
.check(status.is(200))))
.exitHereIfFailed
.pause(1)
.exec(http("getProfileDetails")
.get("/serviceapp/api/user/get_profile")
.headers(authHeader("${token}"))
.check(status.is(200)))
答案 2 :(得分:1)
感谢@GeraldMücke建议使用system.exit,我想出了一个解决方法。仍然没有接近理想的地方,但它确实有效。
问题是
这是代码。我在setUp函数中嵌套了模拟,因为它符合我目前正在进行的工作的标准,允许我在主模拟中运行多个模拟。
FailOverSimulation
和ScenarioFailOver
是需要添加到列表中的类;显然,当你运行在setUp中循环的东西时,这只会增加价值。
import java.util.concurrent.atomic.AtomicBoolean
import io.gatling.commons.stats.KO
import io.gatling.core.Predef._
import io.gatling.core.scenario.Simulation
import io.gatling.http.Predef._
import scala.concurrent.duration._
object ScenarioTest {
val get = scenario("Test Scenario")
.exec(http("Test Scenario")
.get("https://.co.uk/")
)
.exec((session: io.gatling.core.session.Session) => {
if(session.status == KO) {
ScenarioFailOver.exitFlag.set(true)
}
session
})
}
object TestSimulation {
val fullScenario = List(
ScenarioTest.get.inject(constantUsersPerSec(1).during(10.seconds))
)
}
object ScenarioFailOver {
var exitFlag = new AtomicBoolean(false)
val get = scenario("Fail Over")
.doIf(session => exitFlag.get()) {
exec(s => {
java.lang.System.exit(0)
s
})
}
}
object FailOverSimulation {
val fullScenario = List(
ScenarioFailOver.get.inject(constantUsersPerSec(1).during(10.seconds))
)
}
class SimulateTestEnding extends Simulation {
setUp(
FailOverSimulation.fullScenario
::: TestSimulation.fullScenario
).protocols(
)
}