2013-03-22 17 views
11

Ich versuche, eine Reihe von Leistungstests in Gatling zu modularisieren.Modularisierung von Szenarien mit Gatling

Einige der Tests führen den gleichen anfänglichen Pfad durch die Seiten aus, also dachte ich, ich könnte sie in eine Reihe von Szenarien aufteilen, wobei jedes Szenario eine Reihe von gemeinsamen Aktionen in einer eigenen Datei und dann ein Finale definiert Simulationsdefinition, die einfach die angegebenen Szenarien nacheinander ausführt.

Was ich dann brauche, ist, dass meine Simulation diese Szenarien nacheinander ausführt; aber ich kann nur herausfinden, wie ich sie entweder gleichzeitig oder mit einer bestimmten Verzögerung zwischen ihnen ausführen kann. Gibt es eine Simulations-Setup-Option, um die definierten Szenarien nacheinander auszuführen, ohne eine willkürliche Verzögerung festzulegen?

EDIT

Derzeit habe ich folgende von Dateien festgelegt:

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

012.351.
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) 
     ) 
} 

Der Fehler, ich bin immer ist:

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 

Klar fehlt mir etwas in meinem Definition, aber ich verstehe einfach nicht, was es ist

Antwort

17

Sie können Ketten erstellen, keine Szenarien.

Zum Beispiel:

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) 

klar?

+0

ich das allgemeine Prinzip sehen kann, aber ich kämpfen um es in der Praxis zu implementieren - mein Mangel an Java/Scala fängt wirklich an, nach Hause zu kommen –

+0

An diesem Punkt ist das eher ein Gatling DSL Problem (Doku, vielleicht) als ein Scala. Hier ein Beispiel: https://github.com/excilys/gatling-hands-on/blob/master/gatling-hands-on-demo/src/test/scala/computerdatabase/Step10.scala –

+0

In Bezug auf Ihre Bearbeitung: Sie vermissen einige Importe (sie waren hier sicher, wenn Sie den Recorder verwendet haben). Hier fehlt der Bootstrap, aber die anderen werden früher oder später getroffen. Bitte werfen Sie einen Blick auf die von mir zur Verfügung gestellte Probe und fügen Sie alle hinzu. –

3

Dank Stephane hat er mir auch eine Lösung gegeben, um ein Objekt aus mehreren Ketten zu erstellen und es an das Szenario zu übergeben.

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

Sie können Szenarien kaskadieren, so dass sie in der Reihenfolge wie folgt ausführen:

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

Oh Gott segne dich, ich bin mir nicht sicher, warum ich das nicht in Docs gefunden habe. – cvakiitho

+0

Ich versuche herauszufinden, wie ich mit Imports mein gatling-Projekt organisieren kann. Die Lösung hier scheint verloren zu sein, da die GitHub-Verbindung unterbrochen ist. Noch mehr Einsicht? Meine Frage ist hier: http://stackoverflow.com/questions/34540818/how-can-i-use-gatling-code-from-another-simulation – digidigo

1

Eine weitere Option kann wie folgt sein:

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 Keine Möglichkeit. Ich benutze es jeden Tag und es funktioniert gut. Überprüfen Sie ihre offizielle Dokumentation. –

+0

@PiotrBoho Schau hier: http://gatling.io/docs/current/advanced_tutorial/ –

+0

Ok, es wird kompiliert. Ändern Sie einfach die Antwort, zeigen Sie, dass der gesamte Code in einer Klasse ist, die von der Simulation erbt, andernfalls wird exec() nicht kompiliert. BTW die Frage ist über Modularisierung so GetAllRunDetails und GetRunIdDetails sollten in separaten Dateien definiert werden und dann müssen Sie zeigen, woher exec() kommt. –