2013-03-22 55 views
11

我試圖在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 

顯然我錯過的東西我定義,但我只是不明白它是什麼

回答

17

您可以撰寫連鎖店,而不是場景。

例如:

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) 

清除?

+0

我能看到的一般原則,但我在努力在實踐中實現它 - 我缺乏java/scala真的開始打到家 – 2013-03-22 14:26:28

+0

在這一點上,這更像是一個Gatling DSL問題(可能是文件),而不是Scala。這裏有一個例子:https://github.com/excilys/gatling-hands-on/blob/master/gatling-hands-on-demo/src/test/scala/computerdatabase/Step10。scala – 2013-03-22 14:30:25

+0

關於你的編輯:你錯過了一些導入(他們在這裏肯定如果你使用錄音機)。在這裏,缺少編譯的是bootstrap,但遲早你會擊中其他人。請查看我提供的示例並添加所有示例。 – 2013-03-22 15:07:54

3

感謝Stephane,他也給了我一個解決方案來創建多個Chains對象並將其傳遞給場景。

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

,讓他們按順序執行,您可以級聯的方案如下:

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

上帝保佑你,不知道爲什麼我沒有在文檔中找到它。 – cvakiitho 2015-10-15 15:45:07

+0

我想弄清楚如何使用導入來組織我的gatling項目。這裏的解決方案似乎因爲github鏈接被破壞而丟失。有更多的見解?我的問題在這裏:http://stackoverflow.com/questions/34540818/how-can-i-use-gatling-code-from-another-simulation – digidigo 2015-12-31 04:37:27

1

另一種選擇可以是這樣的:

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))); 
+0

@PiotrBoho沒辦法。我每天都在使用它,它工作正常。檢查他們的官方文件。 – 2017-04-21 18:36:30

+0

@PiotrBoho看看這裏:http://gatling.io/docs/current/advanced_tutorial/ – 2017-04-21 18:39:18

+0

好吧,它會編譯。只需修改你的答案do顯示所有這些代碼是在一個繼承自Simulation的類中,否則exec()將不會編譯。 順便說一句,關於模塊化的問題,所以GetAllRunDetails和GetRunIdDetails應該在單獨的文件中定義,然後你需要顯示exec()來自哪裏。 – 2017-04-21 21:15:07