使用 Gatling 将场景模块化以按顺序运行

Posted

技术标签:

【中文标题】使用 Gatling 将场景模块化以按顺序运行【英文标题】:Modularising scenarios to run in sequence using Gatling 【发布时间】:2013-03-12 04:30:56 【问题描述】:

我正在尝试将 Gatling 中的一系列性能测试模块化。

几个测试通过页面执行相同的初始路径,所以我认为我可以将它们分解为一系列场景,每个场景都是在自己的文件中定义的一系列共享操作,然后是最终的模拟一个接一个地执行指定场景的定义。

然后我需要让我的模拟按顺序运行这些场景;但我只能找到如何同时运行它们,或者每个之间有指定的延迟。是否有任何模拟设置选项可以在不指定任意延迟的情况下一个接一个地运行定义的场景?

编辑

目前,我有以下一组文件:

homepageHeaders.scala

package advanced

object homepageHeaders 

    val homepage_headers_1 = Map(
        "Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""",
        "If-Modified-Since" -> """Wed, 20 Mar 2013 15:36:31 +0000""",
        "If-None-Match" -> """"1363793791""""
    )


homepageChain.scala

package advanced
import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import com.excilys.ebi.gatling.jdbc.Predef._
import akka.util.duration._
import homepageHeaders._


object homepageChain 

    val homepageChain = 
        //Homepage
        exec(http("homepage")
                    .get("/")
                    .headers(homepageHeaders.homepage_headers_1)
            )


pageHeaders.scala

package advanced

object pageHeaders 

    val page_headers_1 = Map(
            "Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"""
    )


pageChain.scala

package advanced
import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import com.excilys.ebi.gatling.jdbc.Predef._
import akka.util.duration._
import pageHeaders._


object pageChain 

    val pageChain = 
        //Page Menu
        exec(http("page request")
                    .get("/page1")
                    .headers(pageHeaders.page_headers_1)
            )


pageSimulation.scala

package advanced
import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import com.excilys.ebi.gatling.jdbc.Predef._
import homepageChain._
import pageChain._

class pageSimulation extends Simulation 

    val urlBase = "http://www.mytestsite.com"

    val httpConf = httpConfig
            .baseURL(urlBase)
            .acceptHeader("image/png,image/*;q=0.8,*/*;q=0.5")
            .acceptEncodingHeader("gzip, deflate")
            .acceptLanguageHeader("en-gb,en;q=0.5")
            .userAgentHeader("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0")

    val pageScenario = scenario("Bodycare Scenario")
        .exec(homepageChain.homepageChain)
        .exec(pageChain.pageChain)


    setUp(
            homepageScenario.users(1).protocolConfig(httpConf)
        )

我得到的错误是:

14:40:50.800 [ERROR] c.e.e.g.a.ZincCompiler$ - /Gatling/user-files/simulations/advanced/pageChain.scala:13: not found: value exec
14:40:50.807 [ERROR] c.e.e.g.a.ZincCompiler$ -          exec(http("page request")
14:40:50.808 [ERROR] c.e.e.g.a.ZincCompiler$ -          ^
14:40:53.988 [ERROR] c.e.e.g.a.ZincCompiler$ - /Gatling/user-files/simulations/advanced/homepageChain.scala:13: not found: value exec
14:40:53.989 [ERROR] c.e.e.g.a.ZincCompiler$ -          exec(http("homepage")
14:40:53.989 [ERROR] c.e.e.g.a.ZincCompiler$ -          ^
14:41:17.274 [ERROR] c.e.e.g.a.ZincCompiler$ - two errors found
Exception in thread "main" Compilation failed

显然我在我的定义中遗漏了一些东西,但我就是不明白它是什么

【问题讨论】:

【参考方案1】:

由于Gatling 3.4现在可以使用andThen顺序执行同一模拟中的场景。

setUp(
  parent.inject(injectionProfile)
    // child1 and child2 will start at the same time when last parent user will terminate
    .andThen(
      child1.inject(injectionProfile)
        // grandChild will start when last child1 user will terminate
        .andThen(grandChild.inject(injectionProfile)),
      child2.inject(injectionProfile)
    )
)

见official documentation。

【讨论】:

【参考方案2】:

感谢 Stephane,他还给了我一个解决方案来创建多个链的对象并将其传递给场景。

val login = exec(...)...
val foo = exec(...)...
val bar = exec(...)...
val scn_inpute = Seq(login, foo, bar)
val scn1 = scenario("Scenario1").exec(scn_inpute)

【讨论】:

【参考方案3】:

另一个选项可以是这样的:

object GetAllRunDetails 
    val getAllRunDetails = exec( ....)



object GetRunIdDetails
   val getRunIdDetails =  exec( .... )


val scn1 = scenario("Scenario 1")
    .exec(GetAllRunDetails.getAllRunDetails)

val scn2 = scenario("Scenario 2")
    .exec(GetRunIdDetails.getRunIdDetails)


setUp(scn1.inject(atOnceUsers(1)),
      scn2.inject(atOnceUsers(1)));

【讨论】:

@PiotrBoho 没办法。我每天都使用它,它工作正常。查看他们的官方文档。 @PiotrBoho 看这里:gatling.io/docs/current/advanced_tutorial 好的,它会编译。只需修改您的回答,显示所有这些代码都在一个继承自 Simulation 的类中,否则 exec() 将无法编译。顺便说一句,问题是关于模块化,因此 GetAllRunDetails 和 GetRunIdDetails 应该在单独的文件中定义,然后您需要显示 exec() 的来源。 BTW ...它将同时运行这两种情况。即同时【参考方案4】:

您可以级联场景,以便它们按如下顺序执行:

val allScenarios = scenario1.exec(scenario2).exec(scenario3)

【讨论】:

我想弄清楚如何使用导入来组织我的加特林项目。由于github链接已损坏,此处的解决方案似乎丢失了。还有更多见解吗?我的问题在这里:***.com/questions/34540818/…【参考方案5】:

你可以组合链,而不是场景。

例如:

val login = exec(...)...
val foo = exec(...)...
val bar = exec(...)...
val scn1 = scenario("Scenario1").exec(login).exec(foo)
val scn2 = scenario("Scenario2").exec(login).exec(bar)

清除?

【讨论】:

我可以看到一般原则,但在实践中很难实现它——我对 java/scala 的缺乏真的开始打击到家 在这一点上,这更像是一个 Gatling DSL 问题(也许是文档)而不是 Scala 问题。这是一个示例:github.com/excilys/gatling-hands-on/blob/master/… 关于您的编辑:您缺少一些导入(如果您使用了 Recorder,它们肯定会在这里)。在这里,编译时缺少的一个是引导程序,但您迟早会遇到其他的。请查看我提供的示例并添加所有示例。 谢谢,包含成功了——现在我已经有了一些“基础设施”工作,我可以开始认真玩了

以上是关于使用 Gatling 将场景模块化以按顺序运行的主要内容,如果未能解决你的问题,请参考以下文章

Gatling 场景响应时间

如何将 axlsx 文件分组以按 org 字母顺序排序

Gatling入门简单使用

Gatling入门简单使用

发送数组以按顺序排列

如何将一系列声音 HTML5 <audio> 声音剪辑排队以按顺序播放?