Итерации по массиву в Scala - PullRequest
       84

Итерации по массиву в Scala

1 голос
/ 05 августа 2020

Я новичок в Scala и пытаюсь написать несколько скриптов для нагрузочного тестирования с использованием Gatling. Я пытаюсь определить повторно используемый метод для отправки нагрузки, поэтому я создал метод ниже:

def startLoad(scenario: Array[ScenarioBuilder]) = {
        setUp(
            scnGetAuthorizationToken.inject(
              atOnceUsers(1)
              ),
            
        for (i <- 0 until scenario.length) {
            scenario(i).inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
             }
            ).protocols(httpConf.inferHtmlResources())
             .maxDuration(testDuration seconds)
             .assertions(
                 global.responseTime.max.lt(maxResponseTime),
                 global.successfulRequests.percent.gt(successfulRequests)
                 )
        }

Но компилятор выдает ошибку ниже для оператора for. У меня такая же ошибка, когда я также использовал «foreach»:

type mismatch; found : Unit required: io.gatling.core.structure.PopulationBuilder

Может кто-нибудь, пожалуйста, помогите мне, как избавиться от этой ошибки?

В общем, я хотел бы получить этот код в следующем формате (несколько строк кода вызывается для разных переменных типа ScenarioBuilder) и, следовательно, пытается придумать метод многократного использования, как определено выше:

def startLoad(scenario: Array[ScenarioBuilder]) = {
        setUp(
            scnGetAuthorizationToken.inject(
              atOnceUsers(1)
              ),
            
            scenario1.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
             
            scenario2.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
                   
            scenario3.inject(
               nothingFor(5 seconds),
               atOnceUsers(atOnceUserCount)
               ).throttle(
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps/2) in (testDuration/4 seconds),
                   reachRps(maxRps) in (testDuration/2 seconds)),
           ------        

            ).protocols(httpConf.inferHtmlResources())
             .maxDuration(testDuration seconds)
             .assertions(
                 global.responseTime.max.lt(maxResponseTime),
                 global.successfulRequests.percent.gt(successfulRequests)
                 )
        }

Итак, в основном, я бы хотелось бы повторить приведенные ниже строки кода для каждого элемента массива, который передается в качестве аргумента методу.

             inject(
                   nothingFor(5 seconds),
                   atOnceUsers(atOnceUserCount)
                   ).throttle(
                       reachRps(maxRps/2) in (testDuration/4 seconds),
                       reachRps(maxRps/2) in (testDuration/4 seconds),
                       reachRps(maxRps) in (testDuration/2 seconds)),

1 Ответ

2 голосов
/ 05 августа 2020

Gatling не выполняет код классов Simulation напрямую. Думайте об этом как о построителе тестовой конфигурации, которая читается фреймворком.

Метод setUp может быть вызван только один раз для каждого класса Simulation. Если вы хотите создать 3 разных сценария ios с одним и тем же профилем впрыска, дросселем и утверждениями, лучшим способом будет создание абстрактного класса со всеми этими определенными настройками и расширение этого класса на 3 других, например:

import io.gatling.core.Predef.{Simulation, _}
import io.gatling.core.structure.ScenarioBuilder
import io.gatling.http.Predef.{http, status, _}

abstract class BaseScenario(scenario: ScenarioBuilder) extends Simulation{
  setUp(scenario.inject(
    atOnceUsers(5))
  ).protocols(
    http.shareConnections
  ).assertions(
    global.failedRequests.percent.lte(1)
  )
}

class ScenarioA extends BaseScenario(
  scenario("Example Scenario A")
    .exec(
      http("Get A")
        .get("http://aaaa.com")
        .check(status.is(200))
    )
)

class ScenarioB extends BaseScenario(
  scenario("Example Scenario A")
    .exec(
      http("Get B")
        .get("http://bbbb.com")
        .check(status.is(200))
    )
)
...