当场景失败但生成报告时结束 Gatling 模拟
End Gatling simulation when scenario fails BUT generate a report
我的代码如果失败,目前不会运行我的场景;
//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
})
然而,我的模拟保持 运行ning 直到模拟的持续时间结束,尽管场景不会继续执行。
我想做的是让场景在我定义的条件下失败(类似于断言),并且整个模拟在那个时候也失败,并生成报告。
谢谢
编辑:我在 IntelliJ IDE 中 运行 进行这些测试。需要以编程方式结束模拟。
您可能 运行 测试本身没有报告,并通过第二次调用生成报告,仅从 simulation.log
生成报告
运行模拟w/o报告(-nr
标志),即
gatling.sh -nr -s YourSimulationClass
生成报告(-ro
标志):
gatling.sh -ro yoursimulation
(你的模拟是结果文件夹下的路径,可以用-rf
指定,里面有simulation.log
文件)
在 IntelliJ 中,您可以定义另一个要在 之前执行的 LaunchConfiguration。因此,您定义了一个用于执行 Gatling 测试的操作(带有 -nr
标志)和另一个用于生成报告的配置(带有 -ro
标志),它执行 Gatling 测试 运行 操作 之前.
或者,您可以使用 gatling-maven-plugin 并使用相同的标志定义两个执行(运行,报告)。
编辑
根据这个 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)
)
感谢@GeraldMücke 关于使用 system.exit 的建议,我想出了一个变通办法。仍然没有接近理想的地方,但它完成了工作。
问题是
- 仍然需要从加特林 运行
时创建的日志中手动生成报告
- 用户必须不断管理两个项目的场景持续多长时间,因为我不知道如何让场景持续模拟的长度
- 这显然是一个 "proof of concept" 它在代码中没有任何内容来定义超过阈值的失败等,例如 Gatling 本身可用的断言和检查
这是代码。我在 setUp 函数中嵌套了模拟,因为它符合我目前正在做的工作的标准,允许我在主模拟中 运行 多次模拟。
FailOverSimulation
和ScenarioFailOver
是需要添加到列表中的类;显然,这只会在您 运行 设置在设置中循环的内容时增加价值。
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(
)
}
您可以在 exec()
返回的 ScenarioBuilder
中使用 exitHereIfFailed
。
.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)))
我的代码如果失败,目前不会运行我的场景;
//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
})
然而,我的模拟保持 运行ning 直到模拟的持续时间结束,尽管场景不会继续执行。
我想做的是让场景在我定义的条件下失败(类似于断言),并且整个模拟在那个时候也失败,并生成报告。
谢谢
编辑:我在 IntelliJ IDE 中 运行 进行这些测试。需要以编程方式结束模拟。
您可能 运行 测试本身没有报告,并通过第二次调用生成报告,仅从 simulation.log
运行模拟w/o报告(-nr
标志),即
gatling.sh -nr -s YourSimulationClass
生成报告(-ro
标志):
gatling.sh -ro yoursimulation
(你的模拟是结果文件夹下的路径,可以用-rf
指定,里面有simulation.log
文件)
在 IntelliJ 中,您可以定义另一个要在 之前执行的 LaunchConfiguration。因此,您定义了一个用于执行 Gatling 测试的操作(带有 -nr
标志)和另一个用于生成报告的配置(带有 -ro
标志),它执行 Gatling 测试 运行 操作 之前.
或者,您可以使用 gatling-maven-plugin 并使用相同的标志定义两个执行(运行,报告)。
编辑
根据这个 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)
)
感谢@GeraldMücke 关于使用 system.exit 的建议,我想出了一个变通办法。仍然没有接近理想的地方,但它完成了工作。
问题是
- 仍然需要从加特林 运行 时创建的日志中手动生成报告
- 用户必须不断管理两个项目的场景持续多长时间,因为我不知道如何让场景持续模拟的长度
- 这显然是一个 "proof of concept" 它在代码中没有任何内容来定义超过阈值的失败等,例如 Gatling 本身可用的断言和检查
这是代码。我在 setUp 函数中嵌套了模拟,因为它符合我目前正在做的工作的标准,允许我在主模拟中 运行 多次模拟。
FailOverSimulation
和ScenarioFailOver
是需要添加到列表中的类;显然,这只会在您 运行 设置在设置中循环的内容时增加价值。
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(
)
}
您可以在 exec()
返回的 ScenarioBuilder
中使用 exitHereIfFailed
。
.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)))