
ããžãã¹ã§ãã·ã¢èªã®ã©ã€ãããã¥ã¡ã³ãã䜿çšããBDDãå¿
èŠãªå Žåããã¹ã¿ãŒã®å°ä»»ã®è·äœããªãããç¬ç«ããèªååã«ã¯ç¥èã¬ãã«ãäžååã§ãããã¹ã¯ã©ã ããŒã éã§åäžã®æè¡ã¹ã¿ãã¯ãæäŸããããšãéèŠã§ããã¢ã¯ã·ã§ã³ã
ç§ç°å³æžé€šãšã¯äœãã«ã€ããŠè©±ãå§ããåã«ããã®å®è£
ã®ã¢ã€ãã¢ãã©ã®ãããªåé¡ã解決ãããã®ããã©ã®ãããªçµæã«ãªã£ãã®ãã説æããããšæããŸãã
ãã®èšäºã¯ãAnna anna-che ãAlice mutaliska ãããã³Ksenia KseMishã«ãã£ãŠäœæãããŸãã ãäœã欲ããã£ãïŒ
ãŠãŒã¶ãŒã«é«å質ã®ãœãããŠã§ã¢ãç¶ç¶çã«æäŸãããå€ãã®äŒæ¥ãšåæ§ã«ããã¹ããšé¢é£ããã¥ã¡ã³ãã§å®å
šã«ã«ããŒãããæ¢è£œã®æ©èœã1ã€ã®ã¹ããªã³ãã§æäŸã§ããç¶ç¶çããªããªãŒãå®è£
ããããšèããŸããã ããããCDãžã®ç§»è¡äžã«ãéçºããã»ã¹ã®å€ãã®æ©èœã«åºäŒããŸããã
ã©ãããïŒ
- å€æ°ã®ã¹ã¯ã©ã ã³ãã³ãã
- é«ããªãœãŒã¹ã³ã¹ãã
- é·ãååž°ã
ãããã®æ©èœãåæããåŸãç§ãã¡ã¯ãããããŸããã§ããããé£ç¶é
ä¿¡ãã¹ãå
¥åã§ããã¢ã¯ã·ã§ã³ã®2ã€ã®ãªãã·ã§ã³ãèŠã€ããŸããã
- åããŒã ã«1人ã®èªåãã¹ãéçºè
ãåŒãä»ããŸãã
- ããŒã ãã¹ãæ
åœè
ïŒã ãã§ãªãïŒããã¹ãããŠãèªåãã¹ããäœæããŸãã
æåã®ãªãã·ã§ã³ã¯ãèªåãã¹ãã®ç¡æã®éçºè
ãåžå Žã«ããŸãããªãããé«äŸ¡ã§ãããããç§ãã¡ã«ã¯é©ããŠããŸããã§ããã ãããã2çªç®ã¯è²»çšå¯Ÿå¹æãšæ¡åŒµæ§ã«èå³ããããŸããã
äœãããå¿
èŠããããŸããïŒ
- ãã¹ãèªååã®ããã®åäžã®ããŒã«ãéçºããŸãã
- ãã¹ã¿ãŒã«ââäœãããå€ãèšå®ããŠãã³ãã³ããå
¥åããŸãã
- èªååãéå§ããã«ã¯ãããã°ã©ãã³ã°èšèªã®æäœéã®ç¥èãå¿
èŠã§ãã
- èªåãã¹ãã¯ãã¹ã¿ãŒã ãã§ãªããããŒã ã®ã¡ã³ããŒã«ãæžããŸãïŒãã¹ã¿ãŒã ãã§ãªã補åã®å質ã«ã責任ããããŸãïŒïŒã
- èªåãã¹ããéçºããæéãççž®ããŸãã
- ãã¹ãŠã®ããŒã ã§åäžã®æè¡ã¹ã¿ãã¯ã䜿çšããŸãã
ã©ãããã®ïŒ
ç§ç°ãçãŸããŸããã æ ç»ãããå
¬ãã®æªåé«ãç¬ã®åçš®ã«ã¡ãªãã§åä»ããããç§ç°å³æžé€šã ç§ãã¡ã¯ããã®ååããåžžã«ã·ã¹ãã ãæ¯æŽããå€æ°ã®æ¬ é¥ããä¿è·ããæºåãã§ããŠããçã®å人ã«é¢é£ä»ããŸãã
çŸæç¹ã§ã¯ãç§ç°ã¯60ãè¶
ããå®è£
ãããã¹ãããã§æ§æãããŠããããããã䜿çšããŠãWebã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããèªååããããšããã§ã«æ³å®ã§ããŸãã
ã©ã®ããã«æ©èœããŸããïŒ
ç§ç°ã¯ããã¹ãèªååã®ããã®BDDã¹ãããã©ã€ãã©ãªã§ãã BDDã¯ããŠãŒã¶ãŒã®è¡åã®èšè¿°ã«åºã¥ãéçºæ¹æ³è«ã§ãã ã€ãŸããããŠãŒã¶ãŒãšããŠãå°æ¥ã®è²»çšãèšç»ããããã«[æããš]ãã¿ã³ãã¯ãªãã¯ãããšãã«æéè²»çšã®ã¹ã±ãžã¥ãŒã«ã確èªãããããªã©ã®èª¬æãæžã人ãããŸãã ãã®ãããªèª¬æã¯ãéçºãžã®ãšã³ããªãã€ã³ããšããŠæ©èœããŸãã BDDãã¬ãŒã ã¯ãŒã¯ã§ã®ã¹ã¯ãªããã®ã¹ãããã説æããããã«ãäžããããããŒã¯ãŒãããã€ã次ã«ã䜿çšãããŸãïŒããããããã€ã次ã«äžããããŸãïŒã
ã©ã€ãã©ãªã§ã¯ããã¹ãã¯ãã·ã¢èªã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒããã¥ã¡ã³ããšããŠæ©èœãããŠãŒã¶ãŒã¹ã¯ãªãããè¡šããŸãã åãŠãŒã¶ãŒã¹ã¯ãªããã¯ã¹ãããã§æ§æãããåã¹ãããã¯ãå®è£
ãå®è£
ãããç¹å®ã®Javaã¡ãœããã«é¢é£ä»ããããŠããŸãã
ã©ã€ãã©ãªã䜿çšãããããžã§ã¯ããã³ãã¬ãŒãã¯éåžžã«ç°¡åã«æ§ç¯ããã次ã®ããã«ãªããŸãã
ç§ç°ã䜿çšãããã³ãã¬ãŒãã®äž»ãªã³ã³ããŒãã³ãã¯ãæ©èœãã¡ã€ã«ãã¹ãããïŒä»¥äžãã¹ããããšåŒã³ãŸãïŒãããã³WebããŒãžïŒä»¥äžãããŒãžãšåŒã³ãŸãïŒã§ãã æ©èœãã¡ã€ã«ã«ã¯ãã·ã¹ãã ã®å¯Ÿè±¡ãšãªãã¹ã¯ãªããïŒãã¹ãïŒã®ãªã¹ããèšè¿°ãããŠãããå°æ¥çã«èµ·åãããäºå®ã§ãã Stepsã¯ãæ©èœãã¡ã€ã«ã«èšè¿°ãããŠããã¹ãããã«é¢é£ä»ããããéçºæžã¿ã®ã¡ãœãããä¿åããŸãã WebããŒãžãšãã®èŠçŽ ã®èª¬æã¯ãããŒãžããã±ãŒãžã«ãããŸãã
ã©ã€ãã©ãªãæäœããåçãç解ããããã«ã次ã®äŸãæ€èšããããšããå§ãããŸãã
ã¹ã¯ã©ã ããŒã ã®ã¡ã³ããŒïŒãã®å Žåãã¢ããªã¹ããŸãã¯ãã¹ã¿ãŒïŒã¯ãŠãŒã¶ãŒã¹ã¯ãªããïŒãŠãŒã¶ãŒã¹ããŒãªãŒïŒãäœæããŸããããã¯ãå°æ¥ãéçºã¿ã¹ã¯ãèªåãã¹ãã®ãã§ãã¯ã»ãããããã³ãŠãŒã¶ãŒããã¥ã¡ã³ããšããŠæ©èœããŸãã
ããšãã°ããAlfa-BankãŠãŒã¶ãŒã¯ãAlfa-Clickã·ã¹ãã ã«ãŠãŒã¶ãŒå/ãã¹ã¯ãŒãã§ãã°ã€ã³ããŠã¢ã«ãŠã³ãã衚瀺ããŸãããšãããŠãŒã¶ãŒã¹ããŒãªãŒããããŸãã
ãã¹ã¿ãŒïŒãŸãã¯ä»ã®ããŒã ã¡ã³ããŒïŒã¯ä»¥äžãè¡ãå¿
èŠããããŸãã
1. java gradleãããžã§ã¯ããäœæãã以äžã«å¿ããŠæ¬¡ã®ãšã³ãã£ãã£ãè¿œå ããŸãã
- ç§ç°ïŒ
en.alfabank.testsïŒç§ç°ïŒ3.1.0 - ã¬ããŒããçæããã³æ·»ä»ããããã®ãã©ã°ã€ã³ïŒ
en.alfalab.gradleïŒcucumber-reporting-gradle-pluginïŒ0.1.0 - ãã¹ãã䞊è¡ããŠå®è¡ããããã®ãã©ã°ã€ã³ïŒ
en.alfalab.gradleïŒcucumber-parallel-test-gradle-pluginïŒ0.2.1 - ã¹ãããã®å®è£
ã«é¢ããæïŒ
generateRunner.glue = ["en.alfabank.steps"ã "steps"]
2.å®æãããŠãŒã¶ãŒã¹ã¯ãªããããç§ç°ã©ã€ãã©ãªã®æ¢è£œã®æé ã䜿çšããŠãããžã§ã¯ãã®.featureãã¡ã€ã«ã«è»¢éããŸãã ãã®åŸãæ©èœãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
: - : - " " "http://alfabank.ru" "" "login" "" "password" "" "-"
ïŒ ã äœæ¥ãå¿
èŠãªèŠçŽ ãæã€ããŒãžã®ããŒãžãªããžã§ã¯ããäœæããŸãããã°ã€ã³ããŒãžãšã¡ã€ã³ããŒãžãAlpha-clickãã ããŒãžããã±ãŒãžã«ãã°ã€ã³ããŒãžïŒLoginPageïŒã®ã¯ã©ã¹ãäœæããŸãã
@Name(" ") public class LoginPage extends AkitaPage { @FindBy(id = "login") @Name("") private SelenideElement login; @FindBy(id = "password") @Name("") private SelenideElement password; @FindBy(id = "submit") @Name("") private SelenideElement submitButton; }
AkitaPageãç¶æ¿ããã¯ã©ã¹åãšããŒãžèŠçŽ ã«
@Name
ã¢ãããŒã·ã§ã³ãä»ãããããã®ããŒèšè¿°ã.featureãã¡ã€ã«ã§äœ¿çšããããšãéèŠã§ãã åæ§ã«ããã§ãã¯ã«åå ãããã¹ãŠã®ããŒãžãèšè¿°ããå¿
èŠããããŸãã
ãã¹ãŠã®ããŒãžã説æããåŸããããããããŒãžãããŒããããããšãã©ã®ããã«ç解ããŸããïŒããšããçåãçããŸãã ã¹ããããã¢ã«ãã¡ã¯ãªãã¯ããŒãžãããŒããããŸãããã§ã¯ãã¢ã«ãã¡ã¯ãªãã¯ããŒãžãçŸåšã®ããŒãžãšããŠèšå®ããããã¹ãŠã®SelenideElementsãæ€çŽ¢ãããŸãã ãã¹ãŠã®èŠçŽ ãèŠã€ãã£ãå ŽåãããŒãžã¯ããŒããããŠããŸãã
ã©ã€ãã©ãªã§ã®ãã®ã¹ãããã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
@("^(?:|||) \"([^\"]*)\" (?:|)$") public void loadPage(String nameOfPage) { akitaScenario.setCurrentPage(akitaScenario.getPage(nameOfPage)); akitaScenario.getCurrentPage().appeared(); }
èŠçŽ ãããŒãžã«å±ããŠããããèªã¿èŸŒã¿çŽåŸã«è¡šç€ºãããªãå ŽåïŒããšãã°ã誀ã£ãŠå
¥åãããããŒã¿ã«é¢ããã¡ãã»ãŒãžïŒãèªã¿èŸŒã¿ã®æ±ºå®ã«åå ããŠã¯ãªããã@ Optionalã¢ãããŒã·ã§ã³ã§ããŒã¯ãããŸã å¿
é ã§ã¯ãããŸããã
4.ãã¹ããå®è¡ããŸãã
ãã¹ããå®è¡ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
- gradleã¿ã¹ã¯ïŒtestãgenerateCucumberReport
- VMããããã£ã®ã€ã³ã¹ããŒã«ãå¿ããŠã¯ãªããªãç¹å®ã®æ©èœãã¡ã€ã«ã®ã³ã³ããã¹ãã¡ãã¥ãŒïŒ-Dbrowser = chrome
- ã¿ãŒããã«ããïŒ
> gradlew clean test -i
> gradlew clean test -Pbrowse=chrome -Pprofile=local -PremoteHub=http://remote/wd/hub
> gradlew clean test -Dbrowser=chrome -Ptag=@test
ãããžã§ã¯ãã®å Žåããã¹ãŠã®æ©èœãã¡ã€ã«ã®äžŠè¡èµ·åïŒç¬èªã®ã©ã³ããŒãäœæãããæ©èœãã¡ã€ã«ããšïŒããªã¢ãŒããã·ã³ã§ã®ãã¹ãã®èµ·åïŒ-PremoteHubïŒããã©ãŠã¶ãŒã®å€æŽïŒ-Pbrowser = chromeïŒãã¹ã¯ãªããã«èšå®ãããã¿ã°ã«ãããã¹ãã®éå§ïŒ-PtagïŒ ã
ãã¹ãã®å®è¡åŸã«ã¬ããŒããåä¿¡ããã«ã¯ãã¿ãŒããã«ã§æ¬¡ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
> gradlew generateCucumberReport
> gradlew gCR
ãã®çµæãæšæºã®Cucumberã¬ããŒã
ïŒãã«ã/ã¬ããŒãïŒãçæãããŸãã
ãããŠããã ãã§ãã ãŠãŒã¶ãŒã¹ããŒãªãŒã¯ãã¹ãã§ã«ããŒããããŠãŒã¶ãŒããã¥ã¡ã³ããçæããããã¹ãã®åæ Œã«é¢ããã¬ããŒããçæãããŸãã
ç§ç°ã§ã®äœæ¥ãè©Šã¿ãã«ã¯ãæ¢æã®ãã³ãã¬ãŒããããžã§ã¯ãã
githubïŒAkita-testing-templateïŒããããŠã³ããŒãã§ããŸãã
ãã¹ãã®èªååãçŽé¢ããäž»ãªåé¡ãåæããåŸãç§ç°ã«æ¬¡ã®æ©èœãè¿œå ããŸããã
1. RESTãªã¯ãšã¹ããåŠçãã
ã©ã€ãã©ãªã§ã¯ãRESTèŠæ±ãéä¿¡ããå¿çãå€æ°ã«ä¿åã§ããŸãã ç§ç°ã¯æ¬¡ã®ãªã¯ãšã¹ãã¿ã€ãããµããŒãããŠããŸãã
GET | POST | PUT | DELETEãŸããå€æ°ããŒãã«ã§ã¯ãããããŒããã©ã¡ãŒã¿ãŒãæ¬æã®ã¿ã€ãã䜿çšã§ããŸãã
bodyãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ã
requestBodiesãã©ã«ããŒã«ä¿åãããŠãããªã¯ãšã¹ãæ¬æãšã察å¿ããã»ã«ã®ã¹ãããã®ããã¹ãæ¬æã®äž¡æ¹ãæ©èœããŸãã ããŒãã«ãã©ã¡ãŒã¿ãšURLéšåã®å€ã¯ã
application.propertiesã§æå®ã§ã
ãŸã ã RESTã䜿çšããã¹ãããã®äŸïŒ
2.å€æ°ã®äœ¿çš
å Žåã«ãã£ãŠã¯ãåŸç¶ã®ã¹ãããã®1ã€ã®ã¹ãããããã®å€ã䜿çšããå¿
èŠããããŸãã ãã®ããã«ãå€æ°ã¹ãã¬ãŒãžãAkitaScenarioã«å®è£
ãããŠããŸãã å€æ°ãä¿å/ååŸããã«ã¯ãsetVar / getVarã¡ãœããã䜿çšãããŸãã
å€æ°ãã¹ãã¬ãŒãžã«ä¿åããïŒ
akitaScenario.setVar(< >, < >);
ã¹ãã¢ããå€æ°ã®å€ãååŸããïŒ
akitaScenario.getVar(< >)
3.ãã¹ãããŒã¿ã®ä¿å
è¿œå ã®ãã©ã¡ãŒã¿ãŒãŸãã¯ãã¹ãããŒã¿ãæå®ããã«ã¯ããããžã§ã¯ãã®main / java / resourcesã«
application.propertiesãã¡ã€ã«ãäœæããå¿
èŠããããŸãã
ããªãã¯äœãããŸãããïŒ
䜿çšãããŠãããã¹ãŠã®ãã¯ãããžãŒãšãã®é¡äŒŒç©ãç 究ããçµæã次ã®ã¹ã¿ãã¯ã«å°éããŸããïŒJava + Gradle + Selenide + Cucumberã
Alfa-Bankã§ã¯JavaãšGradleã䜿çšããŠãããããããã§ã¯ããŸãéžæè¢ããããŸããã§ããã
Cucumberã¯æ±ãããããããªã倧ããªã³ãã¥ããã£ãæã£ãŠãããããJBehaveãCucumberã«çœ®ãæããŸããã
Selenideã©ã€ãã©ãªãŒã䜿çšãããšããã©ãŠã¶ãŒãã¿ã€ã ã¢ãŠããåçããŒãžãããã³AjaxèŠæ±ãç°¡åã«åŠçã§ããŸãã Selenideã®èè
ã§ããAndrei Solntsevã¯ã圌ã®
LJã«ããã©ã€ãã©ãªã«æ³šç®ããå
ã®ã³ãŒããã¬ãã¥ãŒããéã«ããã€ãã®è²Žéãªãã³ããäžããŸããã
å©ç¹ã¯äœã§ããïŒ
ç§ç°å³æžé€šã䜿çšãããšã次ã®çµæãåŸãããŸããã
- æ°ããåŸæ¥å¡ã®å
¥å Žåºæºã¯äžãããŸããïŒçŸåšãäž»èŠãªãªã³ããŒãã£ã³ã°ã«ã¯1ã2æ¥ããããããã°ã©ãã³ã°èšèªã®ã©ã€ãã©ãªç¥èã®åºæ¬çãªæ©èœãæå°éã«æãããããããŒã«ã®èªç±ãªãªãªãšã³ããŒã·ã§ã³ã¯2é±éã§éæãããŸãïŒã
- Webã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããèªååããåäžã®ããŒã«ãã€ã³ã¹ããŒã«ãããŠããŸãïŒçŸåšãAlfa Bankã®20以äžã®ããŒã ãã©ã€ãã©ãªã䜿çšããŠããŸãïŒã
- åãå
¥ã+ååž°ã«ã¯1æéããããããŸããïŒã»ãšãã©ã®æ©èœ-çŽ80ïŒ
ãèªåãã¹ãã§ã«ããŒãããŠãããããååž°ã¯ã¯ããã«é«éã§ãïŒã
ç§ç°ã¯æ¥ã
ãã¹ããªã³ãããã¹ããªã³ããŸã§ããŸããŸãé«å質ã®è£œåããŠãŒã¶ãŒã«æäŸãããæäŒããããŠããŸãã ãããã£ãŠãã©ã€ãã©ãªãããå Žåã¯ãèªåãã¹ãã®æ¹ãã¯ããã«èå³æ·±ãç°¡åã«ãªããšèšã£ãŠãå®å
šã§ãã
ãã§ã«èšã
ç§ç°ã¯ã
ãã€ãŒã³ãã° ïŒ2017幎12æ8ã9æ¥ãã¢ã¹ã¯ã¯ïŒããã³
ãã¬ãã¯ã¹ ïŒ2018幎2æ17æ¥ããã³ã¹ã¯ïŒã«ã³ãã¡ã¬ã³ã¹ã§è©±é¡ã«ãªããŸããã ãã§ã«3æ2æ¥ãš3æ¥ã«ã
ã»ã¬ã³ãã£ã³ããããšãã§éå¬ãããç§ç°ã§ã®äœæ¥æ¹æ³ãããäžåºŠèª¬æãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããŸãã
ç§ç°å³æžé€šã®ãããã§ãã¢ã«ãã¡ã©ãããŒã ã®ã¡ã³ããŒãåœéçãª
Hackathonã§ãã¹ãèªååïŒ2017幎10æ20æ¥ãããªãã¥ã¹ïŒã§1äœã«ãªãããã¹ãèªååã®å®è£
ãã©ãã ãè¿
éãã€å®¹æã§ãããã瀺ãããšãã§ããããšã¯å€§ããªåå©ã§ãã
ç¬ã飌ã£ãŠããªãå Žåã¯ãgithubïŒ
Akita libraryããããŠã³ããŒãã§ããŸãããŸããã¯ã€ãã¯ã¹ã¿ãŒãã®ããã«
akita-testing-templateãããŠã³ããŒãã§ããŸãã
ããã«ãç§ç°ã«ã¯
Telegramã«ç¬èªã®ã³ãã¥ããã£ããããŸãã åå ããŠãã ããïŒ
Alfa-Bankã®
ãã¹ã¿ãŒ ïŒãŸãã¯åã«ãã¹ã¿ãŒã§ã¯ãªãïŒã®1人ã«ãªãããå Žåã¯ã
空åžããããŸãã