当场景失败但生成报告时结束 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 函数中嵌套了模拟,因为它符合我目前正在做的工作的标准,允许我在主模拟中 运行 多次模拟。

FailOverSimulationScenarioFailOver是需要添加到列表中的类;显然,这只会在您 运行 设置在设置中循环的内容时增加价值。

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)))