ãã®èšäºã¯ãKaspersky Labã®å人ãšããŒãããŒã«ãã£ãŠäœæãããMicrosoftã®ãã¹ãããŒã«ã䜿çšããå®éã®çµéšãæšå¥šäºé ãšãšãã«èª¬æããŠããŸãã èè ã¯ãã€ãŽãŒã«ã»ã·ã¥ãã§ã°ããŽã£ããã®ã«ã¹ãã«ã¹ããŒç 究æã®ãã¹ããšã³ãžãã¢ã§ãã
ã¿ãªããããã«ã¡ã¯ã Kaspersky Labã®ãã¹ããšã³ãžãã¢ãšããŠãMicrosoft Azureã¯ã©ãŠããã©ãããã©ãŒã ã§ãµãŒããŒåŽã®ã¯ã©ãŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãéçºããããŒã ã§åããŠããŸãã
ããŒã ã¯ãéçºè ãšãã¹ã¿ãŒã§æ§æãããŠããŸãïŒçŽ1ã3人ïŒã éçºè ã¯CïŒã§ã³ãŒããèšè¿°ããTDDãšDDDãç·Žç¿ããŸããããã«ããããã¹ãã«é©ããã³ãŒããšççµåãå®çŸããŸãã éçºè ãäœæãããã¹ãã¯ãVisual Studioããæåã§å®è¡ããããTFSã§ãã«ãããã«ããããšãã«èªåçã«å®è¡ãããŸãã ãã«ããéå§ããã«ã¯ãGated Check-Inããªã¬ãŒãã€ã³ã¹ããŒã«ãããŠããããããœãŒã¹ç®¡çããã§ãã¯ã€ã³ãããšéå§ãããŸãã ãã®ããªã¬ãŒã®ç¹æ§ã¯ãäœããã®çç±ïŒã³ã³ãã€ã«ãšã©ãŒãŸãã¯ãã¹ãã®å€±æïŒã§ãã«ãã倱æããå Žåããã«ããèµ·åãããã§ãã¯èªäœãSourceControlã«å ¥ããªãããšã§ãã
ã³ãŒãããã¹ãããã®ã¯é£ãããšãã声æã«åºäŒã£ãã§ããããïŒ ãã¢ããã°ã©ãã³ã°ã«é Œã人ãããŸãã ä»ã®äŒç€Ÿã«ã¯å°çšã®ãã¹ãéšéããããŸãã ç§ãã¡ã«ãšã£ãŠãããã¯å¿ é ã®ã³ãŒãã¬ãã¥ãŒãšèªååãããçµ±åãã¹ãã§ãã åäœãã¹ããšã¯ç°ãªããçµ±åãã¹ãã¯å°ä»»ã®ãã¹ããšã³ãžãã¢ã«ãã£ãŠéçºãããç§ãæå±ããŠããŸãã
ã¯ã©ã€ã¢ã³ãã¯ããªã¢ãŒãã®SOAPããã³REST APIãéããŠç§ãã¡ãšããåãããŸãã ãµãŒãã¹èªäœã¯WCFãMVCã«åºã¥ããŠãããããŒã¿ã¯Azure Storageã«ä¿åãããŸãã Azure Service BusãšAzure Cloud Queueã¯ãé·ãããžãã¹ããã»ã¹ã®ä¿¡é Œæ§ãšã¹ã±ãŒãªã³ã°ã«äœ¿çšãããŸãã
å°ãæè©ïŒãã¹ã¿ãŒã¯éçºè ã«ãªãããã®ç¹å®ã®ã¹ãããã§ãããšããæèŠããããŸãã ããã¯å®å šã«çå®ã§ã¯ãããŸããã ããã°ã©ããšãã¹ããšã³ãžãã¢ã®éã®å¢çç·ã¯æ¯å¹Žæ¶ããŠããŸãã ãã¹ã¿ãŒã«ââã¯ãæè¡çãªèæ¯ãå¿ èŠã§ãã ãããåæã«ãéçºè ãšã¯å°ãç°ãªãèãæ¹ãæã£ãŠããŸãã ãã¹ã¿ãŒã¯ãŸãç Žå£ãç®æããéçºè ã¯äœæãç®æããŸãã äžç·ã«ã圌ãã¯é«å質ã®è£œåãäœãããšããã¹ãã§ãã
çµ±åãã¹ããšã¡ã€ã³ã³ãŒãã¯ãCïŒã§éçºãããŠããŸãã ãšã³ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããããšã«ãããæ§æããå®è¡äžã®ãµãŒãã¹ã§ããžãã¹ããã»ã¹ããã¹ãããŸãã ãããã®ãã¹ããäœæããã«ã¯ãVisual StudioãšMsTestãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãã éçºè ãåããã®ã䜿çšããŸãã ãã®ããã»ã¹ã§ã¯ããã¹ã¿ãŒãšéçºè ãã³ãŒããçžäºã«æ¥ç¶ãããããããŒã ã¡ã³ããŒã¯åžžã«åãèšèªã話ãããšãã§ããŸãã
ãã¹ãã¹ã¯ãªããïŒãã¹ãã±ãŒã¹ïŒã¯ã©ã€ãã§ãããMTMïŒMicrosoft Test ManagerïŒãä»ããŠç®¡çãããŸãã ãã®å Žåã®ãã¹ãã±ãŒã¹ã¯ããã°ãŸãã¯ã¿ã¹ã¯ãšåãTFSãšã³ãã£ãã£ã§ãã ãã¹ãã±ãŒã¹ã¯æåãŸãã¯èªåã§ãã ã·ã¹ãã ã®ä»æ§ã«ãããåŸè ã®ã¿ã䜿çšããŸãã
èªåãã¹ãã±ãŒã¹ã¯ããã«CLRåãšãã¹ãã¡ãœããïŒ1ã€ã®ã±ãŒã¹-1ã€ã®ãã¹ãã¡ãœããïŒã§æ¥ç¶ãããŸãã MTMïŒVisual Studio 2010ïŒãç»å ŽãããŸã§ããã¹ãã¯ã¢ãžã¥ãŒã«åœ¢åŒã§å®è¡ãããã¹ã¿ãžãªã«éå®ãããŠããŸããã ãã¹ãã¬ããŒãã®äœæããã¹ãã®ç®¡çã¯å°é£ã§ããã çŸåšãããã¯MTMãä»ããŠçŽæ¥è¡ãããŸãã
ããã§ããã¹ãã±ãŒã¹ããã¹ãèšç»ã«çµåããèšç»å ã§TestSuiteã䜿çšããŠãã©ããã§éå±€çãªã°ã«ãŒããæ§ç¯ã§ããŸãã
Feature Branchéçºãã€ãŸã äž»ãªæ¹åç¹ã¯ãåå¥ã®ãã©ã³ããå®å®åããã³ãªãªãŒã¹ã§è¡ãããŸãã åãã©ã³ãã«å¯ŸããŠããã¹ãèšç»ãäœæããŸããïŒæ··ä¹±ãé¿ããããïŒã Feature Branchãã©ã³ãã§å®å®åãå®äºãããšãã³ãŒãã¯mainãã©ã³ãã«è»¢éããããã¹ãã¯å¯Ÿå¿ãããã¹ãèšç»ã«è»¢éãããŸãã ãã¹ãã±ãŒã¹ããã¹ãèšç»ã«è¿œå ããã®ã¯éåžžã«ç°¡åã§ãïŒCtrl + C Ctrl + VããŸãã¯TFSã¯ãšãªçµç±ïŒã
ããã€ãã®æšå¥šäºé ã å人çã«ã¯ãåãã©ã³ãã®å®å®ãããã¹ããæ°ãããã¹ãããåé¢ããããšããŠããŸãã ããã¯ãTestSuiteã䜿çšããŠç°¡åã«å®è¡ã§ããŸãã ããã§ã®ç¹åŸŽã¯ãå®å®ïŒãŸãã¯ååž°ïŒãã¹ãã100ïŒ ã«åæ Œããå¿ èŠãããããšã§ãã ããã§ãªãå Žåã¯ãæ€èšãã䟡å€ããããŸãã ããŠãæ°ããæ©èœãå®å®ããåŸã察å¿ãããã¹ãã¯åã«ååž°ãã¹ãã¹ã€ãŒãã«è»¢éãããŸãã
ç§å人ã«ãšã£ãŠãæãéå±ã§æ¥åžžçãªããã»ã¹ã®1ã€ã¯ããã¹ãã±ãŒã¹ã®äœæã§ããã èªåãã¹ããéçºããããã»ã¹ã¯ããã¹ãŠã®äººã§ç°ãªããŸãã æåã«èª°ãã詳现ãªãã¹ãã¹ã¯ãªãããäœæããããã«åºã¥ããŠèªåãã¹ããäœæããŸãã ç§ã¯å察ãæã£ãŠããŸãã ïŒãã¹ãã¯ã©ã¹å ã®ïŒã³ãŒãã«ãããŒãã¹ãïŒããžãã¯ãªãïŒãèšè¿°ããŸãã 次ã«ãããžãã¯ã®å®è£ ããã¹ãã³ã³ããŒãã³ãã®ã¢ãŒããã¯ãã£ããã¹ãããŒã¿ãªã©ããããŸãã
ãã¹ããäœæããããTFSã«è»¢éããå¿ èŠããããŸãã 10ã®ãã¹ããããå Žåãããã¯1ã€ã®ããšã§ãã50ãŸãã¯100ã®å Žåãåæ°ãããã¹ãã±ãŒã¹ããã¹ãã¡ãœããã«ãªã³ã¯ããŠãæé ãå®æçã«å®äºããã®ã«å€ãã®æéãè²»ããå¿ èŠããããŸãã
ãã®ããã»ã¹ãç°¡çŽ åããããã«ãMicrosoftã¯tcm.exeãŠãŒãã£ãªãã£ãèæ¡ããŸããããã®ãŠãŒãã£ãªãã£ã䜿çšãããšãTFSã§ãã¹ãã¹ã¯ãªãããèªåçã«äœæãããã¹ãèšç»ã«å«ããããšãã§ããŸãã ãã®ãŠãŒãã£ãªãã£ã«ã¯ããã€ãã®æ¬ ç¹ããããŸããäœããã®çç±ã§ãç°ãªãã¢ã»ã³ããªã®ãã¹ãã1ã€ã®ãã¹ãèšç»ãŸãã¯ã¹ãããã«è¿œå ã§ããããã¹ãã±ãŒã¹ã«éåžžã®ååãèšå®ã§ããŸããã ããã«ããŠãŒãã£ãªãã£èªäœã¯æ¯èŒçæè¿ç»å ŽããŸããã ãŸã ååšããŠããªãã£ããšãã¯ããã¹ãã¹ã¯ãªããã®äœæããã»ã¹ãèªååããèªå·±èšè¿°ãŠãŒãã£ãªãã£ãäœæããŸããã ãã¹ãã¹ã¯ãªããã®ååãšæé ãæå®ããããã«ãç¹å¥ãªã«ã¹ã¿ã å±æ§TestCaseNameãšTestCaseStepãéçºãããŠããŸãã
ãŠãŒãã£ãªãã£èªäœã¯ããã¹ãã¹ã¯ãªããã®æŽæ°ãšäœæã®äž¡æ¹ãè¡ãããšãã§ããå¿ èŠãªèšç»ã«å«ããããšãã§ããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ãµã€ã¬ã³ãã¢ãŒãã§åäœã§ãããã®èµ·åã¯Worfklow TFSãã«ãã«å«ãŸããŠããŸãã ãããã£ãŠãèªåçã«èµ·åããæ¢åã®ãã¹ãã¹ã¯ãªãããè¿œå ãŸãã¯æŽæ°ããŸãã ãã®çµæãå®éã®ãã¹ãèšç»ããããŸãã
ãã¹ãèšç»ã®ãã¹ãå®è¡ã®ã¹ããŒã¿ã¹ïŒã³ãŒãã®å質ãšåçïŒã¯ãç¹å¥ãªã¬ããŒãã«è¡šç€ºãããŸãã TFSã«ã¯æ¢è£œã®ã¬ããŒãçšã®ãã³ãã¬ãŒãã»ããããããOLAPãã¥ãŒãã«åºã¥ããŠããã¹ãã±ãŒã¹ãšãã¹ãèšç»ã®ã¹ããŒã¿ã¹ã®å³ãäœæããŸãã ããããç§ãã¡ã¯èªåã§æžããç°¡åãªã¬ããŒããæã£ãŠããŸãã ç§ãã¡ã¯ããããèŠã誰ããããã«ãã¹ãŠãç解ã§ããããã«ããŸããã
以äžã«äŸã瀺ããŸãã
ã¬ããŒãã®ç¹åŸŽã¯ããã¥ãŒãã«åºã¥ããŠæ§ç¯ãããŠããªãããšã§ãããã¥ãŒãã¯åæçã«åæ§ç¯ãããããŸã é¢é£ã®ãªãããŒã¿ãå«ãŸããŠããå ŽåããããŸãããã®ã¬ããŒãã¯ãMTM APIããçŽæ¥ååŸããããŒã¿ã䜿çšããŸãã ãããã£ãŠããã€ã§ããã¹ãèšç»ã®çŸåšã®ã¹ããŒã¿ã¹ãååŸã§ããŸãã
ã¬ããŒãã¯HTML圢åŒã§äœæãããSmtpClientãä»ããŠããŒã å šäœã«éä¿¡ãããŸãã ããã¯ãã¹ãŠãã·ã³ãã«ãªãŠãŒãã£ãªãã£ã®å©ããåããŠè¡ãããŸãããã®ãŠãŒãã£ãªãã£ã®èµ·åã¯ãã¯ãŒã¯ãããŒãã«ãã«çŽæ¥å«ãŸããŠããŸã ïŒ ãŠãŒãã£ãªãã£ãããŠã³ããŒãããŸã ã
ãã¹ãã·ããªãªã®ç®¡çã«å ããŠãMTMã¯ãã¹ãç°å¢ã管çãããã¹ããå®è¡ãããšãŒãžã§ã³ããæ§æããããã«ã䜿çšãããŸãã ãã¹ãã®å®è¡ãé«éåããããã«ïŒããã§ã¯é·ãéåæããžãã¹ããã»ã¹ããã§ãã¯ãããã¹ãã«ã€ããŠèª¬æããŠããŸãïŒã6ã€ã®ãã¹ããšãŒãžã§ã³ãã䜿çšããŸãã ãšãŒãžã§ã³ãã®æ°Žå¹³ã¹ã±ãŒãªã³ã°ã«ããã䞊åãã¹ããå®çŸããŠããŸãã
èªåçµ±åãã¹ãã¯ãMTMãšVisual Studioã®äž¡æ¹ã§æåã§å®è¡ã§ããŸãã ãã ãããããã°äžã«æåã§éå§ãããŸãïŒãã¹ããŸãã¯ã³ãŒãïŒã ç§ãã¡ã®ããŒã ã§ã¯ãã»ãŒãã¹ãŠã®ãã°ã«å¯ŸããŠåçŸãã¹ããéå§ãããŸãã 次ã«ããã¹ããšäžç·ã«ãã°ãéçºã«è»¢éãããŸãã ãŸããéçºè ã¯åé¡ã®ç¶æ³ãã·ãã¥ã¬ãŒãããŠä¿®æ£ããã®ãç°¡åã§ãã
次ã«ããªã³ãŒã¹ããã»ã¹ã«ã€ããŠèª¬æããŸãã
ãããžã§ã¯ãã«ã¯ãå®å šãªãã¹ãå®è¡ãéå§ããç¹å¥ãªãã«ãããããããŒãªã³ã°ãã«ãã®ãããªããªã¬ãŒã§å®è¡ãããŸãã ã€ãŸããé«éã²ãŒããã§ãã¯ã€ã³ãã«ããæåããå ŽåãããŒãªã³ã°ãã«ããéå§ãããŸãã ãã®ãã«ãã®ç¹åŸŽã¯ãäžåºŠã«æ倧1ã€ã®ãã«ããåéãããããšã§ãã
ãã®ãã«ãã®æåã¯åã®ãã«ããšåãã§ãããã¹ããšã¡ã€ã³ãããžã§ã¯ãã®ææ°ããŒãžã§ã³ãåéããåäœãã¹ããå®è¡ããŸãã
ãã¹ãŠãããŸãããã°ãåéããããµãŒãã¹ã®ããã±ãŒãžãAzureã«ãããã€ããç¹å¥ã«èšè¿°ãããPower Shellã¹ã¯ãªãããèµ·åããŸãã å±é管çã¯Azure REST APIã䜿çšããŸãã å±éèªäœã¯ãã¯ã©ãŠããµãŒãã¹ã®äžéå±éã§å®è¡ãããŸãã å±éãæåããããŒã«ããšã©ãŒãªãã§éå§ãããå Žåãæ§ææ€èšŒã¹ã¯ãªãããéå§ããŸãã ãã¹ãŠãé 調ã§ããã°ãããŒã«ãåãæ¿ãããïŒäžéå±éãäž»ãªåœ¹å²ã«ãªããŸãïŒãçµ±åãã¹ãèªäœãèµ·åãããŸãã
ãã¹ãã®å®è¡åŸããã¹ãã®ã¹ããŒã¿ã¹ã«é¢ããã¬ããŒããå«ãã¬ã¿ãŒãããŒã å šäœã«éä¿¡ãããŸãã
å€å žçãªåäœãã¹ããšçµ±åãã¹ãã®äž¡æ¹ã®ãã¹ããäœæããåã«ãThe Art of Unit Testing and xUnit Test PatternsïŒRefactoring Test Codeãèªãããšããå§ãããŸã
ãããã®æ¬ïŒç§ã¯å人çã«æåã®æ¬ã倧奜ãã§ãïŒã«ã¯ãxUnitãã¬ãŒã ã¯ãŒã¯ã§ãã¹ããäœæããæ¹æ³ãšããªãæ¹æ³ã«é¢ããå€ãã®ãã³ããšã³ããå«ãŸããŠããŸãã
ç§ãã¡ã®ããŒã ã§èªåãã¹ãã³ãŒããæžãããã®åºæ¬çãªååãåæããŠãç§ã®èšäºãçµãããããšæããŸãã
- ããã¬ã³ããªãŒãªãCLRã¯ããã¹ãã¡ãœããã®ååã§ã ã ããã§ã®äž»ãªã¢ã€ãã¢ã¯ããã¹ãã®ååã1ã€èª¿ã¹ãããšã§ãããã°ã©ããŒãã©ã®ããŒã¿ã§ãäœãæåŸ ããããã確èªããããšãç解ã§ãããšããããšã§ãã ãã¹ãã®ååã¯ãã¢ã³ããŒã¹ã³ã¢ã§åºåããã3ã€ã®éšåã§æ§æããã次ã®ããã«ãªããŸããFunctionalUnderTest_Conditions_ExpectedResult
- ãã¹ãã®å³å¯ãªæ§é ã¯Arrange-Act-Assertã§ãã ããŒã¿ã®æºåãããã€ãã®ã¢ã¯ã·ã§ã³ãšæ€èšŒã ãã€ã³ãã¯ããã¹ããæãç°¡åã§æãã³ã³ãã¯ããªæ§é ã§ãããåºæ¬çã«ã¯åè¿°ã®3ã€ã®ã¹ãããã§æ§æãããããšã§ãã ããã«ããããã¹ãã®ãµããŒããšãããã°ã容æã«ãªãã ãã§ãªããèªã¿ããããåäžããŸãã
- ãã¹ãã«ã¯æ¡ä»¶ä»ãããžãã¯ãšã«ãŒããå«ããã¹ãã§ã¯ãããŸãã ã ããã§ãã³ã¡ã³ãããªããã°ããã®ãããªãã¹ããããã°ããã¹ãçšã®ãã¹ããäœæããå¿ èŠããããŸãã
- 1ã€ã®ãã¹ã-1ã€ã®ãã¹ã ã å€ãã®å Žåã人ã ã¯ãã¹ãã«å€æ°ã®Assertãæ¿å ¥ããŸããããã®åŸããã¹ããã©ã®ãã¹ãã«åœãŠãããã®ãç解ã§ããŸããã ãã¹ãã§1ã€ã®ãã¹ããå®è¡ããŠãã ãããããã«ããããããã°ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ãå€§å¹ ã«ç°¡çŽ åãããŸãã ããã§å°ãè¿œå ããŸãããå Žåã«ãã£ãŠã¯ã1ã€ã®ã¢ã¯ã·ã§ã³ã®åŸãããã€ãã®ãªããžã§ã¯ãã®ç¶æ ã確èªããå¿ èŠããããåãªããžã§ã¯ãã®ç¶æ ã¯å€ãã®ããããã£ã«ãã£ãŠç¹åŸŽä»ããããŸãã ãã®å Žåã2ã€ã®ãã¹ããå®è¡ãããã¹ãŠã®ããããã£ã®ããããã£ãå¥ã®ã¡ãœããã®ãã«ããŒãéåžžã®ååã®ãã«ããŒã§ç¢ºèªããAssert.IsTrueã®ä»£ããã«åå®çŸ©ãããã¢ãµãŒããåŒã³åºãããšããå§ãããŸãã ãŸããããããã£ãã§ãã¯ãèšè¿°ãããšãã¯ãèªã¿åãå¯èœãªãšã©ãŒã¡ãã»ãŒãžãèšè¿°ããŠãã ããã ããã§ãäŸãæããŸããã å®éãããŸããŸãªãã¿ãŒã³ããããããããŸãã
- ãã¹ãã¯ãçµ±åãã¹ãã§ãã£ãŠããè¿ éã§ãªããã°ãªããŸãã ã ããã念é ã«çœ®ããŠæžããŠã¿ãŠãã ããã ãã®ãããªæ¿å ¥ã䜿çšãããã¹ãã®å€ãã®äŸãèŠãŸããïŒThread.SleepïŒ60000ïŒã ãããé¿ããŠãã ããã äœããã®éåæã¢ã¯ã·ã§ã³ã®å®è¡ãäºæ³ãããå Žåã¯ããã®å®è¡ã远跡ããæ¹æ³ãèŠã€ããŠãã ããïŒããšãã°ãéåæããã»ã¹ãããŒã¿ããŒã¹ã®ç¶æ ãå€æŽãããªã©ïŒã ãããšãããã¹ããããã€ãã«åå²ãã䟡å€ãããã®ã§ããããïŒ
- ããããããããŸã è¡ã£ãŠããªããããã¹ãã§ã¯ã¹ã¬ããã®å®å šæ§ã芳å¯ããŠãã ããã ãªããªã å°æ¥çã«ã¯ããã¹ãã®å®è¡ãã¹ããŒãã¢ããããããšæãããã«ãªãå¯èœæ§ãæãé«ãããã«ãã¹ã¬ããã¯ãã®é«éåãéæããããã®ã»ãŒ1ã€ã®æ¹æ³ã«ãªããŸãã
- ç¬ç« ã ãã¹ãã¯ãå®è¡ã®é åºãçžäºã«äŸåããã¹ãã§ã¯ãããŸããã ãã®ååã«åºã¥ããŠãã¹ããäœæããŸãã å€ãã®å ŽåãããŸããŸãªäºæããªãçµæã«ã€ãªããããã¹ãã®å®è¡ãé ããªãããããã¹ãããŒã¿ãã¯ãªãŒã³ã¢ããããŠãã ããã
æåŸã«ãé©åãªãã¹ãã«ãããéçºãè¿ éã«ãªããã³ãŒãã®å質ãåäžããããšãä»ãå ããŸãã