2013-03-22 4 views
11

Sto provando a modulare una serie di test delle prestazioni in Gatling.Scenari di modularizzazione da eseguire in sequenza usando Gatling

Diversi test eseguono lo stesso percorso iniziale attraverso le pagine, quindi ho pensato che potevo suddividerli in una serie di scenari, ogni scenario essendo una serie di azioni condivise definite nel proprio file e quindi una finale Definizione della simulazione che ha semplicemente eseguito gli scenari specificati uno dopo l'altro.

Quello che mi serve quindi è che la mia simulazione esegua questi scenari in sequenza; ma posso solo trovare come eseguirli contemporaneamente o con un ritardo specifico tra ciascuno. Esiste un'opzione di impostazione Simulazione per eseguire gli scenari definiti uno dopo l'altro senza specificare un ritardo arbitrario?

EDIT

Attualmente, ho la seguente serie di file:

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

L'errore che sto ricevendo è:

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 

Chiaramente mi manca qualcosa nella mia definizione, ma non capisco cosa sia

risposta

17

È possibile comporre catene, non scenari.

Ad esempio:

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) 

Chiaro?

+0

posso vedere il principio generale, ma sto lottando per implementarlo nella pratica - la mia mancanza di java/scala sta davvero cominciando a colpire a casa –

+0

A questo punto, è più un problema di Gatling DSL (docu, forse) che uno di Scala. Ecco un esempio: https://github.com/excilys/gatling-hands-on/blob/master/gatling-hands-on-demo/src/test/scala/computerdatabase/Step10.scala –

+0

Per quanto riguarda la modifica: mancano alcune importazioni (erano qui sicuramente se si utilizzava il registratore). Qui, quello mancante per la compilazione è il bootstrap, ma prima o poi ne colpisci gli altri. Si prega di dare un'occhiata al campione che ho fornito e aggiungerli tutti. –

3

Grazie a Stephane, mi ha anche dato una soluzione per creare un oggetto di più catene e passarlo allo scenario.

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

È possibile collegare in cascata gli scenari in modo che vengano eseguiti in sequenza come segue:

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

Oh Dio ti benedica, non sono sicuro del motivo per cui non ho trovato questo nei documenti. – cvakiitho

+0

Sto cercando di capire come utilizzare le importazioni per organizzare il mio progetto di gatling. La soluzione qui sembra essere persa quando il link github è rotto. Qualche altra intuizione? La mia domanda è qui: http://stackoverflow.com/questions/34540818/how-can-i-use-gatling-code-from-another-simulation – digidigo

1

Un'altra opzione può essere simile a questo:

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 Niente da fare. Lo uso tutti i giorni e funziona bene. Controlla la loro documentazione ufficiale. –

+0

@PiotrBoho Guarda qui: http://gatling.io/docs/current/advanced_tutorial/ –

+0

Ok, verrà compilato. Basta modificare la risposta per mostrare che tutto questo codice è in una classe che eredita dalla simulazione altrimenti exec() non verrà compilato. BTW la domanda riguarda la modularizzazione in modo che GetAllRunDetails e GetRunIdDetails debbano essere definiti in file separati e quindi è necessario mostrare da dove viene exec(). –