如何从加特林参数化模拟中获取每个场景报告?

How to get per scenario reports from parameterized simulations in gatling?

我正在尝试测试单个 API,它在内部根据输入执行不同的操作:

下面的模拟是我想出来的:

val countries = List("US", "CAN")
val customerTypes = List("TYPE1", "TYPE2")
val basketSizes = List(1, 10, 50)

val scenarioGenerator: Seq[(String, String, Int)] = for {
  country <- countries
  customerType <- customerTypes
  basketSize <- basketSizes
} yield (country, customerType, basketSize)

def scenarios(): Seq[PopulationBuilder] = {
  var scenarioList = new ArraySeq[PopulationBuilder](countries.size * customerTypes.size * basketSizes.size)
  var i = 0;
  for ((country: String, customerType: String, basketSize: Int) <- scenarioGenerator) {
    // fetch customer data for scenario
    val customers = DataFetcher.customerRequest(country, customerType)
    // fetch product data for scenario
    val products = DataFetcher.productRequest(country)

    // generate a scenario with given data and parameters
    val scen = scenario(s"Pricing-(${country},${customerType},${basketSize})")
      // feeder that creates the request object for the gatling user
      .feed(new PricingFeeder(country, customers, products, basketSize))
      .repeat(10) {
        exec(Pricing.price)
          .pause(500 milliseconds)
      }
      .inject(
        rampUsers(10) over (10 seconds)
      )
    scenarioList(i) = scen

    i = i + 1
  }

  scenarioList
}

setUp(scenarios: _*).protocols(httpProto)

这是 运行 使用 maven 插件(以及使用 gatling 插件在 jenkins 中进行跟踪),但这会导致一个跟踪案例:Pricing。这是没有用的,因为即使是项目数量也会接近响应时间的线性增长。

simulation.log 具有每个场景类型的数据,但开箱即用的报告将其作为单一类型的查询处理,并将所有结果合并到一个图表中,这意味着不可能查看某个组合是否由于计算或数据错误而导致峰值。

我想为每个组合获取单独的指标,因此很容易看到 API 中的代码或数据更改导致 Pricing-(US,TYPE1,50)场景。

用加特林实现这一目标的惯用方法是什么?我不想为每种情况创建模拟,因为这将是管理的噩梦(我们正在努力实现的目标是使用 jmeter 摆脱手动管理的数据和 jenkins 作业)。

第一件事 - 在一个模拟中 运行 如此多的场景并不是一个好的做法,因为它 运行 并行而不是顺序地设置它们,所以你应该确保它是你想要的.

如果是这样,您可以使用 gatling 报告允许按组显示图表的事实。因此,您可以将所有请求包装在基于参数命名的组中,这样在报告的详细视图中您将能够 select 显示哪个组,fe.:

 val singleScenario = scenario(s"Pricing-(${country},${customerType},${basketSize})")
   .group(s"Pricing-(${country},${customerType},${basketSize})"){
      .feed(new PricingFeeder(country, customers, products, basketSize))
        .repeat(10) {
          exec(Pricing.price)
            .pause(500 milliseconds)
        }
    }

如果您不需要所有场景并行 运行,并且希望为不同场景单独报告,最好的方法是将模拟 class 作为参数化摘要 class 实现并添加单独的classes 对于每个参数集,如 Gatling 中的一次模拟等于报告,fe.:

package com.performance.project.simulations

import io.gatling.core.Predef.Simulation
import scala.concurrent.duration._

class UsType1Simulation1 extends ParametrizedSimulation("US", "TYPE1", 1)
class UsType1Simulation10 extends ParametrizedSimulation("US", "TYPE1", 10)
class UsType1Simulation50 extends ParametrizedSimulation("US", "TYPE1", 50)

class UsType2Simulation1 extends ParametrizedSimulation("US", "TYPE2", 1)
class UsType2Simulation10 extends ParametrizedSimulation("US", "TYPE2", 10)
class UsType2Simulation50 extends ParametrizedSimulation("US", "TYPE2", 50)

class CanType1Simulation1 extends ParametrizedSimulation("CAN", "TYPE1", 1)
class CanType1Simulation10 extends ParametrizedSimulation("CAN", "TYPE1", 10)
class CanType1Simulation50 extends ParametrizedSimulation("CAN", "TYPE1", 50)

class CanType2Simulation1 extends ParametrizedSimulation("CAN", "TYPE2", 1)
class CanType2Simulation10 extends ParametrizedSimulation("CAN", "TYPE2", 10)
class CanType2Simulation50 extends ParametrizedSimulation("CAN", "TYPE2", 50)

sealed abstract class ParametrizedSimulation(country: String, customerType: String, basketSize: Int) extends Simulation{

  val customers = DataFetcher.customerRequest(country, customerType)
  val products = DataFetcher.productRequest(country)

  val singleScenario = scenario(s"Pricing-(${country},${customerType},${basketSize})")
    .feed(new PricingFeeder(country, customers, products, basketSize))
    .repeat(10) {
      exec(Pricing.price)
      .pause(500 milliseconds)
    }
    .inject(
      rampUsers(10) over (10 seconds)
    )

  setUp(singleScenario).protocols(httpProto)
}

当然只有少量组合才有意义,成百上千就乱了。