èšäºã¯ã»ã«ã²ã€ ãã¹ã¬ ãã»ã«ã²ã€ ãã¹ã¬ã³ãã³ã ã«ä»£ãã£ãŠå
¬éãããŠã ãŸã
UPDã ãã¬ããªã³ã°ã®æ¡åŒµæ©èœã®å®è£
ãã»ã¯ã·ã§ã³ãè¿œå

gatling.ioãã¬ãŒã ã¯ãŒã¯ã®è² è·ãã¹ãã«é¢ããäžé£ã®èšäºãç¶ããŸãã ãã®èšäºã§ã¯ãGatling DSLã䜿çšããããã®åºæ¬çãªãã¯ããã¯ã«ã€ããŠèª¬æããŸããGatlingDSLã¯ãã»ãšãã©ã®å Žåãè² è·ãã¹ãã¹ã¯ãªããã®éçºã§äœ¿çšãããŸãã ã ãããç«ã®äžã§ãé¡ãããŸãã
ã¬ããªã³ã°æ§é
åã®èšäºã§ã SBTã®ã€ã³ã¹ããŒã«ãšGatlingãã¬ãŒã ã¯ãŒã¯çšã®ç°å¢ã®ã»ããã¢ããã«ã€ããŠæžããŸããã ãã¹ãŠã®ã¹ããããå®äºãããšããããžã§ã¯ãïŒ1ïŒãäœæãããŸãããã®æ§é ã¯ä»¥äžã®ç»åã«ç€ºãããŠããŸãã

