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

时间:2013-03-22 10:39:14

标签: scala performance-testing gatling

我正在尝试将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

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

5 个答案:

答案 0 :(得分:20)

你可以组成连锁,而不是情景。

例如:

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)

清除?

答案 1 :(得分:10)

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

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

答案 2 :(得分:3)

感谢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 :(得分:2)

另一种选择可以是这样的:

(loop 0 identity)                        ; k0
(loop 1 (λ (x) (k0 (cons (f 0) x)))      ; k1
(loop 2 (λ (x) (k1 (cons (f 1) x)))      ; k2
(loop 3 (λ (x) (k2 (cons (f 2) x)))      ; k3
(loop 4 (λ (x) (k3 (cons (f 3) x)))      ; k4
(loop 5 (λ (x) (k4 (cons (f 4) x)))      ; k5
(k5 empty)
(k4 (cons 16 empty))
(k3 (cons 9 '(16)))
(k2 (cons 4 '(9 16)))
(k1 (cons 1 '(4 9 16)))
(k0 (cons 0 '(1 4 9 16)))
(identity '(0 1 4 9 16))
'(0 1 4 9 16)

答案 4 :(得分:0)

由于加特林3.4 ,现在可以使用pipeline = [ { '$match': { '$expr': { '$ne': [ 'int', { '$type': { '$convert': { 'input': '$page', 'to': 'int', 'onError': None, 'onNull': None } } } ] } } } ] db.collection.aggregate(pipeline) 按顺序执行同一模拟中的方案。

andThen

请参见playground