场景失败时结束加特林模拟但是生成报告

时间:2016-11-30 16:22:37

标签: gatling

我有代码,如果失败,目前无法运行我的方案;

//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中运行这些测试。需要以编程方式结束模拟。

3 个答案:

答案 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,我想出了一个解决方法。仍然没有接近理想的地方,但它确实有效。

问题是

  • 仍然必须从运行gatling时创建的日志中手动生成报告
  • 用户必须不断管理两个项目的场景持续时间,因为我不知道某个场景的持续时间是模拟的长度。
  • 这显然是一个“概念证明”,它在代码中没有任何内容来定义故障超过阈值等,如Gatling本身可用的断言和检查

这是代码。我在setUp函数中嵌套了模拟,因为它符合我目前正在进行的工作的标准,允许我在主模拟中运行多个模拟。

FailOverSimulationScenarioFailOver是需要添加到列表中的类;显然,当你运行在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(
  )
}