plugins.sbtïŒ2ïŒãã¡ã€ã«ã§ããã¡ã€ã«ãäœæãããŠããªãå Žåã¯ãsbtã®ã¬ããªã³ã°ãã©ã°ã€ã³ãæ¥ç¶ããå¿
èŠããããŸãããã®åŸãæåã§äœæããŸãã ãã©ã°ã€ã³ã®ææ°ããŒãžã§ã³ãæå®ããå¿
èŠãããããšã«æ³šæããŠãã ãããå·çæç¹ã§ã¯2.2.2ã§ãã ãã¡ã€ã«ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
次ã«ãsrc / testãã£ã¬ã¯ããªã§ãresourcesïŒ3ïŒãã£ã¬ã¯ããªãäœæããå¿
èŠããããŸãã èšå®ãã¡ã€ã«ãšãã¹ãããŒã¿ãå«ãŸããŠããŸãã gatling.confãã¡ã€ã«ã«ã¯åºæ¬çãªèšå®ãå«ãŸããŠãããlogback.xmlã¯ãã®ã³ã°ã¬ãã«ãšãã°åºåã€ã³ã¿ãŒãã§ãŒã¹ãæ
åœããŸãã ãããã®ãã¡ã€ã«ã¯ã httpsïŒ//gatling.io/download/ãã³ãã«ããååŸã§ããŸãã
scalaãã£ã¬ã¯ããªã«ã¯ãã¹ãããã±ãŒãžãå«ãŸããŠããŸãã ããã±ãŒãžåã¯å¥œããªããã«åŒã³åºãããšãã§ããŸãããååãšããŠäŒæ¥ã¯ãã®éã®ååru.tcsbank.loadã䜿çšããŸãã
BasicSimulationãã¡ã€ã«ã¯ã¡ã€ã³ãã¹ããã¡ã€ã«ã§ãããã¹ã¯ãªãããå®è¡ããããã®ãšã³ããªãã€ã³ãã§ãã
ã¿ãŒã²ãã\ gatlingïŒ6ïŒãã£ã¬ã¯ããªã§ã¯ãèµ·åãã°ïŒã³ã³ãœãŒã«ã«è¡šç€ºããããã°ïŒã«ã¬ããŒããçæãããŸãã ãã£ãšé »ç¹ã«èŠãå¿
èŠããããŸã-éåžžã«æ¥éã«æé·ããŸã
ã¡ã€ã³ãããžã§ã¯ããã¡ã€ã«ã¯build.sbtïŒ7ïŒã§ãã æ¥ç¶ãããã¹ãŠã®ã©ã€ãã©ãªãžã®äŸåé¢ä¿ãå«ãŸããŸãã Gatlingãã¬ãŒã ã¯ãŒã¯ãžã®ãªã³ã¯ã瀺ãããŠããã®ã¯ãã®äžã«ããããã®ã³ãŒãã¯ä»¥äžã«ãããŸãã
æåŸã®éèŠãªãã¡ã€ã«ã¯gatling.logã§ãã éä¿¡ãããèŠæ±ãšå¿çã確èªã§ããã®ã¯ãã®äžã«ãããŸãã ãã¹ãŠã®ãªã¯ãšã¹ãã衚瀺ããã«ã¯ãlogback.xmlãã¡ã€ã«ã®ãALL HTTPãè¡ã®ã³ã¡ã³ããå€ãããšãå¿ããªãã§ãã ããã
ã¬ããªã³ã°ã®äž»ãªã¢ã€ãã¢
äžèŠãããšãã¹ã¯ãªãããšDSLã¬ããªã³ã°ã¯è€éã«èŠãããããããŸããããã¹ã¯ãªãããäœæãããšããèããç解ããã°ããã¹ãŠãéåžžã«ç°¡åã«ãªããŸãã
Gatlingã¯ãä»®æ³ãŠãŒã¶ãŒãscenario()
ã¹ã¯ãªãããšããŠæ瀺ããŸãã ãã®ã·ããªãªã§ã¯ããŠãŒã¶ãŒã®æ°ã¯ã inject
ã¡ãœãããè² è·ã¢ãã«ãããã³httpãããã³ã«èšå®ãšããŸããŸãªãšãã¥ã¬ãŒã·ã§ã³æ¡ä»¶ã«ãã£ãŠç€ºãããŸãã ãããã¯ãã¹ãŠsetUp()
æ§é ã§æå®ãããŸãã ããšãã°ããªã³ã©ã€ã³ã¹ãã¢ãèªã¿èŸŒãå Žåã賌å
¥è
ãšç®¡çè
ã«ã¯ããã€ãã®ã·ããªãªããããŸãã
- 賌å
¥è
ã賌å
¥ãã
- ãã€ã€ãŒã¯ãã¹ã±ããã«å
¥ããã ãã§ã
- ãã€ã€ãŒã¯ååãèŠãã ãã§ã
ãã®åé¢ã«ãããç¹å®ã®ã·ããªãªã®ä»®æ³ãŠãŒã¶ãŒã®æ°ãå¢ããããšã§ãè² è·ãç°¡åã«èª¿æŽã§ããŸãã
ã¹ã¯ãªããã¯å®è¡ã®ãã§ãŒã³ã§ããããã®ãã§ãŒã³å
ã§ãªã¯ãšã¹ããexec()
é¢æ°å
ã«é
眮ãããŸãã
- +-(1) +-(2) +-(3) +-(<>){ (4) } { (5) }
å®è¡ãã§ãŒã³ã¯scenario(<Name>)
åŒã§å§ãŸãã exec()
é¢æ°ãåŒã³åºãããšã§çµã¿ç«ãŠãããŸãã
#1 val scn2 = scenario("ChainScenario") .exec(http().get()) .exec(http().get()) .exec(http().get()) .doIfOrElse(true) { exec(http().get()) } { exec(http().get()) }
ä»®æ³ãŠãŒã¶ãŒJMeterãšGatlingã®ãšãã¥ã¬ãŒã·ã§ã³ãæ¯èŒãããšãããã€ãã®æ©èœã匷調ã§ããŸãã JMeterã§ã¯ããŠãŒã¶ãŒã¯ThreadGroupã³ã€ã«ã«é
眮ãããããã§çªå·ãèšå®ãããã«ãŒãå
ã§ä»®æ³ãŠãŒã¶ãŒã®ã¹ã¯ãªãããç¹°ãè¿ãåçããã®ã¯åœŒå¥³ïŒã³ã€ã«ïŒã§ãã ããªãã¡ 2人ã®ä»®æ³ãŠãŒã¶ãŒããã¬ã€ãºããããšããã¹ãæéããªããªããŸã§åãã¹ã¯ãªãããå®è¡ãããŸãã
ã¬ããªã³ã°ã§ã¯ãä»®æ³ãŠãŒã¶ãŒã®ç®¡çæ¹æ³ãå°ãç°ãªããŸãã 2人ã®ä»®æ³ãŠãŒã¶ãŒãéžæãããšãã¹ã¯ãªãããå®è¡ãããäœæ¥ãå®äºããŸãã ãŠãŒã¶ãŒãã¹ã¯ãªãããã«ãŒãã§å®è¡ããã«ã¯ããã§ãŒã³ãã«ãŒããããã¯ã«é
眮ããå¿
èŠããããŸãã https://gatling.io/docs/current/quickstart/#gatling-scenario-explainedã§å
¥æã§ããç°¡åãªãã¹ãã¹ã¯ãªãããæ€èšããŠãã ãã ãããã¯åºç€ãšããŠäœ¿çšã§ããŸãã
ã¹ã¯ãªããã¯äžèŠè€éã«èŠãããããããŸããããèŠãŠã¿ããšDSL Gatlingã¯éåžžã«ã·ã³ãã«ã§ãããã¹ãã¬ã¹ãã¹ããèšè¿°ããããã«Scalaã®æ·±ãç¥èã¯å¿
èŠãããŸããã
ã¹ã¯ãªããã¹ã¯ãªããã¯ã scenario()
é¢æ°ãå®æ°ã«å²ãåœãŠãããšããå§ãŸããŸãã ã¹ã¯ãªããåã¯äžæã§ãªããã°ãªããŸããïŒ æ¬¡ã«ã exec()
é¢æ°ãåŒã³åºããããã¹ãã¹ã¯ãªãããå®è£
ããä»ã®é¢æ°ãhttpããã³websocketãåãåããŸãã ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããããªã¯ãšã¹ãããšãã¥ã¬ãŒãããŸãã
ã¹ã¯ãªãããäœæããããšã setUp()
é¢æ°ã§ãã¹ã¯ãªãããå®è¡ãããŠãŒã¶ãŒã®æ°ãšããããã®ãŠãŒã¶ãŒãããŒãããæ¹æ³ã瀺ããŸãã 次ã«ãããããã¹ãŠã®äœæ¥æ¹æ³ã詳现ã«åæããŸãã
HTTP
ããã©ã«ãã§ã¯ããã¬ãŒã ã¯ãŒã¯ã¯æ¬¡ã®ã¡ãœããGETãPOSTãPUTãPATCHãDELETEãOPTIONSããµããŒãããŠããŸãã äŸãšããŠGETããã³POSTãªã¯ãšã¹ããæžãããšãæ€èšããŠãã ããã ãŸããã¹ã¯ãªããé¢æ°ãå®æ°scn
ã«scn
ã exec()
ç°¡åãªGETãªã¯ãšã¹ããèšè¿°ããŸãã
val scn = scenario("GetScenario") .exec( http("GETRequest") .get("http://bar.com/foo.php") )
ããããŒãã€ã³ã¹ããŒã«ããå¿
èŠãããå Žåã¯ã次ãè¿œå ããŸãã
val scn = scenario("GetScenario") .exec( http("GETRequest") .get("http://bar.com/foo.php") .headers( Map( "foo1" -> "bar1", "foo2" -> "bar2" ) ) )
ãªã¯ãšã¹ãã«ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã
val scn = scenario("GetScenario") .exec( http("GETRequest") .get("http://bar.com/foo.php") .headers( Map( "foo1" -> "bar1", "foo2" -> "bar2" ) ) .queryParamMap( Map( "param1" -> "value1", "param2" -> "value2" ) )
ãã©ã¡ãŒã¿ã¯.get("http://bar.com/foo.php?param=value")
é¢æ°.get("http://bar.com/foo.php?param=value")
ä»ããŠçŽæ¥æž¡ãããšãã§ããŸãã éçãªãœãŒã¹ã®èªã¿èŸŒã¿ãããå Žåã䞊åèªã¿èŸŒã¿ã«resources()
ã䜿çšããŸãã
val scn = scenario("GetScenario") .exec( http("GETRequest") .get("http://bar.com/foo.php") .headers( Map( "foo1" -> "bar1", "foo2" -> "bar2" ) ) .queryParamMap( Map( "param1" -> "value1", "param2" -> "value2" ) ) .resources( http("css").get("/main.css"), http("js").get("http://bar.com/main.js") )
POSTã¡ãœããã§ã¯ããã©ã¡ãŒã¿ãŒãæž¡ããšãã«formParam()
é¢æ°ã䜿çšãããŸãã
val scn = scenario("PostScenario") .exec( http("GETRequest") .post("http://bar.com/foo.php") .headers( Map( "foo1" -> "bar1", "foo2" -> "bar2" ) ) .formParamMap( "param1" -> "value", "param2" -> "value2" )
ãªã¯ãšã¹ãæ¬æãä»ããŠããŒã¿ãçŽæ¥è»¢éããã«ã¯ã body()
䜿çšããå¿
èŠããããŸãã
val scn = scenario("PostScenario") .exec( http("GETRequest") .post("http://bar.com/foo.php") .headers( Map( "foo1" -> "bar1", "foo2" -> "bar2" ) ) .body( StringBody( """ |{ | "login": "password" |}""".stripMargin ) )
ãã§ãã¯
èŠæ±ããšãã¥ã¬ãŒããããšãã¯ãå¿çã³ãŒããŸãã¯å¿çæ¬æå
ã®ããã¹ãã®ååšã確èªããå¿
èŠããããŸãã å€ãã®å Žåãå¿çããããŒã¿ãæœåºããå¿
èŠããããŸãã ããã¯ãã¹ãŠã check()
é¢æ°ã䜿çšããŠå®è¡ã§ããŸãã ãã§ãã¯ã¯ãhttpã¡ãœããã®æ©èœã®åŸã«è¡ãå¿
èŠããããŸãã
val scn = scenario("CheckScenario") .exec( http("ForChecks") .get("/check.php") .check(status.is(200)) .check(status.in(200, 500)) .check(substring("foo_bar")) .check(regex(""" \d{4} â \d{4}""")) .check(regex("""key=(\d{4}-\w{4})""").saveAs("AuthKey")) .check( checkIf( (r: Response, s: Session) => r.body.string.contains("id=") )( regex("""id=(\d+)""").saveAs("id_some_value") ) ) )
ã»ãã·ã§ã³
ã»ãã·ã§ã³ã«ã¯ããã¹ãŠã®ä»®æ³ãŠãŒã¶ãŒããŒã¿ãšå€æ°ãæ ŒçŽãããŸãã ã¹ã¯ãªããã§äœããè£åãå Žåã¯ãã»ãã·ã§ã³ãéããŠãããè¡ãå¿
èŠããããŸãã
val scn = scenario("SessionScenario") .exec( session => session.set("password_param","anyPassword") ) .exec( http("param") .get("/anything.php") .queryParam("login","${password_param}") )
Scalaã¯CallByValueã䜿çšãããããåçãªå€ãçŽæ¥DSLé¢æ°ã«è»¢éããããšã¯ã§ããŸããããããã¯ã³ã³ãã€ã«æã«ååŸãããåžžã«æ°ããå€ãªãã§äœ¿çšãããŸãã
exec( http("timestamp") .get("/") .queryParam("timestamp", System.currentTimeMillis() ) .queryParam("timestamp", session => { session("var").as[String] } ) .queryParam("timestamp", x => { System.currentTimeMillis() } ) )
è«çæ§é
ä»ã®ãã¹ãããŒã«ãšåæ§ã«ãæ¡ä»¶ã«å¿ããŠãªã¯ãšã¹ããåŠçããããã«è«çæ§é ããã䜿çšãããŸãã
val scn = scenario("doIfSimulation") .exec( session => session.set("foo","bar") ) .doIf(session => session("cond").as[String].startsWith("bar")){
è©ŠéšããŒã¿
é«å質ã®ããŒããå®è¡ãããã£ãã·ã¥ã§ã¯ãªãã·ã¹ãã ããã¹ãããã«ã¯ããã¹ãäžã«åçã«å€åãããªã¯ãšã¹ãã§ããŒã¿ãéä¿¡ããå¿
èŠããããŸãã ãã®ãããªããŒã¿ãä¿åããã³ååŸããããã®æãç°¡åãªæ¹æ³ã¯ããã¡ã€ã«ããèªã¿åãããšã§ãã ãã¡ã€ã«ã«ã¯ãæåã§åºåãããããŒã¿ãå«ãŸããŠããå¿
èŠããããŸãã ã¬ããªã³ã°ã«ã¯ããã®ãããªããŒã¿ãèªã¿åãããã®æ©èœããããŸãã
csvïŒ "foo.csv"ïŒ//ã³ã³ãåºåãããŒã¿
tsvïŒ "foo.tsv"ïŒ//ã¿ãåºåãããŒã¿
ssvïŒ "foo.ssv"ïŒ//ã»ãã³ãã³ã§åºåãããããŒã¿
SeparatedValuesïŒ "foo.txt"ã 'ïŒ'ïŒ//å¥ã®æåã§åºåãããããŒã¿
äŸãšããŠå°ããªcsvãã¡ã€ã«ã䜿çšããŠããã¹ãããŒã¿ãæäœããæ¹æ³ã瀺ããŸãã
//csv model, Macbook, MacBook Pro, ASUS Eee PC, Acer, Asus, Sony Vaio, Chromebook
ãã¡ã€ã«ãèªã¿åããšããGatlingã¯æåã®è¡ããã©ã¡ãŒã¿ãŒåãšããŠäœ¿çšãããã®åŸãå€ãèªã¿åããšãã«ãããã®ååã§ä¿åããŸãã ãããã£ãŠãcsvãã¡ã€ã«ã«èšè¿°ãããŠããã©ãããããã®ååãæã€å€ã¯ããã©ã¡ãŒã¿ãŒ${model}
眮ãæããããŸãã
csvãã¡ã€ã«ãèªã¿åãã«ã¯ã csv()
é¢æ°ãåŒã³åºãå¿
èŠããããŸãã
val feeder = csv("data.csv").circular val scn = scenario("doIfSimulation").feed(feeder)
ããã§ããã£ãŒããŒå€æ°ãäœæãã src\test\resources\data.csv
ã«ãããã¡ã€ã«ã®ååãæå®ãsrc\test\resources\data.csv
ã ã¹ã¯ãªããã§ã¯ã feed()
é¢æ°ãåŒã³åºããŠã feeder
å®æ°ãæå®ããŸãã feed()
é¢æ°ãåŒã³åºããããã³ã«ãæ°ããå€ãèªã¿åãããŸãã
ãªãã·ã§ã³1ã§ã¯ã feed()
é¢æ°ãrepeat()
åã«åŒã³åºãããããã5åã®å埩ã§æåã«èªã¿åãããå€ãå€æ°${model}
ã§äœ¿çšãããŸãã
ãªãã·ã§ã³ïŒ2ã䜿çšãããšãåãªã¯ãšã¹ãã®åã«å€ãèªã¿åãããŸãã
ã¢ãã«ãèªã¿èŸŒã
ã¬ããªã³ã°ã¯ããŸããŸãªè² è·ã¢ãã«ããµããŒãããŠããŸãã ãããã®ã¢ãã«ã¯ããŠãŒã¶ãŒã®ãäžæããšçæããã匷床ã«è²¬ä»»ããããŸãã
nothingForïŒdurationïŒ -ããŒãéå§åã®äžæåæ¢æéã®é·ãã瀺ããŸã
atOnceUsersïŒnbUsersïŒ-nbUsersã®éã®ä»®æ³ãŠãŒã¶ãŒã¯ïŒå¯çšæ§ã«ããïŒããã«ãäžæãããŸãã
rampUsersïŒnbUsersïŒoverïŒdurationïŒ - duration
æéäžãnbUsersã®éã®ä»®æ³ãŠãŒã¶ãŒãåãæéééã§ãäžæãããŸãã
constantUsersPerSecïŒrateïŒduringïŒdurationïŒ -ãäžãããä»®æ³ãŠãŒã¶ãŒã®é »åºŠïŒ1ç§ãããã®ä»®æ³ãŠãŒã¶ãŒïŒãšæéééduration
ãŸãã æéduration
ä»®æ³ãŠãŒã¶ãŒduration
æ°ã¯æ¯ç§å¢å ããŸãã
ïŒæéïŒã©ã³ãã åäžã®constantUsersPerSecïŒçïŒ -äžäœã®èšèšãšåæ§ã«ãä»®æ³ãŠãŒã¶ãŒã®ãçºçãéã®æéééã®ã¿ãã©ã³ãã ã«ãªããŸãã
rampUsersPerSecïŒrate1ïŒtoïŒrate2ïŒduringïŒdurationïŒ - duration
æéäžãä»®æ³ãŠãŒã¶ãŒã¯é »åºŠrate1
ããé »åºŠrate2
å¢å ããŸãã
rampUsersPerSecïŒrate1ïŒtoïŒrate2ïŒduringïŒdurationïŒduring randomized-äžéšã®ãã¶ã€ã³ãšåæ§ã«ãä»®æ³ãŠãŒã¶ãŒã®ãã¢ãããéã®æéééã®ã¿ãã©ã³ãã ã«ãªããŸãã
splitUsersïŒnbUsersïŒãïŒinjectionStepïŒseparatedByïŒdurationïŒã« -åæéééduration
åŸãä»®æ³ãŠãŒã¶ãŒã¯ããã®æ°ãnbUsers
éãããŸã§ã injectionStep
ã¢ãã«ã«åŸã£ãŠè¿œå ãããŸãã injectionStep
äžèšã®ã¢ãã«ãæå®ã§ããŸãã
splitUsersïŒnbUsersïŒintoïŒinjectionStep1ïŒseparatorByïŒinjectionStep2ïŒ -ããããã¶ã€ã³ãšåæ§ã«ã injectionStep2
ã¢ãã«ãå¯äžã®ã»ãã¬ãŒã¿ãŒã§ãã
heavisideUsersïŒnbUsersïŒoverïŒdurationïŒ -nbUsersã®éã®ä»®æ³ãŠãŒã¶ãŒã¯ã duration
äžã«ã¹ããããç»ããŸãã
ããŒãéå§
ãªãã·ã§ã³1
ããŒããéå§ããæãç°¡åãªæ¹æ³ã¯ããã³ãã«ã䜿çšããããšã§ãã ã¹ã¯ãªãããã¡ã€ã«ãgatling-charts-highcharts-bundle-2.3.0\user-files\simulations\
gatling-charts-highcharts-bundle-2.3.0\bin\gatling.bat
gatling-charts-highcharts-bundle-2.3.0\user-files\simulations\
ããã gatling-charts-highcharts-bundle-2.3.0\bin\gatling.bat
ãŸãã ã³ã³ãœãŒã«ã¯ãå®è¡ããã¹ã¯ãªããã®éžæãæäŸããŸãã

ã¹ã¯ãªããã¯ãªãã·ã§ã³6ã®äžã«ãããŸããéžæåŸãã³ã³ãœãŒã«ã«æ
å ±ã衚瀺ãããŠè² è·ãçæãããŸãã
ãªãã·ã§ã³2
ãã®ãªãã·ã§ã³ã§ã¯ãIntelliJ IDEA Community IDEããçŽæ¥ããŒããéå§ããŸãã
ã©ã€ãã©ãªãèšå®ããããã®ãã¹ãŠã®æé ãå®äºããããALT + F12ãæŒããŠã¿ãŒããã«ãéããŸãã ã¿ãŒããã«ã§ã sbt
ã³ãã³ããå
¥åããŸãã

ãã¹ãŠã®ã³ã³ããŒãã³ããããŒãããåŸã gatling:testOnly
ã䜿çšããŠã¹ã¯ãªãããå®è¡ããŸãã

ã³ã³ãœãŒã«ã«çŸåšã®è² è·ç¶æ
ã衚瀺ãããŸãã
IDEAã©ã³ããããããèµ·åããã«ã¯ãSBTã¿ã¹ã¯ã«èµ·åã³ãã³ããè¿œå ããå¿
èŠããããŸãã

ã¬ããªã³ã°æ¡åŒµæ©èœã®å®è£
Gatlingã®ããã¥ã¡ã³ãã«ã¯ãããã«äœ¿çšã§ãããããã³ã«ã¯HTTP / 1.1ããã³WebSocketã®ã¿ã«å¯Ÿå¿ããŠãããšæžãããŠããŸãã Gatlingã®å
¬åŒããã³éå
¬åŒã®æ¡åŒµæ©èœãããããªã³ã¯ïŒ https://gatling.io/docs/2.3/extensions/ ïŒã§å
¥æã§ããŸãã
å€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ãããã³ã«ãHTTPãŸãã¯WebSocksãšç°ãªãã·ã¹ãã ãè² è·äžã§ãã¹ãããå¿
èŠãããå Žåã«ã¿ã¹ã¯ããããŸãã ãã®å ŽåãGatlingã®æ¡åŒµæ©èœãäœæããå¿
èŠãªæ©èœãå®è£
ã§ããŸãã
ãããã£ãŠããã®æ©äŒãå®çŸããå¿
èŠããããŸãã
val scn = scenario("BasicSimulation") .exec( new ExampleActionBuilder("MyAction") )
exec()
é¢æ°ã¯ActionBuilder
ã®ã¿ã€ããåãããšãã§ãããããã¯ã©ã¹ãèšè¿°ãã ActionBuilder
ã®ã¿ã€ãã§ã¯ã©ã¹ãæ¡åŒµããå¿
èŠããããŸãã
class ExampleActionBuilder(myNameAction: String) extends ActionBuilder { override def build(ctx: ScenarioContext, next: Action): Action = { new ExampleChainableAction(myNameAction, next, ctx) } }
ãªãŒããŒã©ã€ããããbuild
é¢æ°ã§ã¯ãå¿
èŠãªã³ãŒããå®è£
ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠããããŸãã ãã®ã¯ã©ã¹ã¯ChainableAction
ããæ¡åŒµããå¿
èŠããããŸãã
class ExampleChainableAction(myNameAction: String, myNextAction: Action, ctx: ScenarioContext) extends ChainableAction { override def next: Action = myNextAction override def name: String = myNameAction override def execute(mySession: Session): Unit = { } }
以äžã¯ããã®ã¢ãããŒãã®å®éã®äŸã§ãã ãã®æ¹æ³ã¯æé©ãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããããå®è£
ã¯å¯èœãªéãç°¡åã§ããããšã«æ³šæããããšãéèŠã§ãã
æ¡åŒµã³ãŒã package ru.tcsbank.load import io.gatling.commons.stats.{KO, OK} import io.gatling.core.Predef._ import io.gatling.core.action.builder.ActionBuilder import io.gatling.core.action.{Action, ChainableAction} import io.gatling.core.stats.message.ResponseTimings import io.gatling.core.structure.ScenarioContext import io.gatling.http.Predef._ import scala.concurrent.duration._ class ExampleProtocolScript extends Simulation { val httpConf = http .baseURL("http://computer-database.gatling.io") .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .doNotTrackHeader("1") .acceptLanguageHeader("en-US,en;q=0.5") .acceptEncodingHeader("gzip, deflate") .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0") val scn = scenario("BasicSimulation") .exec( new ExampleActionBuilder("MyAction") ) setUp( scn.inject(atOnceUsers(1)).protocols(httpConf) ) } class ExampleActionBuilder(myNameAction: String) extends ActionBuilder { override def build(ctx: ScenarioContext, next: Action): Action = { new ExampleChainableAction(myNameAction, next, ctx) } } class ExampleChainableAction(myNameAction: String, myNextAction: Action, ctx: ScenarioContext) extends ChainableAction { override def next: Action = myNextAction override def name: String = myNameAction override def execute(mySession: Session): Unit = { val startTime = System.currentTimeMillis() try { System.out.println(myNameAction+" Hello world!") val stopTime = System.currentTimeMillis() ctx.coreComponents.statsEngine.logResponse( session = mySession, requestName = name, timings = new ResponseTimings(startTime, stopTime), status = OK, None, None, Nil ) myNextAction ! mySession } catch { case e: Exception => { val stopTime = System.currentTimeMillis() ctx.coreComponents.statsEngine.logResponse( session = mySession, requestName = name, timings = new ResponseTimings(startTime, stopTime), status = KO, None, Some(e.getMessage),
ãã®èšäºã§ã¯ãã¬ããªã³ã°ãã¬ãŒã ã¯ãŒã¯ã®ããŒããå®è¡ããããã®ã¹ã¯ãªãããç¬èªã«éçºããã®ã«åœ¹ç«ã€äž»ãªãã€ã³ãã«ã€ããŠèª¬æããŸããã , .