以恒定速率随机运行多个加特林场景

问题描述 投票:0回答:1

我定义了以下5种场景:

ScenarioBuilder s1 = scenario("S1").exec(getAuthenticationChain()).exec(createProduct(150, "S1"))
ScenarioBuilder s2 = scenario("S2").exec(getAuthenticationChain()).exec(createProduct(10, "S2"))
ScenarioBuilder s3 = scenario("S3").exec(getAuthenticationChain()).exec(createProduct(30, "S3"))
ScenarioBuilder s4 = scenario("S4").exec(getAuthenticationChain()).exec(createProduct(60, "S4"))
ScenarioBuilder s5 = scenario("S5").exec(getAuthenticationChain()).exec(createProduct(80, "S5"))

现在的要求之一是:

Of all the users or requests , 
s1 should be executed 50% of total request , 
s2 10% of total request , 
s3 20% of total request , 
s4-> 15% , 
s5-> 5% .

假设我运行了 900 秒的模拟,每个场景执行的用户/请求的数量是:

s1: 900*50/100 = 450
s2: 900*10/100 = 90
s3: 900*20/100 = 180
s4: 900*15/100 = 135
s5: 900*5/100 = 45

我已经这样写了加特林模拟:

{
    setUp(
     s1.injectOpen(constantUsersPerSec(0.50).during(900)).protocols(getSignInHeaders()),
     s2.injectOpen(constantUsersPerSec(0.10).during(900)).protocols(getSignInHeaders()),
     s3.injectOpen(constantUsersPerSec(0.20).during(900)).protocols(getSignInHeaders()),
     s4.injectOpen(constantUsersPerSec(0.15).during(900)).protocols(getSignInHeaders()),
     s5.injectOpen(constantUsersPerSec(0.05).during(900)).protocols(getSignInHeaders())
    )
}

我能够运行测试,但问题是所有这些场景都是并行运行的,我想以随机顺序执行每个场景的每个请求,并以每秒 1 个用户/请求的恒定速率执行。

lets say s1: will execute 450 requests, s1r1.......s1r450
s2: s2r1.........s2r90
s3: s3r1.........s3r180
s4: s4r1.........s4r135
s5: s5r1......s5r45

:我如何编写一个场景来以随机顺序执行所有这些请求,并以每秒 1 个用户/请求的恒定速率执行。?

尝试失败:

我尝试按顺序执行它们:

{
    setUp(
     s1.injectOpen(constantUsersPerSec(0.50).during(900)).andThen(
            s2.injectOpen(constantUsersPerSec(0.10).during(900)).andThen(
                s3.injectOpen(constantUsersPerSec(0.20).during(900)).andThen(
                    s4.injectOpen(constantUsersPerSec(0.15).during(900)).andThen(
                        s5.injectOpen(constantUsersPerSec(0.05).during(900))
                    )

                )

            )
     ).protocols(getSignInHeaders());
}

这首先执行 s1 的所有请求,然后执行 s2 的所有请求,然后执行 s3 的所有请求,依此类推。

但我希望所有场景的所有请求都以恒定速率和随机顺序执行。 请帮我。谢谢。

注意:我使用 Gattle Maven 插件版本 4.5.0 和 Gattle DSL 来编写代码。

<plugin>
  <groupId>io.gatling</groupId>
  <artifactId>gatling-maven-plugin</artifactId>
  <version>4.5.0</version>
</plugin>
java performance-testing gatling
1个回答
1
投票

针对这种情况使用多个场景是错误的策略。因为,一般来说,你都会遇到同样的情况。换句话说,您的行动链(请求)不会改变。
对于您的情况,加特林有方法

randomSwitch
文档
使用此方法,您可以指定特定请求的百分比。

scenario("Scenario")
  .exec(getAuthenticationChain())
  .randomSwitch( // beware: use parentheses, not curly braces!
     50.0 -> exec(createProduct(150, "S1")),
     10.0 -> exec(createProduct(10, "S2")),
     ... and so on ...
)
© www.soinside.com 2019 - 2024. All rights reserved.