![](https://habrastorage.org/webt/yy/ey/ao/yyeyao2gdkf5rkv4vqbkhwdnic8.jpeg)
12æ6ã7æ¥ã«ãã¢ã¹ã¯ã¯ã§ç¬¬5åãã€ãŒã³ããã°äŒè°ãéå¬ãããŸããã
圌女ã®ã¹ããŒã¬ã³ã¯ããã¹ãã ãã¹ã¿ãŒã ãã§ãªãïŒã ä»åèŠããŠããã¬ããŒãã®äž»èŠ³çãªã¬ãã¥ãŒãå ±æããããšæããŸãã
å 責äºé ã ãã¡ãããããã¯ç§ã®å人çãªå¥œã¿ã«åºã¥ããŠéžæãããã¬ããŒãã®ã»ãã®äžéšïŒ30ã®ãã¡8ïŒã§ãã ãããã®ã¬ããŒãã®ã»ãšãã©ãã¹ãŠãäœããã®åœ¢ã§Javaã«é¢é£ããŠãããããã³ããšã³ããšã¢ãã€ã«éçºã«é¢ããåäžã®ã¬ããŒãã¯ãããŸããã ããã€ãã®å Žæã§ã¯ãç§ã¯èªåèªèº«ã§ã¹ããŒã«ãŒãšã®è«äºãèš±å¯ããŸãã ããå®å šã§äžç«çãªã¬ãã¥ãŒã«èå³ãããå Žåã¯ãäŒçµ±çã«äž»å¬è ã®ããã°ã«æ²èŒããå¿ èŠããããŸãã ããããããããã誰ããè¡ããªãã£ããããã®ã¬ããŒãã ããç¥ãããšã¯èå³æ·±ãã§ãããã
èšäºã®åçã¯äŒè°ã®å ¬åŒãã€ãã¿ãŒããã®ãã®ã§ãã
ãã«ãŒã¯ã»ãµãã°ã«ã¹ããŒã DevOpsããããŸãã ãã¹ãŠã®ãã¹ã¿ãŒãçºå°ããŸããã
![](https://habrastorage.org/webt/ht/my/tt/htmyttor7b0ij-jr5dx4ydosj0w.jpeg)
ïŒåçã§ã¯ãBaruchãLiquid Softwareãšããæ¬ãé åžãããšãã®èªå€§åºåïŒ
Javaã«é¢äžããJUGRUã°ã«ãŒãã®äŒè°ã«åå ããŠãã人ã¯ãBaruch Sadogurskyã®çŽ¹ä»ã¯äžèŠã§ãã ãããã圌ã¯ãã€ãŒã³ãã°ã§åããŠè©±ããŸããã
ç°¡åã«èšãã°ãDevOpsã®äž»èŠãªã¢ã€ãã¢ã«é¢ããã¬ãã¥ãŒã¬ããŒãã§ããã ããŒã«ã§ãDevOpsãå®çŸ©ããããšå°ãããããšãã人ã ã¯ãŸãæåã«ãããã¯ãããªäººã ...ã
ãããããã®ãããã¯ã§äœãããã§ã«åŠãã 人ã§ãããDORA Association devops-research.comã®ç 究ã«ã€ããŠåŠã¶ããšã¯éåžžã«èå³æ·±ãã§ãããã ãããŠãé ä¿¡é床ãšå質ãã€ãªãæ²ç·ã«ã€ããŠïŒããæç¹ã§ããããè¯ããã¹ããã®ããã®æéãå¿ èŠãšããããé床ãäœäžããŸãããããŒã ãçºå±ããã«ã€ããŠãçžé¢é¢ä¿ãçŽæ¥ã«ãªããŸãïŒïŒ
![](https://habrastorage.org/webt/fw/8v/8o/fw8v8ocre1tvccsgnwvihwc7eaw.png)
ã¬ããŒãã®ã¿ã€ãã«ã¯æçºçã§ãããã¹ã±ãžã¥ãŒã«ã§ã¯ã¬ããŒãã«ãçããããšããã«ããŽãªãä»ããããŠããŸããããç§ã®æèŠã§ã¯ããã®å 容ã¯ããªãäž»æµã§ããã ãã¡ãããããã¯Devopså€æã®æ¡ä»¶äžã§ã®ãã¹ã¿ãŒã®è§£éã§ã¯ãªãããã¹ã¿ãŒã®ä»äºã®æ§è³ªã®å€åã«ã€ããŠã§ããã ã¢ã©ã³ãã€ãžãšãã³ã©ã€ã¢ãªã¡ã³ã³ãã¯ã1幎åã«ãããã®ããšã«ã€ããŠå€ãã®ããšã話ããŸããã å€åãã圹å²ãšTååã¹ãã«ã®ãæ°Žå¹³ãéçºã®äž¡æ¹ãã1幎åã®ã©ãŠã³ãããŒãã«ã 2018幎ã«ãã¹ã¿ãŒãç¥ã£ãŠããã¹ãããš ãã§è°è«ãããŸããã
ããã¡ãããå€æŽããããªãå Žåã¯ãããã»ã©é¢çœãã¯ãããŸããããããªãã®ããã®ä»äºããããŸãã ãããŸã§ã®ãšããã70幎代ã«COBOLã§èšè¿°ãããã·ã¹ãã ããµããŒãããã人ã®ããã®ä»äºããããŸãããšBaruchã¯ç®èã«ãè¿°ã¹ãŠããŸãã
ã¢ã«ãã§ã ã»ãšãã·ã§ã³ã³ã ãããžã§ã¯ãããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããŸããïŒ ã¢ã€ãã¢ãæã£ãŠããïŒ
![](https://habrastorage.org/webt/nz/i0/hm/nzi0hmxhws-r45ww43c8bl8lsr0.jpeg)
Artyomã¯ãHeisenbagã®åå è ã«ã¢ãªã¥ãŒã«ã¬ããŒãã·ã¹ãã ã«é¢ããã¬ããŒããããç¥ã£ãŠããŸãïŒããšãã°ã2018幎ã«ãµã³ã¯ãããã«ãã«ã¯ã®ä»¥åã®ãã€ãŒã³ãã°ããç»å Žããã¢ãªã¥ãŒã«æ©èœã«é¢ããã¬ããŒãã§ãïŒã ã¢ãªã¥ãŒã«èªäœã¯ãæ°åãæ°äžãããã«ã¯æ°åäžä»¥äžã®ãã¹ããå«ããããžã§ã¯ãã®ã³ã³ããã¹ãã§çãŸããéçºè ãšãã¹ã¿ãŒéã®çžäºäœçšãç°¡çŽ åããããã«èšèšãããŠããŸãã ãã¹ãããã±ããçºè¡ã·ã¹ãã ãªã©ã®å€éšãªãœãŒã¹ãšãªã³ã¯ããããŒãžã§ã³ç®¡çã·ã¹ãã ã§ã³ãããããæ©èœãåããŠããŸãã ç§ãã¡ã®ãã€ã¯ãããŒã ã§ã¯ããã¹ãæ°ã¯æ°åã«éããŸããã§ããããæšæºçãªæ段ã«å®å šã«å¯Ÿå¿ããŸããã ããããããããã®è£œåã®ãã¹ãæ°ã700ã«éããå šäœçãªã¿ã¹ã¯ã顧客åãã®é«å質ã®ã¬ããŒããäœæããããšã§ãã£ããããç§ã¯ã¢ãªã¥ãŒã«ã«ç®ãåãå§ããŸããã
ãããããã®å ±åã¯ã¢ãªã¥ãŒã«ã«é¢ãããã®ã§ã¯ãããŸããã§ãããã圌ã«é¢ãããã®ã§ããããŸããã
Artyomã¯ãIntelliJ IDEAçšã®ãã©ã°ã€ã³ã®äœæã¯ã·ã³ãã«ã§é åçãªã¢ã¯ãã£ããã£ã§ãããšäžè¬ã«ç¢ºä¿¡ããŸããã ãªããããå¿ èŠãªã®ã§ããïŒ äžæ¬ã³ãŒãå€æŽãèªååããããã ããšãã°ãå€æ°ã®ãœãŒã¹ã³ãŒããJUnit4ããJUnit5ã«å€æããå Žåã ãŸãã¯ãã¢ãªã¥ãŒã«1ããã¢ãªã¥ãŒã«2ã®äœ¿çšãŸã§ããŸãã¯ãã«ãã«ãé³ãç«ãŠãã·ã¹ãã ãšã®éä¿¡ã§ãã¹ãã®ã¿ã°ä»ããèªååããŸãã
IDEAã§äœæ¥ãã人ã¯ãã³ãŒãã§ã©ã®ãããªããªãã¯ãã§ããããç¥ã£ãŠããŸãïŒããšãã°ãforã«ãŒãã䜿çšããŠã³ãŒããJavaã¹ããªãŒã ã䜿çšããŠã³ãŒãã«èªåçã«å€æããããJavaãå³åº§ã«Kotlinã«å€æãããããŸãïŒã ããèå³æ·±ãã®ã¯ãIDEAã®ã³ãŒãå€æã«å¯Ÿããç§å¯ã®ããŒã«ãã©ã®ããã«éãããããèŠãããšã§ãããç§ãã¡ã¯ããã«åå ããç¬èªã®ããŒãºã«åãããŠç¬èªã®ãã©ã°ã€ã³ãäœæããããã«æåŸ ãããŸãã 次åã倧ããªã³ãŒãããŒã¹ã§äœããããå¿ èŠããããšãããã®ã¬ããŒããæãåºããIDEAãã©ã°ã€ã³ã䜿çšããŠèªååããæ¹æ³ã確èªããŸãã
ããªã«ã»ã¡ã«ã¯ã·ã§ãã Java and Reactorãããžã§ã¯ã-ãã¹ãã¯ã©ãã§ããïŒ
![](https://habrastorage.org/webt/35/u5/ze/35u5zepym4if2dyz-hwev3e0_mg.jpeg)
ãã®ã¬ããŒãã¯ãJokerãŸãã¯JPoint Javaã«ã³ãã¡ã¬ã³ã¹ã§è¡ãããå¯èœæ§ããããŸãã Kirillã¯ãåäžã®ã€ãã³ããã°ïŒKafkaïŒãæã€ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§projectreactor.ioãã¬ãŒã ã¯ãŒã¯ã䜿çšããæ¹æ³ãããªã¢ã¯ãã£ãã¹ããªãŒã ãã§ã®ã³ãŒãã£ã³ã°ã®æ¬è³ªã«ã€ããŠå°ã説æããŸããã
人çã¯ç§ãã¡ã®ããŒã ã«ãåäžã®ã€ãã³ããã°ã§ã¢ãŒããã¯ãã£ã䜿çšããããã«ä¿ããŠããŸãããŸããKafkaãæ€èšããŠããŸãã ãã ããã¹ããªãŒãã³ã°ã€ãã³ãåŠçã«ã€ããŠã¯ãReactorã§ã¯ãªãKafka Streams APIïŒéçºè ã«ãšã£ãŠã¯ãã¹ããŒããã«åŠçã®ãããªãã®ãééçã«å®è£ ãããŠããããã§ãïŒã§å®éšããŠããŸãã ãã ããæ°ãããã¯ãããžãŒã§ã¯åžžã«ããã§ããããã«ãããããããšãèœãšãç©Žãã¯äºåã«ã¯ããããŸããã ãããã£ãŠããã§ã«ãã¯ãããžãŒã䜿çšããŠããå°é家ã®è©±ãèãããšãéèŠã§ããã
ã¬ãªããŒãã»ã«ãã³ã³ã Terraformã䜿çšããSelenoidã¯ã©ã¹ã¿ãŒã®ç®¡ç
![](https://habrastorage.org/webt/6h/xu/s8/6hxus8uek7c3xoztsywkvfwlqlq.jpeg)
åã®ã¬ããŒããJPointäŒè°ãé£æ³ãããå Žåãããã¯ç¢ºãã«DevOopsã«é¢ãããã®ã§ã ã Leonidã¯ãTerraformä»æ§ã䜿çšããŠSelenoidã¯ã©ã¹ã¿ãŒãäœæããã³æ§æããæ¹æ³ã«ã€ããŠèª¬æããŸããã Selenoidèªäœã«ã€ããŠã¯ãæšå¹Žã®Heisenbug ã«é¢ããã¬ããŒãããããŸãããããã¯ã匟åæ§ã®ãããµãŒãã¹ãšããŠæ©èœããããŸããŸãªãã©ãŠã¶ãŒã§å€æ°ã®Seleniumãã¹ããå®è¡ã§ããè±å¯ãªåæ£ã·ã¹ãã ã§ãã è€æ°ã®ãã·ã³ã«å±éããå¿ èŠãããã·ã¹ãã ãšåæ§ã«ãSelenoidãæåã§ã€ã³ã¹ããŒã«ããããšã¯å°é£ã§ãã ããã§ã¯ãææ°ã®Configuration-as-Codeã·ã¹ãã ã圹ç«ã¡ãŸãã
Leonidã¯ãTerraformã®æ©èœã®ããªã詳现ãªæŠèŠãäœæããŸãããããã¯ãã»ãšãã©ã®èŽè¡ã«ã¯ãããã銎æã¿ã®ãªãã·ã¹ãã ã§ãããå®éã«ã¯DevOps-automationã«æ¢ã«ããç¥ãããŠããŸãïŒããšãã°ãDevoops-2018ã«ã³ãã¡ã¬ã³ã¹ã§ã¯ãã³ãŒãã®äœæãšä¿å®ã®ãã¹ããã©ã¯ãã£ã¹ã«é¢ããåªããã¬ããŒãããããŸããïŒ Terraformã§ïŒã ããã«ãTerraformã¹ã¯ãªããã䜿çšããŠãã¯ã©ã¹ã¿ãŒå ã®åãã·ã³ã®Selenoidã䜿çšããdockerã³ã³ãããŒã®ãã©ã¡ãŒã¿ãŒãšãã¯ã©ã¹ã¿ãŒã®ä»®æ³ãã·ã³ã®ãã©ã¡ãŒã¿ãŒãèšè¿°ããæ¹æ³ã瀺ããŸããã
ã¬ãªããŒãã«ãã£ãŠæ€èšãããç¹å®ã®ã±ãŒã¹ã¯ç¢ºãã«ã»ã¬ãã€ããå±éããã¿ã¹ã¯ãä¿é²ããããšãã§ããŸãããç§ã¯ãã¹ãŠã«ã€ããŠã¹ããŒã«ãŒã«åæããŸããã åºæ¬çã«ã2ã€ã®ç°ãªãã¿ã¹ã¯ã«Terraformã䜿çšããŸãããªãœãŒã¹ã®äœæãšæ§æã§ãã ãããŠãããã¯ãLeonidãTerraformãäžåºŠèµ·åããŠä»®æ³ãã·ã³ãäœæããåä»®æ³ãã·ã³ã§ããäžåºŠdockerã³ã³ãããŒãèµ·åããããšãäœåãªãããããšããäºå®ã«ã€ãªãããŸãã ç§ã®æèŠã§ã¯ããªãœãŒã¹ã®äœæã®åé¡ãããŸã解決ããTerraformã¯ãæ§æã®åé¡ãããŸããã解決ããŸããã Ansibleããã®ä»ã®ãœãªã¥ãŒã·ã§ã³ãªã©ã®ç¹å¥ãªæ§æã·ã¹ãã ã䜿çšããŠããã©ãã©ãŒã ãããžã§ã¯ãã®éè€ãšãããã®ç¹°ãè¿ãèµ·åãåé¿ããããšãå¯èœã§ãã
ããããäžè¬çã«ãInfrastructure as Codeã®åéã®ãã¹ã¿ãŒåãã®ãæè²ããã°ã©ã ããšããŠããã®ã¬ããŒãã¯éââåžžã«åœ¹ç«ã¡ãŸãã
ã¢ã³ãã¬ã€ã»ãã«ã±ããã ã°ããŒãã«SMSãã©ãããã©ãŒã ã®äŸã䜿çšãããTestContainersããã³JUnit 5ãšãã€ã¯ããµãŒãã¹åç©åã®ãšã¬ã¬ã³ããªçµ±åãã¹ã
![](https://habrastorage.org/webt/rk/3d/mo/rk3dmodcrkabye2qc8mdl_vskws.jpeg)
ãããŠåã³ãã€ã¯ããµãŒãã¹ã«ã€ããŠïŒ ä»åã®äŒè©±ã¯ãåæã«ããã€ãã®ãµãŒãã¹ã®èµ·åãšå¯Ÿè©±ãå¿ èŠãšãããã¹ããå®è¡ããæ¹æ³ã«ã€ããŠã§ããã æ¡åŒµã·ã¹ãã ãšããç¥ãããïŒãããŠåªããïŒTestContainersãã¬ãŒã ã¯ãŒã¯ãåããJUnit5ãããœãªã¥ãŒã·ã§ã³ã®åºç€ãšããŠææ¡ãããŸããïŒããšãã°ã Sergey Egorovã«ããæšå¹Žã®ã¬ããŒããåç §ïŒã
Javaã§äœããæžããŠããã®ã«TestContainersãäœãªã®ããŸã ããããªãå Žåã¯ãæ©æ¥ã«å匷ããããšããå§ãããŸãã TestContainersã䜿çšãããšãDockerãã¯ãããžãŒã䜿çšããŠããã¹ãã³ãŒãå ã§çŽæ¥å®éã®ããŒã¿ããŒã¹ããã®ä»ã®ãµãŒãã¹ãååŸãããããããããã¯ãŒã¯çµç±ã§æ¥ç¶ãããã®çµæããã¹ãã®çŽåŸã«äœæããã³ç Žæ£ãããæç¹ã§äœæãããç°å¢ã§çµ±åãã¹ããå®è¡ã§ããŸãã åæã«ããã¹ãŠãJavaã³ãŒãããçŽæ¥æ©èœããMavenäŸåé¢ä¿ãšããŠæ¥ç¶ããéçºè ã®ãã·ã³/ CIãµãŒããŒã«Docker以å€ãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸããã TestContainersã1幎以äžäœ¿çšããŠããŸãã
Andreyã¯ãJUnit5æ¡åŒµæ©èœãã«ã¹ã¿ã ã¢ãããŒã·ã§ã³ãããã³TestContainersã䜿çšããŠããšã³ãããŒãšã³ããã¹ãã®ãã¹ãç°å¢æ§æãã©ã®ããã«èŠå®ã§ããããšããããªãå°è±¡çãªäŸã瀺ããŸããã ããšãã°ããã¹ãã«æ³šéãæžãïŒæ¡ä»¶ä»ãã³ãŒãïŒ
@Billing @Messaging
æ¯èŒçèšãã°ãæžãããšãã§ããŸã
@Test void systemIsDoingRightThings(BillingService b, MessagingService m) {...}
ã³ã³ããå ã§çºçããïŒãã¹ãéçºè ãæ°ä»ããªãïŒå®éã®ãµãŒãã¹ãšéä¿¡ã§ããJavaã€ã³ã¿ãŒãã§ãŒã¹ãæž¡ããããã©ã¡ãŒã¿ãŒã«ã
ãããã®äŸã¯éåžžã«ãšã¬ã¬ã³ãã«èŠããŸãã ç§ã«ãšã£ãŠãTestContainersãšJUnit 5ã®ã¢ã¯ãã£ããŠãŒã¶ãŒãšããŠç解ãããããæ¯èŒçç°¡åã«å®è£ ã§ããŸãã
ããããäžè¬ã«ããã®ã¢ãããŒãã§ã¯ããã¹ãã·ã¹ãã ãšéçšã·ã¹ãã ãæ§æããæ¹æ³ãæ ¹æ¬çã«ç°ãªããšããäºå®ã«é¢é£ãã倧ããªåé¡ã¯æªè§£æ±ºã®ãŸãŸã§ãã
ãšã³ãããŒãšã³ãã®ãã¹ãäžã«ã·ã¹ãã å šäœã ãã§ãªãããã®æ§ææ¹æ³ããã¹ããããå Žåã«ã®ã¿ããã¹ãŠãå£ãããšãæããã«æ¬çªç°å¢ã§ã¯ã€ãã¯ãªãªãŒã¹ãå®è£ ã§ããŸãã éçºããã³ãã¹ãããã»ã¹äžã«ã·ã¹ãã å±éã¹ã¯ãªãããç¹°ãè¿ãå®è¡ããå Žåããã®ã¹ã¯ãªãããå®çšŒåç°å¢ã§èµ·åãããå Žåã§ãæ©èœããããšã¯ééããããŸããã Andreyã®äŸã§ãã¹ãç°å¢ãæ§æããã³ãŒãã®åœ¹å²ã¯ãã¢ãããŒã·ã§ã³ã«ãã£ãŠå®è¡ãããŸãã ããããå®çšŒåç°å¢ã§ã¯ãAnsibleãKubernetesãªã©ããŸã£ããç°ãªãã³ãŒãã䜿çšããŠã·ã¹ãã ãã¬ã€ã¢ãŠãããŸãããã®ãããªã·ã¹ãã ãã¹ãã«ã¯äžåé¢äžããŸããã ãããŠãããã¯å®å šã«ãšã³ãããŒãšã³ãã§ã¯ãªããããã®ãã¹ããå¶éããŸãã
ã¢ã³ãã¬ã€ã»ã°ã©ãºã³ãã å€éšäŸåé¢ä¿ã®ããã·ã¹ãã ã®ãã¹ãïŒåé¡ã解決çãMountebank
![](https://habrastorage.org/webt/rc/u5/pm/rcu5pm2i_wcdfacaaglje5bcqmy.jpeg)
ãã®ã¬ããŒãã®ãããã¯ã«é¢é£ãã人ã®ããã«ãAndrei Solntsevã«ãããå€éšãµãŒãã¹ã«äŸåããã·ã¹ãã ããã¹ãããããã®ååçãªã¢ãããŒãã«é¢ããæãããã¬ãŒã³ããŒã·ã§ã³ãã芧ã«ãªãããšã匷ããå§ãããŸãã Solntsevã¯ãå æ¬çãªãã¹ãã®ããã«å€éšã·ã¹ãã ã¢ãã¯ã䜿çšããå¿ èŠæ§ã«ã€ããŠéåžžã«èª¬åŸåãæã£ãŠèªã£ãŠããŸãã Andrei Glazkovã¯åœŒã®ã¬ããŒãã§ããã®ãããªæ¿¡ãã®ã·ã¹ãã ã®1ã€ã§ããNodeJSã§æžãããMountebankã«ã€ããŠèª¬æããŠããŸãã
ãµãŒããŒãšããŠMountebankã解é€ãããŠããããã¹ããäœæãããšãã«ã€ã³ã¿ãŒãã§ã€ã¹ã¢ãã¯ãããã¬ãŒãã³ã°ãããæ¹æ³ãšåæ§ã®æ¹æ³ã§ããããã¯ãŒã¯çµç±ã§èŠæ±ã«å¯Ÿããåçãããã¬ãŒãã³ã°ãã§ããŸãã å¯äžã®éãã¯ããããã¯ãŒã¯ãµãŒãã¹ã®ã¢ãã¯ã§ããããšã§ãã Mountebankã䜿çšãã奜å¥å¿ããããã±ãŒã¹ã¯ãããããããã·ãšããŠäœ¿çšããæ©èœã§ã-å®éã®å€éšã·ã¹ãã ã«ããã€ãã®èŠæ±ãéä¿¡ããŸãã
ããã§ãJavaéçºè ïŒããã³Andreiããã£ã¹ã«ãã·ã§ã³ãšãªã¢ã§åæããïŒããJavaã§äœæãããåã蟌ã¿ã¢ãŒãã§å®è¡ã§ããWireMockã©ã€ãã©ãªãã€ãŸããã€ã³ã¹ããŒã«ããã«ãã¹ãããçŽæ¥å®è¡ããããšããå§ãããããšã«æ³šæããŠãã ããéçºè ã®ãã·ã³ãŸãã¯CIãµãŒããŒã«ãµãŒãã¹ãæäŸããŸãïŒãã ããã¹ã¿ã³ãã¢ãã³ãµãŒããŒãšããŠãæ©èœããŸãïŒã Mountebankãšåæ§ã«ãWireMockã¯ãããã·ã¢ãŒãããµããŒãããŠããŸãã WireMockã§ããã€ãã®è¯å®çãªçµéšããããŸãã
ãã ããMountebankã®å©ç¹ã¯ãäœã¬ãã«ã®ãããã³ã«ã®ãµããŒãïŒWireMockã¯HTTPã§ã®ã¿åäœããŸãïŒããã³ããŸããŸãªæè¡ã®ãåç©åãã§åäœããæ©èœã§ãïŒMountebankã«ã¯ããŸããŸãªèšèªã®ã©ã€ãã©ãªããããŸãïŒã
ããªã«ã»ãã«ã«ãã§ãã Spring Boot Testã«ãããã¹ããšæ³£ã声
![](https://habrastorage.org/webt/k0/zu/tc/k0zutcg8ntbu0_a4suehr0lsqww.jpeg)
ãŸããJavaããã€ã¯ããµãŒãã¹ãããã³JUnit 5ããããŸããCyrilã¯ãJoisãšJPointã«ã³ãã¡ã¬ã³ã¹ã®ãã1人ã®è¬æŒè ã§ãJavaã³ãã¥ããã£ã§ããç¥ãããHeisenbugã§åããŠè¬æŒããŸããã
ãã®ã¬ããŒãã¯ãæšå¹Žã®Spring Curseã¬ããŒãã®ä¿®æ£çã§ãããJUnit5ããã³Spring Boot 2çšã«ä¿®æ£ãããäŸããããŸããã³ã³ããŒãã³ã/ãã€ã¯ããµãŒãã¹ãã¹ãã§Spring Bootãã¹ããæ§æããããšã«é¢é£ããããŸããŸãªå®çšçãªåé¡ã詳现ã«èª¿ã¹ãŸãã ããšãã°ããœãŒã¹ããªãŒã®é©åãªå Žæã§ç©ºã®
@SpringBootConfiguration StopConfiguration
ã䜿çšããŠæ§æã¹ãã£ã³ããã»ã¹ãåæ¢ãã
@MockBean
ãšã
@SpyBean
代ããã«
@MockBean
ãš
@SpyBean
ã䜿çšããå¯èœæ§ã«
@MockBean
ã
@SpyBean
ã CyrilãšEvgeny Borisovã«ããä»ã®ã¬ããŒããšåæ§ã«ãããã¯Spring Frameworkã®å®çšåã®éçšã«æ»ãã®ãçã«ããªã£ãŠããè³æã§ãã
ã¢ã³ãã¬ã€ã»ã«ã«ããã éçã¢ãã©ã€ã¶ãŒã«ã§ããããšãããã°ã©ããŒããã¹ã¿ãŒã«ââã¯ã§ããªãããš
![](https://habrastorage.org/webt/ze/xw/5b/zexw5bvquuivqfswlpzhocrx4pe.jpeg)
éçã³ãŒãåæã¯è¯ãããšã§ãã ç¶ç¶çé ä¿¡ã®æšæºã«ããã°ãããã¯é ä¿¡ãã€ãã©ã€ã³ã®æåã®ãã§ãŒãºã§ãããã³ãŒãããèªã¿åããããšã§æ€åºã§ããåé¡ã®ããã³ãŒããé€å€ããå¿ èŠããããŸãã éçåæã¯ãé«éïŒãã¹ãã®å®è¡ãããã¯ããã«é«éïŒã§ãããå®äŸ¡ã§ããïŒãã¹ãã®äœæãšãã圢ã§ããŒã ã®è¿œå äœæ¥ãå¿ èŠãšããªãããããã¹ãŠã®ãã§ãã¯ãã¢ãã©ã€ã¶ã®äœæè ã«ãã£ãŠæ¢ã«äœæãããŠããïŒãããåªããŠããŸãã
PVS-Studioãããžã§ã¯ãã®åµèšè ã®1人ã§ããAndrey KarpovïŒHabrã®èªè ã¯ããã°ãããç¥ã£ãŠããŸãïŒã¯ãPVS-Studioã䜿çšããŠæ¢ç¥ã®è£œåã®ã³ãŒãåæã§èŠã€ãã£ããã°ã®äŸã«é¢ããã¬ããŒããäœæããŸããã PVS Studioèªäœã¯å€èšèªè£œåã§ãããCãC ++ãCïŒãããã«æè¿ã§ã¯JavaããµããŒãããŠããŸãã
äžèšã®äŸã¯èå³æ·±ãããããã®éç解æã®æçšæ§ã¯æããã§ãããšããäºå®ã«ãããããããç§ã®æèŠã§ã¯ãAndreyã®ã¬ããŒãã«ã¯æ¬ é¥ããããŸããã
ãŸãããã®ã¬ããŒãã¯PVS-Studio補åïŒã¹ããŒã«ãŒã«ãããšããå¹³åäŸ¡æ Œã¯10,000ãã«ãïŒãèæ ®ããŠäœæãããŸããã ããããå®éãå€ãã®èšèªã«ã¯å€ãã®éçºããããªãŒãã³ãœãŒã¹ã®éç解æã·ã¹ãã ãããããšã«èšåãã䟡å€ããããŸããã Javaã®ã¿ã§ãç¡æã®CheckstyleãšSpotBugsïŒFindBugsã®åçµãããžã§ã¯ãã®åŸç¶ïŒãããã³IDEãšã¯å¥ã«å®è¡ããŠã¬ããŒããåä¿¡ã§ããIntelliJ IDEAã¢ãã©ã€ã¶ãŒã¯ãéåžžã«é²æ©ããŸããã
第äºã«ãéçåæã«ã€ããŠèšãã°ããã®æ¹æ³ã®åºæ¬çãªå¶éã«èšåãã䟡å€ããããšç§ã«ã¯æããŸãã 誰ãã倧åŠã§ã¢ã«ãŽãªãºã ã®çè«ãçµéšããŠããããããšãã°ãã·ã£ããããŠã³ã®åé¡ãã«ç²ŸéããŠããããã§ã¯ãããŸããã
ãããŠæåŸã«ãæ¢åã®ã³ãŒãããŒã¹ã«éç解æãå°å ¥ããåé¡ã¯ãŸã£ããçºçããªãã£ãããããããžã§ã¯ãã§ã¢ãã©ã€ã¶ãŒãå®æçã«äœ¿çšããããšãã§ããªããªããŸããã ããšãã°ã倧èŠæš¡ãªã¬ã¬ã·ãŒãããžã§ã¯ãã§ã¢ãã©ã€ã¶ãŒãå®è¡ãããšããã100,500åã®å€åãèŠã€ãããŸããã ãããããã®å Žã§ããã«ä¿®æ£ããæéãšåŽåã¯ãªããã³ãŒãå ã®äœããå€§å¹ ã«å€æŽããããšã¯ãªã¹ã¯ã§ãã ãããã©ãããããéçåæãå質ã²ãŒããšããŠæ©èœãããæ¹æ³ã¯ïŒ ãã®åé¡ã¯ãAndreiãšã®ãã£ã¹ã«ãã·ã§ã³ãšãªã¢ã§è°è«ãããŸãããããã®åé¡ã¯ã¬ããŒãèªäœã§ã¯èæ ®ãããŸããã§ããã
äžè¬çã«ãã¢ã³ãã¬ã€ãšåœŒã®ããŒã ãæåããããšãé¡ã£ãŠããŸãã 圌ãã®è£œåã¯èå³æ·±ãããã®åéã§ãã®ããããå ãããšããã¢ã€ãã¢ã¯éåžžã«å€§èã§ãã
***
ããããã1æ¥ç®ãš2æ¥ç®ã®æåŸã®åºèª¿è¬æŒã«ã€ããŠã¯äœãèšããªãã§ããããã©ã¡ãããããªããèŠãã ãã®èäœæš©ã·ã§ãŒã§ããã ãããã«ã€ããŠè©±ãããšã¯ãããšãã°ããã¯ãã³ãã«ããæŒå¥ã®ããã«ãèšèã§èªãçŽããããªãã®ã§ãã
1 幎åã®ã¬ããŒãã§ã¯ãäŒè°ã®äžè¬çãªé°å²æ°ãäŒããããšããŠããããã£ã¹ã«ãã·ã§ã³ãšãªã¢ãã©ã³ããããŒãã£ãŒã§äœãèµ·ãã£ãŠãããã«ã€ããŠè©±ããŸããã®ã§ãç¹°ãè¿ããŸããã
çµè«ãšããŠãç§ã¯äž»å¬è ã«å¥ã®çŸããéå¬ãããäŒè°ã«æè¬ããããšæããŸãã ç§ãç解ããŠããããã«ãäŒè°ãžã®é¢å¿ã¯æåŸ ããããã«äžåãããªãŒããŒãããã³ã°ãããã誰ããååãªãåç£ãæã£ãŠããŸããã§ããã ãããã確ãã«ãèå³æ·±ãã¬ããŒãããã£ã¹ã«ãã·ã§ã³ã¹ããŒã¹ãé£ã¹ç©ã飲ã¿ç©ãªã©ã誰ãããã£ãšéèŠãªãã®ãæã£ãŠããŸããã æ°ããäŒè°ã楜ãã¿ã«ããŠããŸãïŒ