-ããã°ãã¯ãç§ã®ååã¯ããŒã·ã£ã§ããç§ã¯ãšãã£ã©ã®ããŒã¿åæéšéã§åããŠããŸãã仿¥ã¯ããªããšäžç·ã«ãã¹ãã«ã€ããŠã®è¬çŸ©ãããŸãã
æåã«ãäžè¬çã«ã©ã®ãããªçš®é¡ã®ãã¹ãããããã«ã€ããŠè©±ãåãããªããã¹ããäœæããå¿ èŠãããã®ãââãçŽåŸãããããšããŸããæ¬¡ã«ããã¹ããçŽæ¥æäœããããã®Pythonã®æ©èœãšããã¹ãã®äœæã¢ãžã¥ãŒã«ããã³è£å©ã¢ãžã¥ãŒã«ã«ã€ããŠèª¬æããŸããæåŸã«ãCIã«ã€ããŠå°ãã話ããŸããããã¯å€§äŒæ¥ã§ã®ç掻ã®å¿ ç¶çãªéšåã§ãã
äŸããå§ããããšæããŸãããã¹ããæžã䟡å€ãããçç±ãéåžžã«æãããäŸã§èª¬æããããšæããŸãã
ãããTHERAC25ããã°ã©ã ã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ããããã¯çæ£è ã®æŸå°ç·æ²»ççšã®è£ 眮ã®ååã§ããããã¹ãŠãéåžžã«ããŸããããŸããã§ããããŸã第äžã«ãããã¯æªãã€ã³ã¿ãŒãã§ãŒã¹ãæã£ãŠããŸããã圌ãèŠããšã圌ãããŸãè¯ããªãããšã¯ãã§ã«çè§£ã§ããŸããå»åž«ãããããã¹ãŠã®æ°åãé転ããã®ã¯äžäŸ¿ã§ããããã®çµæã圌ãã¯åã®æ£è ã®èšé²ããããŒã¿ãã³ããŒããç·šéããå¿ èŠããããã®ã ããç·šéããããšããŸããã
圌ããååãä¿®æ£ããã®ãå¿ããŠãééã£ãŠããã®ã¯æããã§ãããã®çµæãæ£è ã¯èª€ã£ãŠæ±ãããŸããã UIããã¹ããã䟡å€ãããããã¹ããå€ãããããšã¯ãããŸããã
ããããæªãã€ã³ã¿ãŒãã§ãŒã¹ã«å ããŠãããã¯ãšã³ãã«ã¯ããã«å€ãã®åé¡ããããŸãããç§ãæãã²ã©ããšæããã2ã€ãç¹å®ããŸããã
- . , . , . , .
- C . THERAC , â , . . , , , - , - â .
ãã¹ããæžã䟡å€ãããã§ããããããã¯5人ã®èšé²ãããæ»ã«çµãã£ãã®ã§ããããŠäœäººã®äººã ãããŸãã«ãå€ãã®è¬ãäžããããããšã§èŠããã§ããã®ãã¯äžæã§ãã
ç¶æ³ã«ãã£ãŠã¯ããã¹ããäœæããããšã§å€ãã®ãéãç¯çŽã§ãããšããå¥ã®äŸããããŸããããã¯ç«ææ°åãªãŒãã¿ãŒã§ããç«æã®å€§æ°äžã®å€§æ°ã枬å®ããŠãããã§æ°åã«äœãèµ·ãã£ãŠãããã確èªããããã®è£ 眮ã§ãã
ããããå°äžã«ãã£ãã¢ãžã¥ãŒã«ã¯ãã¡ããªãã¯ã·ã¹ãã ã®SIã·ã¹ãã ã§ã³ãã³ããå®è¡ããŸããããããŠç«æã®è»éã«ããã¢ãžã¥ãŒã«ã¯ããããè±åœã®å¯Ÿçã·ã¹ãã ã§ãããšèããããã誀ã£ãŠè§£éããŸããã
ãã®çµæãã¢ãžã¥ãŒã«ã¯ééã£ãè§åºŠã§å€§æ°ã«å ¥ãã厩å£ããŸããããã¹ãã§ç¶æ³ãã·ãã¥ã¬ãŒãããŠãããåé¿ããããšã¯å¯èœã§ããããã«æãããŸããã1å2500äžãã«ããŽãç®±ã«å ¥ã£ãã°ããã§ããããããããã¯ããŸããããŸããã§ããã
ããã§ããã¹ããäœæããå¿ èŠãããçç±ã«ã€ããŠèª¬æããŸããåé ç®ã«ã€ããŠåå¥ã«è©±ããŸãããïŒ
- ãã¹ãã¯ãã³ãŒããæ©èœããããšã確èªããå°ãèœã¡çãããŸãããã¹ããäœæããå Žåã¯ãã³ãŒããæ©èœããããšã確èªã§ããŸãããã¡ãããé©åã«äœæããå Žåã¯ããã§ããããç ããããã¯éåžžã«éèŠã§ãã
- . . , , , . , . , .
, - , â , - . , . , , . , , , git blame, , , , . - . , . , . , , . - - , - - . , , , . - .
- , . ? , , , , : , . 500 -, . . .
- : â . , , . , , .
, , , . , , . - . â , . , , . , .
: - . , , . , , , - , .
ããã§ããã¹ãã®çš®é¡ã®åé¡ã«ã€ããŠå°ãã話ããããšæããŸãããããã¯ãããããããŸããã»ãã®å°ãã ãèšåããŸãã
ãã¹ãããã»ã¹ã¯ããã©ãã¯ããã¯ã¹ãã¹ãããã¯ã€ããã¹ããã°ã¬ãŒãã¹ãã«åããããŸãã
ãã©ãã¯ããã¯ã¹ãã¹ãã¯ããã¹ã¿ãŒãå éšã®å 容ã«ã€ããŠäœãç¥ããªãå Žåã®ããã»ã¹ã§ãã圌ã¯ãæ®éã®ãŠãŒã¶ãŒã®ããã«ãå®è£ ã®è©³çްãç¥ããªããŠãäœããããŸãã
ãã¯ã€ãããã¯ã¹ãã¹ããšã¯ããã¹ã¿ãŒããœãŒã¹ã³ãŒããå«ãå¿ èŠãªæ å ±ã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸããèªåã®ã³ãŒãã§ãã¹ããæžããšããç§ãã¡ã¯ãã®ãããªç¶æ³ã«ãããŸãã
ã°ã¬ãŒããã¯ã¹ãã¹ãã¯ãã®äžéã§ããããã¯ãå®è£ ã®è©³çްãããã€ãç¥ã£ãŠãããããã¹ãŠãç¥ã£ãŠããããã§ã¯ãªãå Žåã§ãã
ãŸãããã¹ãããã»ã¹ã¯ãæåãåèªåãããã³èªåã«åããããšãã§ããŸããæåãã¹ãã¯äººãè¡ããŸãã圌ããã©ãŠã¶ã®ãã¿ã³ãã¯ãªãã¯ããã©ãããã¯ãªãã¯ããäœãå£ããŠããããäœãå£ããŠããªããã確èªãããšããŸããåèªåãã¹ããšã¯ããã¹ã¿ãŒããã¹ãã¹ã¯ãªãããå®è¡ããããšã§ãããã¹ããããŒã«ã«ã§å®è¡ããå Žåããã®ãããªç¶æ³ã«ãããšèšããŸããèªåãã¹ãã«ã¯äººéã®åå ã¯å«ãŸããŸããããã¹ãã¯æåã§ã¯ãªãèªåçã«å®è¡ããå¿ èŠããããŸãã
ãŸãããã¹ãã¯è©³çްã¬ãã«ã§åå²ã§ããŸããããã§ã¯éåžžããŠããããã¹ããšçµ±åãã¹ãã«åããããŸããäžäžèŽãããå¯èœæ§ããããŸããèªåãã¹ãããŠããããã¹ããšåŒã¶äººãããŸããããããããå€å žçãªåºåã¯ãã®ãããªãã®ã§ãã
ãŠããããã¹ãã¯ã·ã¹ãã ã®åã ã®ã³ã³ããŒãã³ãã®åäœããã§ãã¯ããçµ±åãã¹ãã¯ããã€ãã®ã¢ãžã¥ãŒã«ã®ãã³ãã«ããã§ãã¯ããŸããã·ã¹ãã å šäœã®åäœããã§ãã¯ããã·ã¹ãã ãã¹ãããããŸããããããããã¯çµ±åãã¹ãã®å€§ããªå€çš®ã®ããã§ãã
ç§ãã¡ã®ã³ãŒãã®ãã¹ãã¯ããŠããããã¹ããšçµ±åãã¹ãã§ããçµ±åãã¹ãã ããæžãã¹ãã ãšä¿¡ããŠãã人ãããŸããç§ã¯ãã®äžäººã§ã¯ãããŸããããã¹ãŠãé©åºŠã«è¡ãå¿ èŠããããšæããŸãã1ã€ã®ã³ã³ããŒãã³ãããã¹ãããå Žåã®ãŠããããã¹ããšã倧ããªãã®ããã¹ãããå Žåã®çµ±åãã¹ãã®äž¡æ¹ã圹ç«ã¡ãŸãã
ãªãããæãã®ã§ããïŒãŠããããã¹ãã¯éåžžââããé«éã ããã§ããäœãã埮調æŽããå¿ èŠãããå Žåãããã¹ãã®å®è¡ããã¿ã³ãã¯ãªãã¯ããŠãããããŒã¿ããŒã¹ãéå§ãããç§»è¡ãè¡ããããŸã§3åéåŸ ã€ãšãéåžžã«ã€ã©ã€ã©ããŸããäœãå¥ã®ããšãèµ·ãããŸãããã®ãããªå ŽåããŠããããã¹ãã圹ç«ã¡ãŸãããããã¯ãäžåºŠã«1ã€ãã€å®è¡ããŠããã°ãã䟿å©ã«å®è¡ã§ããŸãããããããŠããããã¹ããä¿®æ£ããããçµ±åãã¹ããä¿®æ£ããŸãããã
çµ±åãã¹ããéåžžã«å¿ èŠãªãã®ã§ãã倧ããªãã©ã¹ã¯ãããããã·ã¹ãã ã«é¢ãããã®ã§ãããšããããšã§ãããã1ã€ã®å€§ããªå©ç¹ã¯ãã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã«å¯Ÿããèæ§ãé«ãããšã§ããå°ããªé¢æ°ãæžãçŽãå¯èœæ§ãé«ãå Žåã¯ããã€ãã©ã€ã³å šäœãåãé »åºŠã§å€æŽããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
ããã«å€ãã®ç°ãªãåé¡ããããŸããç§ãããã«æžããããšãããã«èª¬æããŸããã詳现ã«ã¯è§ŠããŸããããããã¯ã©ããã§èãããšãã§ããèšèã§ãã
ç ãã¹ãã¯éèŠãªæ©èœã®ãã¹ãã§ãããæåã§æãåçŽãªãã¹ãã§ããããããå£ããå Žåããã¹ãããå¿ èŠã¯ãããŸããããä¿®æ£ããå¿ èŠããããŸããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã¯ã©ãã·ã¥ããªãã£ããšããŸãããããã°ããããã¹ã¢ãŒã¯ãã¹ãã«åæ ŒããŸããã
ååž°ãã¹ãããããŸã-å€ãæ©èœã®ãã¹ããæ°ãããªãªãŒã¹ãããŒã«ããå€ããªãªãŒã¹ã§äœãå£ããŠããªãããšã確èªããå¿ èŠããããšããŸããããã¯ååž°ãã¹ãã®ã¿ã¹ã¯ã§ãã
äºææ§ãã¹ããã€ã³ã¹ããŒã«ãã¹ãããããŸãã圌ãã¯ãããŸããŸãªOSãšããŸããŸãªOSããŒãžã§ã³ãããŸããŸãªãã©ãŠã¶ãšããŸããŸãªãã©ãŠã¶ããŒãžã§ã³ã§ããã¹ãŠãæ£ããæ©èœããããšã確èªããŸãã
åãå ¥ããã¹ãã¯åãå ¥ããã¹ãã§ããç§ã¯ãã§ã«ãããã«ã€ããŠè©±ããŸããã圌ãã¯ããªãã®å€æŽãæ¬çªç°å¢ã«ããŒã«ã€ã³ã§ãããã©ããã«ã€ããŠè©±ããŸãã
ã¢ã«ãã¡ãã¹ããšããŒã¿ãã¹ãããããŸãããããã®æŠå¿µã¯ã©ã¡ããã補åã«é¢é£ããŠããŸããéåžžããªãªãŒã¹ã®æºåãã§ããŠããããŒãžã§ã³ãå€ããå°ãªãããããããã¹ãŠãããã§ä¿®æ£ãããŠããããã§ã¯ãªãå Žåã¯ãæ¡ä»¶ä»ãã§å€éšã®äººã ããŸãã¯å€éšã®äººã ããã©ã³ãã£ã¢ã«ãããæž¡ããŠããã°ãèŠã€ããŠå ±åããéåžžã«åªããããŒãžã§ã³ããªãªãŒã¹ã§ããããã«ããããšãã§ããŸããã¢ã«ãã¡çã®å®æåºŠãäœãã»ã©ãããŒã¿çã®å®æåºŠã¯é«ããªããŸããããŒã¿ãã¹ãã§ã¯ãã»ãšãã©ãã¹ãŠãä»ã§ã¯åé¡ãªãã¯ãã§ãã
次ã«ãããã©ãŒãã³ã¹ãã¹ããšã¹ãã¬ã¹ãã¹ããè² è·ãã¹ãããããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ãè² è·ãã©ã®ããã«åŠçããŠãããããã§ãã¯ããŸããããã€ãã®ã³ãŒãããããŸãããŠãŒã¶ãŒæ°ããªã¯ãšã¹ãæ°ãRPSã1ç§ãããã®ãªã¯ãšã¹ãæ°ãèšç®ããŸãããç§ãã¡ã¯ãã®ç¶æ³ãã·ãã¥ã¬ãŒãããç«ã¡äžããèŠãŸãã-ããã¯æãç«ã¡ãŸãããæãç«ã¡ãŸããããããæãç«ããªãå Žåã¯ã次ã«äœããã¹ãããèããŠãã ããããããããã³ãŒããæé©åããããããŒããŠã§ã¢ã®éãå¢ããããã«ãããŸããŸãªãœãªã¥ãŒã·ã§ã³ããããŸãã
ã¹ãã¬ã¹ãã¹ãã¯ã»ãŒåãã§ãããè² è·ãäºæ³ãããé«ãã ãã§ããããã©ãŒãã³ã¹ãã¹ãã§æåŸ ããã¬ãã«ã®è² è·ãåŸãããå Žåãã¹ãã¬ã¹ãã¹ãã§ã¯ãè² è·ãå£ãããŸã§è² è·ãå¢ããããšãã§ããŸãã
ãªã³ã¿ãŒã¯ããã§å¥ã ã«ç«ã£ãŠããŸãããªã³ã¿ãŒã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãããããã¯ã³ãŒããã©ãŒããããã¹ãã§ãããã¹ã¿ã€ã«ã¬ã€ãã§ãã Pythonã§ã¯ã誰ããåŸãã¹ãç°¡åãªã¹ã¿ã€ã«ã¬ã€ãã§ããPEP8ããããŸãããããŠãããªããäœããæžããšããããªãã¯éåžžãã³ãŒãã«åŸãã®ãé£ããããšã«æ°ã¥ããŸãã空ã®è¡ãå ¥åããã®ãå¿ãããäœåãªè¡ãäœæããããŸãã¯é·ãããè¡ãæ®ãããšããŸããã³ãŒããåãã¹ã¿ã€ã«ã§æžãããŠããããšã«æ £ããŠããã®ã§ãéªéã«ãªããŸãããªã³ã¿ãŒã䜿çšãããšããã®ãããªãã®ãèªåçã«ãã£ããã§ããŸãã
çè«ããã¹ãŠãããããç§ã¯Pythonã«äœããããã«ã€ããŠè©±ããŸãã
ãããããã€ãã®ã©ã€ãã©ãªã®ãªã¹ãã§ããããããã¹ãŠã«ã€ããŠã¯è©³ãã説æããŸããããã»ãšãã©ã«ã€ããŠã¯èª¬æããŸãããã¡ãããunittestãšpytestã«ã€ããŠã説æããŸãããããã¯ããã¹ãã®äœæã«çŽæ¥äœ¿çšãããã©ã€ãã©ãªã§ãã Mockã¯ãã¢ãã¯ãªããžã§ã¯ããäœæããããã®ãã«ããŒã©ã€ãã©ãªã§ãã圌女ã«ã€ããŠã話ããŸãã doctestã¯ããã¥ã¡ã³ãããã¹ãããããã®ã¢ãžã¥ãŒã«ã§ãããflake8ã¯ãªã³ã¿ãŒã§ãããããã«ã€ããŠã説æããŸãããã©ããšããã¯ã¹ã«ã€ããŠã¯è©±ããŸãããããªããèå³ãæã£ãŠãããªããããªãã¯ããªãèªèº«ã®ããã«èŠãããšãã§ããŸãããã©ãã¯ãªã³ã¿ãŒã§ããããã¡ã¿ã«ã€ã³ã¿ãŒã§ããããããã€ãã®ããã±ãŒãžãçµã¿åãããŠãããéåžžã«äŸ¿å©ã§åªããŠããŸãããŸããããŸããŸãªç°å¢ã§ã³ãŒãããã¹ãããå¿ èŠãããå Žåãããšãã°ãããŸããŸãªããŒãžã§ã³ã®PythonãããŸããŸãªããŒãžã§ã³ã®ã©ã€ãã©ãªã䜿çšããŠãtoxã©ã€ãã©ãªãå¿ èŠã«ãªããŸãã Toxã¯ãã®æå³ã§å€§ãã«åœ¹ç«ã¡ãŸãã
ããããããŸããŸãªã©ã€ãã©ãªã«ã€ããŠè©±ãåã«ãç§ã¯é³è ãããå§ããŸããã³ãŒãã§assertãèªç±ã«äœ¿çšããŠãã ãããããã¯æ®å¿µã§ã¯ãããŸãããå€ãã®å Žåãäœãèµ·ãã£ãŠããã®ããçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
éåžžã®çµ±èšãèšç®ãã颿°ããããšãããšã2ã€ã®ã¢ãµãŒããæžã蟌ãŸããŸããã¢ãµãŒãã¯ãã³ãŒãã«å«ããã¹ãã§ã¯ãªãå®å šã«æ¥µç«¯ãªãã³ã»ã³ã¹ã§ããå Žåã«ã颿°ã§èšè¿°ããå¿ èŠããããŸãããããã¯éåžžã«æ¥µç«¯ãªã±ãŒã¹ã§ãããã»ãšãã©ã®å Žåãæ¬çªç°å¢ã§ãããã«ééããããšãããããŸãããã€ãŸããã³ãŒããå°ç¡ãã«ãããšããã¹ãã§å€±æããå¯èœæ§ãé«ããªããŸãã
ã¢ãµãŒãã¯ããããã¿ã€ãã³ã°ãè¡ã£ãŠãããšãã«åœ¹ç«ã¡ãŸãã補åã³ãŒãã¯ãŸã ãããŸãããåŒã³åºããã颿°ã®ã©ãã«ããŠããã©ãã«ã§ãã¢ãµãŒããåºå®ã§ããŸããããã¯æ·±å»ãªãããžã§ã¯ãã«ã¯é©ããŠããŸãããããããã¿ã€ãã³ã°ã®æ®µéã§ã¯ããªãè¯ãã§ãã
ãªãããã®çç±ã§assertãç¡å¹ã«ãããå ŽåãèããŠã¿ãŸããããããšãã°ãæ¬çªç°å¢ã§ã¯æ±ºããŠèµ·åããªãããã«ããŸãã Pythonã«ã¯ããã®ããã®ç¹å¥ãªãªãã·ã§ã³ããããŸãã
doctestãšã¯äœããã話ãããŸããããã¯ã¢ãžã¥ãŒã«ã§ãããããã¥ã¡ã³ãããã¹ãããããã®Pythonæšæºã©ã€ãã©ãªã§ãããªãã§ããã®ïŒã³ãŒãã§æžãããããã¥ã¡ã³ãã¯é »ç¹ã«å£ããã¡ã§ããããã«ã¯éåžžã«å°ããªããã¡ãã®æ©èœãããããã¹ãŠãèŠãããšãã§ããŸãããããã倧ããªã³ãŒããšå€ãã®ãã©ã¡ãŒã¿ãŒããããæåŸã«äœãã远å ããå Žåãéåžžã«é«ã確çã§docstringãä¿®æ£ããã®ãå¿ããŠããŸããŸãã Doctestã¯ãããã®ããšãåé¿ããŸããäœããä¿®æ£ããããã§æŽæ°ãããdoctestãå®è¡ãããšãã¯ã©ãã·ã¥ããŸããã§ããããããªãã¯èªåãäœãèšæ£ããªãã£ãããæ£ç¢ºã«èŠããŠããŸãã
ããã¯ã©ã®ããã«èŠããŸããïŒ Doctestã¯ãdocstringã§ãããã®ã¯ãªã¹ãã¹ããªãŒãæ¢ããããããå®è¡ããŠãååŸãããã®ãæ¯èŒããŸãã
doctestã®å®è¡äŸã次ã«ç€ºããŸããç§ãã¡ã¯ãããç«ã¡äžããŸãããç§ãã¡ã¯2ã€ã®ãã¹ããããããã®ãã¡ã®1ã€ãå®å šã«ã±ãŒã¹ã«èœã¡ãããšãããããŸãããã°ããããæç¢ºãªãšã©ãŒæ å ±ãããã€ãèŠãããŸããã
ã¹ã©ã€ãããã®ãªã³ã¯
doctestã«ã¯ã圹ç«ã€å¯èœæ§ã®ããããã€ãã®åœ¹ç«ã€ãã£ã¬ã¯ãã£ãããããŸããããããã¹ãŠã«ã€ããŠè©±ãããã§ã¯ãããŸããããç§ã«ãšã£ãŠæãäžè¬çã§ãããšæããããã®ãã¹ã©ã€ãã«èŒããŸããã SKIPãã£ã¬ã¯ãã£ãã䜿çšãããšãããŒã¯ãããäŸã§ãã¹ããå®è¡ããªãããšãã§ããŸãã IGNORE_EXCEPTION_DETAILãã£ã¬ã¯ãã£ãã¯ãEXCEPTIONãã¹ããç¡èŠããŸãã ELLIPSISã䜿çšãããšãåºåã®ã©ãã«ã§ããšãªãã·ã¹ãæžã蟌ãããšãã§ããŸãã FAIL_FASTã¯ãæåã«å€±æãããã¹ãã®åŸã§åæ¢ããŸããä»ã®ãã¹ãŠã¯ããã¥ã¡ã³ãã§èªãããšãã§ããŸãããããããããŸããäŸãæããŠãèŠãããã»ããããã§ãã
ãã®äŸã«ã¯ãELLIPSISãã£ã¬ã¯ãã£ããšIGNORE_EXCEPTION_DETAILãã£ã¬ã¯ãã£ãããããŸãã ELLIPSISãã£ã¬ã¯ãã£ãã«Kçªç®ã®é åºçµ±èšã衚瀺ãããŸãã9ã§å§ãŸã9ã§çµããäœããæ¥ããšäºæ³ãããŸããçãäžã«äœããããå¯èœæ§ããããŸãããã®ãããªãã¹ãã¯å€±æããŸããã
以äžã¯IGNORE_EXCEPTION_DETAILãã£ã¬ã¯ãã£ãã§ãããAssertionErrorã§çºçãããã®ã®ã¿ããã§ãã¯ããŸããã»ããããã«äœãšãäœãšãäœãšãæžããããã¹ãã¯åæ Œããæåã®åŒæ°ãšããŠäºæ³ãããå埩å¯èœãšäœãšãäœãšãäœãšããæ¯èŒããŸããã AssertionErrorãAssertionErrorãšæ¯èŒããã ãã§ãããããã¯ããªãã䜿ãããšãã§ãã䟿å©ãªãã®ã§ãã
次ã«ãèšç»ã¯æ¬¡ã®ãšããã§ããunittestã«ã€ããŠèª¬æããæ¬¡ã«pytestã«ã€ããŠèª¬æããŸãããããæšæºã©ã€ãã©ãªã®äžéšã§ããããšãé€ããŠãç§ã¯ããããunittestã®é·æãç¥ããªããšããã«èšããŸããçŸåšãunittestã䜿çšããããåŸãªãç¶æ³ã¯èŠåœãããŸãããããããããã䜿çšãããããžã§ã¯ãããããŸãããããã«ãããæ§æãã©ã®ããã«èŠãããããããŠãããäœã§ããããç¥ãããšã¯æçšã§ãã
ãã1ã€ã®ãã€ã³ãïŒunittestã§èšè¿°ããããã¹ãã¯ãç®±ããåºããŠããã«pytestãå®è¡ããæ¹æ³ãç¥ã£ãŠããŸããåœŒã¯æ°ã«ããªãã ïŒâŠïŒ
Unittestã¯ãããªæãããã¹ããšããèšèã§å§ãŸãã¯ã©ã¹ããããŸããå éšã§ã¯ãåèªãã¹ãã§å§ãŸã颿°ããã¹ãã¯ã©ã¹ã¯unittest.TestCaseããç¶æ¿ããŸããããã§ã®1ã€ã®ãã¹ãã¯æ£ããèšè¿°ãããŠãããå¥ã®ãã¹ãã¯æ£ãããªãããšãããã«èšããªããã°ãªããŸããã
éåžžã®ã¢ãµãŒããæžã蟌ãŸããäžçªäžã®ãã¹ãã¯å€±æããŸãããå¥åŠã«èŠããŸããèŠãŠã¿ãŸãããã
ã³ãã³ããéå§ããŸãã unittest mainã¯ã³ãŒãèªäœã«èšè¿°ã§ããPythonããåŒã³åºãããšãã§ããŸãã
ãã®ãã¹ããå®è¡ãããšãããAssertionErrorãæžã蟌ãŸããããšãããããŸããããself.assertEqualã䜿çšããæ¬¡ã®ãã¹ããšã¯ç°ãªããã©ãã«èœã¡ããã¯æžã蟌ãŸããŸããã§ãããããã«æç¢ºã«æžãããŠããŸãïŒ3ã¯2ãšçãããããŸããã
ãã¡ãããä¿®çããå¿ èŠããããŸãããããããã®éæ³ã®åºåã¯ç»é¢ã«è¡šç€ºãããŸããã§ããã
ããäžåºŠèŠãŠã¿ãŸããããæåã®ã±ãŒã¹ã§ã¯ãassertãèšè¿°ãã2çªç®ã®ã±ãŒã¹ã§ã¯self.assertEqualãèšè¿°ããŸãããæ®å¿µãªããããããunittestã®å¯äžã®æ¹æ³ã§ããç¹å¥ãªé¢æ°ããããŸã-self.assertEqualãself.assertnotEqualãããã³é©åãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããå Žåã«äœ¿çšããå¿ èŠããã100,500以äžã®é¢æ°ã
ãªããããèµ·ããã®ã§ããïŒ assertã¯boolãšãå Žåã«ãã£ãŠã¯æååãåãåãã¹ããŒãã¡ã³ãã§ããããã®å Žåã¯boolã§ãããããŠã圌ã¯èªåãæ£ãããééã£ãŠããããèŠãŠãå·ŠåŽãšå³åŽããšãå ŽæããããŸããããããã£ãŠãunittestã«ã¯ããšã©ãŒã¡ãã»ãŒãžãæ£ãã衚瀺ããç¹å¥ãªæ©èœããããŸãã
ããã¯ç§ã®æèŠã§ã¯ããŸã䟿å©ã§ã¯ãããŸãããããæ£ç¢ºã«ã¯ããããã¯ãã®ã©ã€ãã©ãªã«ã®ã¿ååšããããã€ãã®ç¹å¥ãªã¡ãœããã§ããããããŸã£ãã䟿å©ã§ã¯ãããŸããããããã¯ãç§ãã¡ãéåžžã®èšèªã§æ £ããŠãããã®ãšã¯ç°ãªããŸãã
ãããèŠããŠããå¿ èŠã¯ãããŸãããpytestã«ã€ããŠã¯åŸã§èª¬æããŸããã»ãšãã©ã®å Žåãããã«æžã蟌ãã§ããã ããã°å¹žãã§ãã Unittestã«ã¯ãäœãããã¹ãããŠé©åãªãšã©ãŒã¡ãã»ãŒãžãååŸãããå Žåã«äœ¿çšããæ©èœã®åç©åããããŸãã
次ã«ãunittestã§ãã£ã¯ã¹ãã£ãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããããããããããããã«ãç§ã¯æåã«ããªãã«ååãäœã§ããããèšãå¿ èŠããããŸãããããã¯ããã¹ãã®å®è¡åãŸãã¯å®è¡åŸã«åŒã³åºããã颿°ã§ãããã¹ãã§ç¹å¥ãªèšå®ãå®è¡ããå¿ èŠãããå Žåã«å¿ èŠã§ãããã¹ãåŸã«äžæãã¡ã€ã«ãäœæããäžæãã¡ã€ã«ãåé€ããŸããããŒã¿ããŒã¹ãäœæããããŒã¿ããŒã¹ãåé€ããŸããããŒã¿ããŒã¹ãäœæããããã«äœããæžã蟌ã¿ãŸããäžè¬çã«ãäœã§ãã unittestã§ã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã
Unittestã«ã¯ããã£ã¯ã¹ãã£ãäœæããããã®ç¹å¥ãªã¡ãœããsetUpããã³tearDownããããŸãããªããŸã PEP8ã«åŸã£ãŠæžãããŠããªãã®ããç§ã«ã¯å€§ããªè¬ã§ãã ïŒ...ïŒ
SetUpã¯ãã¹ãã®åã«è¡ãããããšã§ãããtearDownã¯ãã¹ãã®åŸã«è¡ãããããšã§ããããã¯éåžžã«äžäŸ¿ãªãã¶ã€ã³ã®ããã§ããã©ãããŠïŒãªããªãã第äžã«ãç§ã®æã¯ãããã®ååãæžãããã«ç«ã¡äžãããªãããã§ããç§ã¯ãã§ã«PEP8ããŸã ããäžçã«äœãã§ããŸããæ¬¡ã«ããã¹ãèªäœã®åŒæ°ã«äœãå«ãŸããŠããªãäžæãã¡ã€ã«ããããŸãã圌ã¯ã©ãããæ¥ãã®ã§ããïŒãªããããååšããã®ãããããŠãããäœã§ããã®ãã¯ããŸãæç¢ºã§ã¯ãããŸããã
ç»é¢ã«ããã¿ã€ãå°ããªã¯ã©ã¹ããããšããã£ãããã§ããäžèŠããŠãã£ããã£ã§ããŸãããããŠãããªãããã®å·šå€§ãªã·ãŒããæã£ãŠãããšããããªãã¯ãããäœã§ãã£ããããããŠãªã圌ããã®ããã§ããã®ãããªã圌ããã®ããã«æ¯ãèãã®ããæ¢ãããã«èŠãããããŸãã
unittestã®ãã£ã¯ã¹ãã£ã«ã¯ãããã»ã©äŸ¿å©ã§ã¯ãªãæ©èœããã1ã€ãããŸããäžæãã¡ã€ã«ãå¿ èŠãšãã1ã€ã®ãã¹ãã¯ã©ã¹ãšãããŒã¿ããŒã¹ãå¿ èŠãšããå¥ã®ãã¹ãã¯ã©ã¹ããããšããŸããåªããã 1ã€ã®ã¯ã©ã¹ãäœæããsetUpãtearDownãå®è¡ããäžæãã¡ã€ã«ãäœæ/åé€ããŸãããå¥ã®ã¯ã©ã¹ãäœæãããã®äžã«setUpãtearDownãäœæãããã®äžã«ããŒã¿ããŒã¹ãäœæ/åé€ããŸããã
質åãäž¡æ¹ãå¿ èŠãšãããã¹ãã®3çªç®ã®ã°ã«ãŒãããããŸãããããã©ããããïŒ 2ã€ã®éžæè¢ããããŸãããŸãã¯ãã³ãŒããã³ããŒããŠè²Œãä»ããŸãããããŸã䟿å©ã§ã¯ãããŸããããŸãã¯ãæ°ããã¯ã©ã¹ãäœæããåã®2ã€ããç¶æ¿ããŠãsuperãåŒã³åºããŸããäžè¬çã«ããããæ©èœããŸããããã¹ãã§ã¯å€§ãããªããéãã®ããã«èŠããŸãã
ãããã£ãŠãçè«çãªã¬ãã«ã§ã¯ãunittestã«ã€ããŠã®ç¥èããã®ãŸãŸã«ããŠããå¿ èŠããããŸããæ¬¡ã«ããã¹ããäœæããããã®ãã䟿å©ãªæ¹æ³ããã䟿å©ãªã©ã€ãã©ãªã«ã€ããŠèª¬æããŸããããã¯pytestã§ãã
ãŸããpytestã䟿å©ãªçç±ãã話ãããŸãã
ã¹ã©ã€ãããã®ãªã³ã¯
æåã®ãã€ã³ãïŒpytestã§ã¯ãã¢ãµãŒãã¯éåžžã¯æ©èœããæ £ããŠãããã®ã§ãããéåžžã®ãšã©ãŒæ å ±ãæäŸããŸãã第äºã«ãpytestã®åªããããã¥ã¡ã³ãããããŸããããã§ã¯ã倿°ã®äŸãåè§£ãããå¿ èŠãªãã®ã¯ãã¹ãŠãçè§£ã§ããªããã®ãã¹ãŠã衚瀺ã§ããŸãã
第äžã«ããã¹ãã¯test_ã§å§ãŸã颿°ã«ãããŸãããã€ãŸãã远å ã®ã¯ã©ã¹ã¯å¿ èŠãããŸãããéåžžã®é¢æ°ãèšè¿°ãããããtest_ãšåŒã¶ã ãã§ãpytestãä»ããŠå®è¡ãããŸããããã¯ããã¹ããäœæããã®ãç°¡åã§ããã»ã©ãã¹ã³ã¢ãä»ããããããã¹ããäœæããå¯èœæ§ãé«ããªãããã䟿å©ã§ãã
Pytestã«ã¯äŸ¿å©ãªæ©èœããããããããŸãããã©ã¡ãŒã¿åããããã¹ããäœæã§ããŸããããŸããŸãªã¬ãã«ã®ãã£ã¯ã¹ãã£ãäœæãããšäŸ¿å©ã§ãããŸããxfailãraiseãskipãªã©ã®äŸ¿å©ãªæ©èœãããã€ããããŸãã pytestã«ã¯å€ãã®ãã©ã°ã€ã³ããããããã«ç¬èªã®ãã©ã°ã€ã³ãäœæããããšãã§ããŸãã
äŸãèŠãŠã¿ãŸããããããã¯ãpytestã§èšè¿°ããããã¹ããã©ã®ããã«èŠãããã§ããæå³ã¯unittestãšåãã§ãããèŠãç®ãã¯ããã«ç°¡æœã§ããæåã®ãã¹ãã¯éåžžââ2è¡ã§ãã
ã³ãã³ãpython-mpytestãå®è¡ããŸããåªããã 2ã€ã®ãã¹ãã«åæ ŒããŸããããã¹ãŠåé¡ãããŸãããäœã«ããã€åæ Œãããã確èªã§ããŸãã
ããã§ã¯ã1ã€ã®ãã¹ããäžæããŠããšã©ãŒã«é¢ããæ å ±ãåŸãããããã«ããŸããã¢ãµãŒã3 == 2ããã³ãšã©ãŒãåºåããŸããã€ãŸããéåžžã®assertãèšè¿°ããã«ããããããããšã©ãŒã«é¢ããæ å ±ãæ£ãã衚瀺ããŸãããããã®åã«unittestã§ãassertã¯æååãŸãã¯boolã®boolãåãå ¥ãããšè¿°ã¹ãããããšã©ãŒã«é¢ããæ å ±ã衚瀺ããã®ã¯åé¡ããããŸãã
ãªãããããã¹ãŠæ©èœããã®ãäžæè°ã«æããããããŸããã pytestã§ã圌ãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®éãéšåã詊ããŠæŽçããããã§ãã Pytestã¯æåã«ã³ãŒããè§£æããããã¯äžçš®ã®ããªãŒæ§é ãæœè±¡çãªæ§æããªãŒãšããŠè¡šç€ºãããŸãããã®æ§é ã§ã¯ãé ç¹ã«æŒç®åããããèã«ãªãã©ã³ãããããŸããã¢ãµãŒãã¯æŒç®åã§ããããã¯ããªãŒã®æäžéšã«ãããçŸæç¹ã§ã¯ããã¹ãŠãã€ã³ã¿ãŒããªã¿ãŒã«æž¡ãåã«ããã®ã¢ãµãŒãããã€ã³ããã¹ãã¯ã·ã§ã³ãå®è¡ããå·ŠåŽãšå³åŽã«ãããã®ãçè§£ããå éšé¢æ°ã«çœ®ãæããããšãã§ããŸããå®éãããã¯ãã§ã«ã€ã³ã¿ãŒããªã¿ãŒã«äŸçµŠãããŠãããassertã眮ãæããããŠããŸãã
詳现ã«ã¯ç«ã¡å ¥ããŸããããªã³ã¯ããããŸãããã®äžã§ããªãã¯åœŒãããããã©ã®ããã«ããããèªãããšãã§ããŸããããããç§ã¯ããããã¹ãŠå éšã§æ©èœããããšãæããŠããŸãããŠãŒã¶ãŒã«ã¯è¡šç€ºãããŸããã圌ã¯ãåœŒãæ £ããŠããããã«ãã©ã€ãã©ãªèªäœãæ®ããè¡ããšäž»åŒµããŸããããªããããã«ã€ããŠèããå¿ èŠã¯ãããŸããã
ããã«ãæšæºã¿ã€ãã®pytestã§ã¯ããšã«ããé©åãªãšã©ãŒæ å ±ãåŸãããŸãã pytestã¯ãã®ãšã©ãŒæ å ±ã衚瀺ããæ¹æ³ãç¥ã£ãŠããããã§ãããã ãããã¹ãã§ã«ã¹ã¿ã ããŒã¿ã¿ã€ããæ¯èŒããããšã¯ã§ããŸããããšãã°ãããªãŒãè€éãªãã®ãªã©ã§ããpytestã¯ããããã®ãšã©ãŒæ å ±ã衚瀺ããæ¹æ³ãç¥ããªãå ŽåããããŸãããã®ãããªå Žåã¯ãç¹å¥ãªããã¯ã远å ã§ããŸãïŒããã«ããã¥ã¡ã³ãã®ã»ã¯ã·ã§ã³ããããŸãïŒããã®ããã¯ã«ããšã©ãŒæ å ±ãã©ã®ããã«è¡šç€ºãããããèšè¿°ããŸãããã¹ãŠãéåžžã«æè»ã§äŸ¿å©ã§ãã
pytestã§ãã£ã¯ã¹ãã£ãã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã unittestã§setUpãštearDownãèšè¿°ããå¿ èŠãããå Žåã¯ãããã§éåžžã®é¢æ°ã奜ããªããã«åŒã³åºããŸãã pytest.fixtureãã³ã¬ãŒã¿ãäžçªäžã«æžããŸãã-çŽ æŽããããããã¯ãã£ã¯ã¹ãã£ã§ãã
ãããŠãããã¯æãåçŽãªäŸã§ã¯ãããŸããããã£ã¯ã¹ãã£ã¯åã«ãªã¿ãŒã³ãå®è¡ããäœããè¿ãããšãã§ããŸããããã¯setUpã«é¡äŒŒããŠããŸãããã®å Žåãäžçš®ã®ãã£ã¢ããŠã³ãçºçããŸããã€ãŸããããã§ããã¹ãã®çµäºåŸã«closeãåŒã³åºãããäžæãã¡ã€ã«ãåé€ãããŸãã
䟿å©ããã§ãã奜ããªååãä»ããããšãã§ããä»»æã®é¢æ°ããããŸããæç€ºçã«ãã¹ãã«åæ ŒããŸããæž¡ãããfilled_fileãããªãã¯ãããäœã§ããããç¥ã£ãŠããŸããç¹å¥ãªããšã¯äœãå¿ èŠãããŸãããäžè¬çã«ã¯äœ¿çšããŠãã ãããããã¯ãunittestãããã¯ããã«äŸ¿å©ã§ãã
ãã£ã¯ã¹ãã£ã«ã€ããŠããå°ãã pytestã§ã¯ãããŸããŸãªã¹ã³ãŒãã®ãã£ã¯ã¹ãã£ãäœæããã®ã¯éåžžã«ç°¡åã§ããããã©ã«ãã§ã¯ããã£ã¯ã¹ãã£ã¯æ©èœã¬ãã«ã§äœæãããŸããããã¯ãåæ Œãããã¹ãŠã®ãã¹ãã§åŒã³åºãããããšãæå³ããŸããã€ãŸããyieldãŸãã¯tearDownã®ãããªãã®ãããå Žåãããã¯åãã¹ãã®åŸã«ãçºçããŸãã
scope = 'module'ã宣èšãããšããã£ã¯ã¹ãã£ã¯ã¢ãžã¥ãŒã«ããšã«1åå®è¡ãããŸããããŒã¿ããŒã¹ãäžåºŠäœæããåãã¹ãã®åŸã«ãã¹ãŠã®ç§»è¡ãããããã¢ã³ãããŒã«ããããªããšããŸãã
ãŸãããã£ã¯ã¹ãã£ã§ã¯autouse = TrueåŒæ°ãæå®ããããšãã§ããèŠæ±ãããã©ããã«é¢ä¿ãªããã£ã¯ã¹ãã£ãåŒã³åºãããŸãããã®ãªãã·ã§ã³ã¯æé»çãªãã®ã§ããããã絶察ã«äœ¿çšããªãã§ãã ããããŸãã¯äœ¿çšããå¿ èŠããããŸãããéåžžã«æ³šæããŠãã ãããæé»çãªãã®ã¯é¿ããã®ãæåã§ãã
ãã®ã³ãŒããå®è¡ããŸãã-äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããããã£ã¯ã¹ãã£ã«äŸåãããã¹ãã®ãã®ããããŸããå¿ èŠã«å¿ããŠäžåºŠäœ¿çšãããšãæ¯åé»è©±ããŠãã ãããåæã«ãã¢ãžã¥ãŒã«ã¬ãã«ã®ãã£ã¯ã¹ãã£ãå¿ èŠãªãšãã«äœ¿çšããããç§ã«é»è©±ããŠãã ãããåããŠãã£ã¯ã¹ãã£ãåŒã³åºãããšãã¯ãå¿ èŠã«å¿ããŠäžåºŠäœ¿çšãããšãæ¯åé»è©±ããããŠåºåããŸãããèªå䜿çšã®ãã£ã¯ã¹ãã£ãåŒã³åºãããŸãããæ°ã«ããªããããåžžã«åŒã³åºãããŸãã
2çªç®ã®ãã¹ãã¯ãåããã£ã¯ã¹ãã£ã«äŸåããŸããã¢ãžã¥ãŒã«ã¬ãã«ã§ãããããå¿ èŠãªãšãã«äžåºŠäœ¿çšãããš2åç®ã«åŒã³åºããšããã§ã«1ååŒã³åºãããŠãããå床åŒã³åºãããããšã¯ãããŸããã
ããã«ããã®äŸããããããã¹ãã§ã¯ããŒã¿ããŒã¹ãå¿ èŠãªå Žåãå¥ã®ãã¹ãã§ã¯äžæãã¡ã€ã«ãå¿ èŠãªå Žåã«ãpytestã«ã¯unittestã§èª¬æãããããªåé¡ããªãããšãããããŸããããããéåžžã©ã®ããã«éçŽãããã¯æç¢ºã§ã¯ãããŸããããããpytestã§ã®ãã®è³ªåãžã®çãã§ãã 2ã€ã®åšå ·ãæž¡ãããå Žåãå éšã«2ã€ã®åšå ·ããããŸãã
çŽ æŽãããããšãŠãå¿«é©ã§ãåé¡ãããŸããããã£ã¯ã¹ãã£ã¯éåžžã«æè»æ§ããããä»ã®ãã£ã¯ã¹ãã£ã«äŸåããå¯èœæ§ããããŸããããã«ã¯ççŸã¯ãªããpytestèªäœãæ£ããé åºã§ããããåŒã³åºããŸãã
å®éãå éšã§ã¯ãä»ã®ãã£ã¯ã¹ãã£ãããã£ã¯ã¹ãã£ãç¶æ¿ããã¹ã³ãŒããå€ããŠãèªå䜿çšããã«èªå䜿çšããããšãã§ããŸãã圌èªèº«ãããããæ£ããé åºã§é 眮ããããããåŒã³åºããŸãã
ããã«æåã®ãã¹ãããããŸããããã¯rare_dependency_for_test_oneã«äŸåãããã®ãã£ã¯ã¹ãã£ã¯å¥ã®ãã£ã¯ã¹ãã£ã«äŸåããŸããææ°ã¬ã¹ã§äœãèµ·ãããèŠãŠã¿ãŸãããã
ç¶æ¿é ã«åŒã³åºãããããšã確èªããŸããããã¹ãŠã®æ©èœã¬ãã«ã®ãã£ã¯ã¹ãã£ãããããããã¹ãããšã«ãã¹ãŠåŒã³åºãããŸãã 2çªç®ã®ãã¹ãã¯rare_dependencyã«äŸåããrare_dependencyã¯some_common_dependencyã«äŸåããŸããææ°å£ãèŠããšããã¹ãã®åã«2ã€ã®åšå ·ãåŒã³åºãããããšãããããŸãã
Pytestã«ã¯ããã¹ãŠã®ãã£ã¯ã¹ãã£ãé 眮ã§ããç¹å¥ãªæ§æãã¡ã€ã«conftest.pyãããããããé 眮ãããšäŸ¿å©ã§ããéåžžã人ãä»ã®äººã®ã³ãŒããèŠããšãã圌ã¯éåžžconftestã®ãã£ã¯ã¹ãã£ã調ã¹ã«è¡ããŸãã
ããã¯çŸ©åã§ã¯ãããŸããããã®ãã¡ã€ã«ã«ã®ã¿å¿ èŠãªãã£ã¯ã¹ãã£ãããããããç¹å®ã®çãç¯å²ã§é©çšå¯èœã§ãããå¥ã®ãã¡ã€ã«ã§ã¯å¿ èŠãªãããšã確å®ã«ããã£ãŠããå Žåã¯ããã¡ã€ã«ã§å®£èšã§ããŸãããŸãã¯ãå€ãã®conftestãäœæãããšããããã¯ãã¹ãŠç°ãªãã¬ãã«ã§æ©èœããŸãã
pytestã«ããæ©èœã«ã€ããŠè©±ããŸããããç§ãèšã£ãããã«ããã¹ãããã©ã¡ãŒã¿åããããšã¯éåžžã«ç°¡åã§ããããã§ã¯ã3ã€ã®ãã©ã¡ãŒã¿ãŒã»ãããæã€ãã¹ãã衚瀺ãããŸãã2ã€ã®å ¥åãš1ã€ã®äºæããããã©ã¡ãŒã¿ãŒã§ãããããã颿°åŒæ°ã«æž¡ããå ¥åã«æž¡ãããã®ãæåŸ ããããã®ãšäžèŽãããã©ããã確èªããŸãã
ãããã©ã®ããã«èŠãããèŠãŠã¿ãŸããããããã«ã¯3ã€ã®ãã¹ããããããšãããããŸããã€ãŸããpytestã¯ãããã3ã€ã®ãã¹ãã§ãããšèããŠããŸãã 2ã€ãééãã1ã€ãèœã¡ãŸãããããã§äœãããã®ïŒå€±æãããã¹ãã«ã€ããŠã¯ãåŒæ°ã衚瀺ãããã©ã®ãã©ã¡ãŒã¿ãŒã»ããã§å€±æããããããããŸãã
ç¹°ãè¿ããŸãããããªããå°ããªæ©èœãæã£ãŠããŠããã©ã¡ãŒã¿åã3ãšèšããšããããªãã¯ããªãã®ç®ã§æ£ç¢ºã«äœãèœã¡ãããèŠããããããŸããããããããã©ã¡ãŒã¿ã«å€ãã®ã»ãããããå Žåãããªãã¯ãããããªãã®ç®ã§èŠãããšã¯ã§ããŸãããããããããªãã¯èŠãã§ãããããããããã¯ããªãã«ãšã£ãŠéåžžã«é£ããã§ãããããããŠãpytestããã®ããã«ãã¹ãŠã衚瀺ããã®ã¯éåžžã«äŸ¿å©ã§ã-ãã¹ãã倱æããå Žåã¯ããã«ããããŸãã
ãã©ã¡ãŒã¿åã¯è¯ãããšã§ãããŸããäžåºŠãã¹ããäœæããŠããã倿°ã®ãã©ã¡ãŒã¿ãŒã»ãããå®è¡ããå Žåãããã¯è¯ãç¿æ £ã§ããåæ§ã®ãã¹ãçšã«å€ãã®ã³ãŒãããªã¢ã³ããäœæããã®ã§ã¯ãªããäžåºŠãã¹ããäœæããŠããããã©ã¡ãŒã¿ã®å€§èŠæš¡ãªã»ãããäœæãããšãæ©èœããŸãã
pytestã«ã¯ãã£ãšäŸ¿å©ãªãã®ããããããããŸãããããã«ã€ããŠè©±ããšãæããã«è¬çŸ©ã ãã§ã¯äžååãªã®ã§ãããäžåºŠãã»ãã®å°ãã ã玹ä»ããŸããæåã®ãã¹ãã§ã¯ãpytest.raisesïŒïŒã䜿çšããŠãäŸå€ãçºçããããšã瀺ããŸããã€ãŸãããã®å ŽåãAssertionErrorãçºçãããšããã¹ãã«åæ ŒããŸããäŸå€ãã¹ããŒãããã¯ãã§ãã
2çªç®ã«äŸ¿å©ãªã®ã¯xfailã§ãããã¹ãã倱æããããã³ã¬ãŒã¿ã§ããããããã®ãã¹ããããããã®ã³ãŒãããããšããŸããããããªãã¯äœãããªãã¡ã¯ã¿ãªã³ã°ããŸããããã¹ãã¯å€±æãå§ããŸãããåæã«ãããã¯éèŠã§ã¯ãªãããä¿®çã«éåžžã«è²»çšããããããšãçè§£ããŠããŸãããããŠãããªãã¯ãã®ãããªãã®ã§ãïŒããŠãç§ã¯ããã«ãã³ã¬ãŒã¿ãæããŸããããã¯ç·è²ã«å€ãããŸããç§ã¯åŸã§ãããä¿®æ£ããŸãããŸãã¯ããã¹ããæ°Ÿæ¿«ãå§ãããšããŸããããã¯èªåã®è¯èãšã®åæã§ããããšã¯æããã§ãããå¿ èŠãªå ŽåããããŸããããã«ããã®åœ¢åŒã®xfailã¯ããã¹ãã倱æãããã©ããã«é¢ä¿ãªãç·è²ã«ãªããŸããããã§ãStrict = Trueãã©ã¡ãŒã¿ãŒã«æž¡ãããšãã§ããŸãããããããšãç¶æ³ãå°ãç°ãªããpytestã¯ãã¹ãã倱æããã®ãåŸ ã¡ãŸãããã¹ãã«åæ Œãããšããšã©ãŒã¡ãã»ãŒãžãè¿ãããŸãããã®éãåæ§ã§ãã
ãã1ã€ã®äŸ¿å©ãªãã®ã¯skipifã§ãããã¹ããå®è¡ããªãã¹ãããããããŸãããããŠãskipifããããŸãããã®ãã³ã¬ãŒã¿ã«ã«ãŒãœã«ãåããããšãç¹å®ã®æ¡ä»¶äžã§ãã¹ããå®è¡ãããŸããã
ãã®å ŽåãMacãã©ãããã©ãŒã ã䜿çšããŠããå Žåã¯ãäœããã®çç±ã§ãã¹ãã倱æãããããèµ·åããªããšæžãããŠããŸããããã¯èµ·ãããŸãããã ããäžè¬ã«ãç¹å®ã®ãã©ãããã©ãŒã ã§ã¯åžžã«å€±æãããã©ãããã©ãŒã åºæã®ãã¹ãããããŸããæ¬¡ã«ãããã¯äŸ¿å©ã§ãã
ã¯ãããŸãããããæåXãSãèŠãŸãããããã§Xã¯xfailãS-ã¯skipifãæããŸããã€ãŸããpytestã¯ãå®å šã«å€±æãããã¹ããšå®è¡ãããã¹ãã瀺ããŸãããçµæã¯ç¢ºèªããŸããã
pytestèªäœã«ã¯ããŸããŸãªäŸ¿å©ãªãªãã·ã§ã³ããããŸãããã¡ãããããã«è¡šç€ºããããšã¯ã§ããŸãããããã¥ã¡ã³ãã§ç¢ºèªã§ããŸããããããç§ã¯ããã€ãã«ã€ããŠããªãã«è©±ããŸãã
ããã¯äŸ¿å©ãª--collect-onlyãªãã·ã§ã³ã§ããèŠã€ãã£ããã¹ãã®ãªã¹ãã衚瀺ãããŸãããªãã·ã§ã³-k-ãã¹ãåã«ãããã£ã«ã¿ãªã³ã°ããããŸããããã¯ç§ã®ãæ°ã«å ¥ãã®ãªãã·ã§ã³ã®1ã€ã§ãã1ã€ã®ãã¹ãã倱æããå Žåãç¹ã«è€éã§ä¿®æ£æ¹æ³ãããããªãå Žåã¯ããã£ã«ã¿ãªã³ã°ããŠå®è¡ããŸãã
ããªãã¯æéãç¯çŽããããšæã£ãŠãããããããä»ã®15ã®ãã¹ããå®è¡ããã®ã¯æ¥œããããšã§ã¯ãããŸãããã¯ã©ãã·ã¥ãããã¹ããå®è¡ããä¿®æ£ããŠæ¬¡ã«é²ã¿ãŸãã
éåžžã«åªãããªãã·ã§ã³-sãããããã¹ãã§stdoutããã³stderrããã®åºåãæå¹ã«ããŸããããã©ã«ãã§ã¯ãpytestã¯å€±æãããã¹ãã«å¯ŸããŠã®ã¿stdoutãšstderrãåºåããŸãããã ããéåžžã¯ãããã°ã®æ®µéã§ããã¹ãã§äœããåºåããããããã¹ãã倱æãããã©ããããããªãå ŽåããããŸããèœã¡ãªããããããŸãããããã¹ãèªäœã§äœãæ¥ãŠåºåããããã確èªããããšæããŸããæ¬¡ã«ã-sãæå®ããŠå®è¡ãããšãå¿ èŠãªãã®ã衚瀺ãããŸãã
-vã¯æšæºã®åé·ãªãã·ã§ã³ã§ãããåé·æ§ãé«ããŸãã
--lfã-last-failedã¯ãæåŸã®å®è¡ã§å€±æãããã¹ãã®ã¿ãåèµ·åã§ãããªãã·ã§ã³ã§ãã --swã-stepwiseã-kã®ãããªäŸ¿å©ãªé¢æ°ã§ãããã¹ããé çªã«ä¿®åŸ©ããå Žåã¯ã-stepwiseã䜿çšããŠå®è¡ãããšãç·è²ã®ãã¹ããå®è¡ããã倱æãããã¹ããæ€åºããããšããã«åæ¢ããŸãããŸãã-swãå床å®è¡ãããšãã¯ã©ãã·ã¥ãããã®ãã¹ãããå§ãŸããŸããåã³èœäžããå Žåã¯åã³åæ¢ããèœäžããªãã£ãå Žåã¯æ¬¡ã®èœäžãŸã§ç§»åããŸãã
ã¹ã©ã€ãããã®ãªã³ã¯
pytestã«ã¯ãã¡ã€ã³ã®æ§æãã¡ã€ã«pytest.iniããããŸãããã®äžã§ãpytestã®ããã©ã«ãã®åäœã倿Žã§ããŸããããã§ã¯ãæ§æãã¡ã€ã«ã«ãããããªãã·ã§ã³ã瀺ããŸããã
ãã¹ããã¹ã¯ãpytestããã¹ããæ€çŽ¢ãããã¹ã§ãã addoptsã¯ãèµ·åæã«ã³ãã³ãã©ã€ã³ã«è¿œå ããããã®ã§ããããã§ã¯ãaddoptsã«flake8ãšcoverageãã©ã°ã€ã³ã远å ããŸãããå°ãåŸã§èŠãŠãããŸãã
ã¹ã©ã€ãããã®ãªã³ã¯
pytestã«ã¯ããŸããŸãªãã©ã°ã€ã³ããããŸããç¹°ãè¿ãã«ãªããŸãããã©ãã§ã䜿çšãããŠãããã®ãæžããŸããã flake8ã¯ãªã³ã¿ãŒã§ãããã«ãã¬ããžã¯ãã¹ãã«ããã³ãŒãã«ãã¬ããžã§ããæ¬¡ã«ãpytest-flaskãpytest-djangoãpytest-twistedãpytest-tornadoãªã©ã®ç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ã§ã®äœæ¥ã容æã«ãããã©ã°ã€ã³ã®ã»ããå šäœããããŸããããããä»ã«äœãããããŸãã
xdistãã©ã°ã€ã³ã¯ããã¹ãã䞊è¡ããŠå®è¡ããå Žåã«äœ¿çšãããŸããã¿ã€ã ã¢ãŠããã©ã°ã€ã³ã䜿çšãããšããã¹ãã®å®è¡æéãå¶éã§ããŸããããã¯äŸ¿å©ã§ãããã¹ãã§ã¿ã€ã ã¢ãŠããã³ã¬ãŒã¿ããã³ã°ããããã¹ãã«æéããããå Žåã¯å€±æããŸãã
èŠãŠã¿ãŸãããã pytest.iniã«coverageãšflake8ã远å ããŸãããã«ãã¬ããžã¯ç§ã«ã¬ããŒããäžããŸãããç§ã¯ããã«ãã¹ããå«ããã¡ã€ã«ãæã£ãŠããŸã
ãããããäœããåŒã³åºãããŸããã§ããããããããã¯å€§äžå€«ã§ã:)ããã¯k_stat.pyãã¡ã€ã«ã§ããããã¯5ã€ãã®ã¹ããŒãã¡ã³ããå«ã¿ãŸããããã¯ã5è¡ã®ã³ãŒããšã»ãŒåãã§ããã«ãã¬ããžã¯100ïŒ ã§ãããããã¯ç§ã®ãã¡ã€ã«ãéåžžã«å°ããããã§ãã
å®éãã«ãã¬ããžã¯éåžž100ïŒ ã§ã¯ãªããããã«ã決ããŠéæãããã¹ãã§ã¯ãããŸããã䞻芳çã«ã¯ã60ã70ïŒ ã®ãã¹ãã«ãã¬ããžã§ååã§ãããæ£åžžã«æ©èœããŠããããã§ãã
ã«ãã¬ããžã¯ã100ïŒ ã§ãã£ãŠããèªåãåªããŠãããšã¯èšããªãã»ã©ã®ææšã§ãããã®ã³ãŒããåŒã³åºãããšããäºå®ã¯ãäœãããã§ãã¯ããããšãæå³ãããã®ã§ã¯ãããŸãããæåŸã«assertTrueãšæžãããšãã§ããŸãã 100ïŒ ã®ãã¹ãã«ãã¬ããžã«ã¯ãã§ãŒãžã³ã°ãšããããããããŸããã人ã ã¯ãããè¡ãå¿ èŠã¯ãããŸããã
pytest.iniã§ããã1ã€ã®ãã©ã°ã€ã³ãæ¥ç¶ããŸãããããã«--flake8ããããŸããããã¯ç§ã®ã¹ã¿ã€ã«ãšã©ãŒã瀺ããªã³ã¿ãŒã§ãããPEP8ã§ã¯ãªãpyflakesããã®ãã®ã§ãã
ããã®ææ°ã¬ã¹ã«ã¯ãPEP8ãŸãã¯pyflakesã®ãšã©ãŒçªå·ãæžãããŠããŸããäžè¬çã«ããã¹ãŠãæç¢ºã§ããè¡ãé·ãããŸããåå®çŸ©ããã«ã¯2è¡ã®ç©ºçœè¡ãå¿ èŠã§ããããã¡ã€ã«ã®æåŸã«ç©ºçœè¡ãå¿ èŠã§ããæåŸã«ãCitizenImportã¯ç§ã«ã¯äœ¿çšãããŠããªããšæžãããŠããŸããäžè¬ã«ããªã³ã¿ãŒã䜿çšãããšãé倧ãªãšã©ãŒãã³ãŒãèšèšã®ãšã©ãŒãæ€åºã§ããŸãã
ã¿ã€ã ã¢ãŠããã©ã°ã€ã³ã«ã€ããŠã¯ãã§ã«èª¬æããŸãããããã«ããããã¹ãã®å®è¡æéãå¶éã§ããŸããäžéšã®ããã©ãŒãã³ã¹ãã¹ãã§ã¯ãå®è¡æéãéèŠã§ãããããŠãtime.timeãštimeitã䜿çšããŠãã¹ãå ã§å¶éã§ããŸãããŸãã¯ãã¿ã€ã ã¢ãŠããã©ã°ã€ã³ã䜿çšããŸãããããéåžžã«äŸ¿å©ã§ãããã¹ããæ©èœããããå Žåã¯ãcProfileãªã©ãããŸããŸãªæ¹æ³ã§ãããã¡ã€ã«ãäœæã§ããŸãããYuraã¯è¬çŸ©ã§ããã«ã€ããŠèª¬æããŸãã
IDEã䜿çšããŠããŠãè£å©ããŒã«ã䜿çšãã䟡å€ãããå Žåã¯ãããã«ç¹ã«PyCharmãããããã¹ãã¯IDEããçŽæ¥å®è¡ããã®ãéåžžã«ç°¡åã§ãã
ã¢ãã¯ã«ã€ããŠè©±ãããšã¯æ®ã£ãŠããŸããã¢ãžã¥ãŒã«Aããããããããã¹ããããã®ã§ããããã¹ãããããªãã¢ãžã¥ãŒã«ãä»ã«ããããšããŸãã 1ã€ã¯ãããã¯ãŒã¯ã«æ¥ç¶ãããã1ã€ã¯ããŒã¿ããŒã¹ã«æ¥ç¶ãã3ã€ç®ã¯ãŸã£ããç ©ããããªãåçŽãªã¢ãžã¥ãŒã«ã§ãããã®ãããªå Žåãã¢ãã¯ã¯ç§ãã¡ãå©ããŸããç¹°ãè¿ããŸãããçµ±åãã¹ããäœæããå Žåã¯ããã¹ãããŒã¿ããŒã¹ãèµ·åãããã¹ãã¯ã©ã€ã¢ã³ããäœæããå¯èœæ§ãé«ããããã§ãåé¡ãããŸãããããã¯åãªãçµ±åãã¹ãã§ãã
1ã€ã®ããŒã¹ã ãããã¹ãããããšãã«ãŠããããã¹ããå®è¡ãããå ŽåããããŸããæ¬¡ã«ãã¢ãã¯ãå¿ èŠã§ãã
ã¢ãã¯ã¯ãå®éã®ãªããžã§ã¯ãã眮ãæããããã«äœ¿çšã§ãããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã§ããã¡ãœããã屿§ãåŒã³åºããšãã¢ãã¯ãè¿ãããŸãã
ãã®äŸã§ã¯ãåçŽãªã¢ãžã¥ãŒã«ããããŸãããã®ãŸãŸã«ããŠããã£ãšè€éãªãã®ãã¢ãã¯ã«çœ®ãæããŸãããããã©ã®ããã«æ©èœããããèŠãŠãããŸãã
ããã«ã¯ã£ãããšç€ºãããŠããŸããç§ãã¡ã¯ãããèŒžå ¥ããŸãããç§ãã¡ã¯mãã¢ãã¯ã§ãããšèšããŸããã¢ãã¯ãåŒã³æ»ããã圌ãã¯ãmã«ã¯æ¹æ³fããããšèšã£ããã¢ãã¯ãåŒã³æ»ããã圌ãã¯ãmãis_alive屿§ã§ãããšèšããŸãããçŽ æŽããããå¥ã®ã¢ãã¯ãæ»ã£ãŠããŸããããããŠãmãšfãäžåºŠåŒã³åºãããããšãããããŸããã€ãŸããããã¯éåžžã«ããªãããŒãªãªããžã§ã¯ãã§ããããã®äžã§getattrã¡ãœãããæžãçŽãããŸãã
ããæç¢ºãªäŸãèŠãŠã¿ãŸãããã AliveCheckerããããšããŸãããã圌ã¯ããçš®ã®http_sessionã䜿çšããã¿ãŒã²ãããå¿ èŠã§ãããåãåã£ããã®ã«å¿ããŠTrueãŸãã¯falseãè¿ãdo_check颿°ãæã£ãŠããŸãïŒ200ãŸãã¯200ã§ã¯ãããŸãããããã¯å°ã人工çãªäŸã§ããããããdo_checkã®å éšã§è€éãªããžãã¯ã宿ãããããšãã§ãããšä»®å®ããŸãã
ã»ãã·ã§ã³ã«ã€ããŠäœããã¹ãããããªããgetã¡ãœããã«ã€ããŠäœãç¥ããããªããšããŸãããã do_checkã®ã¿ããã¹ãããŸããããããã¹ãããŠã¿ããã
ããªãã¯ãã®ããã«ãããè¡ãããšãã§ããŸãã http_sessionãã¢ãã¯ããŸããããã§ã¯pseudo_clientãšåŒã°ããŸãã圌女ã®getã¡ãœãããã¢ãã¯ããŸããgetã¯200ãè¿ãã¢ãã¯ã§ãããšèšããŸããèµ·åããããããAliveCheckerãäœæããèµ·åããŸãããã®ãã¹ãã¯æ©èœããŸãã
ããã«ãgetãäžåºŠåŒã³åºãããèšè¿°ããããã®ãšãŸã£ããåãåŒæ°ã§åŒã³åºãããããšã確èªããŸããããã€ãŸããã»ãã·ã§ã³ãäœã§ãããããŸãã¯ãã®ã¡ãœãããäœã§ããããäœãç¥ããã«do_checkãåŒã³åºããŸããããã åãããã ãã§ããç§ãã¡ãç¥ã£ãŠããå¯äžã®ããšã¯ãããã200ãè¿ããããš
ã§ããå¥ã®äŸãããã¯åã®ãã®ãšéåžžã«äŒŒãŠããŸããããã§ã®å¯äžã®ãã®ã¯ãreturn_valueã§ã¯ãªãside_effectã§ããããããããã¯ã¢ãã¯ãè¡ãããšã§ãããã®å ŽåãäŸå€ãã¹ããŒãããŸããã¢ãµãŒãè¡ã¯ãAliveChecker.do_checkïŒïŒã§ã¯ãªãã¢ãµãŒãããããã«å€æŽãããŸãããã€ãŸãããã§ãã¯ã«åæ ŒããªãããšãããããŸãã
ãããã¯ãäžããäœãå ¥ã£ãã®ãããã®ã¯ã©ã¹ã«å ¥ã£ãã®ãã«ã€ããŠäœãç¥ããã«do_check颿°ããã¹ãããæ¹æ³ã®2ã€ã®äŸã§ãã
ãã¡ããããã®äŸã¯äººçºçãªãã®ã«èŠããŸãã200ã§ãããã©ããã«ãããããããã§ãã¯ãæå°éã®ããžãã¯ã§ããçç±ã¯å®å šã«ã¯æããã§ã¯ãããŸããããããããªã¿ãŒã³ã³ãŒãã«å¿ããŠããªãããŒãªããšãããããšãæ³åããŠã¿ãŸãããããããŠããã®ãããªãã¹ãã¯ã¯ããã«æå³ãããããã«èŠãå§ããŸãã 200ãæ¥ãã®ãèŠãŠãåŠçããžãã¯ããã§ãã¯ããŸãã 200ã§ãªãå Žå-åãã
ã©ã€ãã©ãªã«ã¢ãã¯ã§ããããé©çšããããšãã§ããŸãããã§ã«ã©ã€ãã©ãªãããããã®äžã®äœãã倿Žããå¿ èŠããããšããŸãããããäŸã§ãããµã€ã³ã«ããããé©çšããŸãããä»ã圌ã¯ãã€ããã¥ãŒã¹ãè¿ããŸããåªããã
ãŸããmã2åââåŒã³åºãããŠããããšãããããŸãããã¡ãããã¢ãã¯ã¯ãã¢ãã¯ããã¡ãœããã®å éšAPIã«ã€ããŠäœãç¥ããŸããããŸããäžè¬ã«ãããããšäžèŽããå¿ èŠã¯ãããŸãããããããã¢ãã¯ã䜿çšãããšãäœãåŒã³åºããããäœåãã©ã®åŒæ°ã§åŒã³åºãããã確èªã§ããŸãããã®æå³ã§ãã³ãŒãããã¹ãããã®ã«åœ¹ç«ã¡ãŸãã
ã¢ãžã¥ãŒã«ã1ã€ãšå·šå€§ãªã¢ãã¯ãããªãå Žåã¯èŠåããããšæããŸãããã¹ãŠã«åççã«ã¢ãããŒãããŠãã ãããç°¡åãªãã®ãããå Žåã¯ãæ¿¡ãããªãã§ãã ããããã¹ãã«ã¢ãã¯ãå€ããã°å€ãã»ã©ãçŸå®ããé¢ããŠããŸããŸããAPIãäžèŽããªãå¯èœæ§ããããäžè¬ã«ãããã¯ãã¹ãããŠãããã®ãšæ£ç¢ºã«ã¯äžèŽããŸãããããªãã¯å¿ èŠãªãã«ãã¹ãŠã浞ãå¿ èŠã¯ãããŸãããããã»ã¹ã«ã€ã³ããªãžã§ã³ãã«ã¢ãããŒãããŸãã
ç¶ç¶çãªçµ±åã«ã€ããŠã®æåŸã®å°ããªéšåãæ®ã£ãŠããŸããããããããžã§ã¯ããåç¬ã§éçºããŠããå Žåã¯ãããŒã«ã«ã§ãã¹ããå®è¡ã§ããŸããã倧ããããšã§ã¯ãããŸããã
ãããžã§ã¯ããæé·ããè€æ°ã®éçºè ãããââãžã§ã¯ãã«åå ãããšããã«ããããžã§ã¯ãã¯æ©èœããªããªããŸãããŸããååã¯ããŒã«ã«ã§ãã¹ããå®è¡ããŸããã第äºã«ã圌ãã¯åœŒãã®ããŒãžã§ã³ã§ããããå®è¡ããŸããã©ããã§è¡çªãèµ·ããããã¹ãŠãçµ¶ãã厩å£ããŸãã
ãã®ããã«ãç¶ç¶çãªçµ±åããããŸããããã¯ãåè£è ãäž»æµã«è¿ éã«æ³šå ¥ããããšãå«ãéçºææ³ã§ãããããåæã«ã圌ãã¯ç¹å¥ãªã·ã¹ãã ã§ããçš®ã®èªåçµã¿ç«ãŠãŸãã¯èªåãã¹ããçµãªããã°ãªããŸããããªããžããªã«ã³ãŒãããããã¡ã€ã³ãããžã§ã¯ããã©ã³ãã«ããŒãžããã³ãããããããŸãããããã®ã³ãããã§ã¯ããã¹ãã¯ç¹å¥ãªã·ã¹ãã ã§åæ ŒããŸãããã¹ããç·è²ã®å Žåã¯ãã³ããããåç¬ã§æ³šå ¥ãããããã³ããããæ³šå ¥ããæ©äŒããããŸãã
ãã¡ããããã®ãããªã¹ããŒã ã«ã¯ããã¹ãŠã ãã§ãªããæ¬ ç¹ããããŸããå°ãªããšããCIãç¡æã«ãªããšããäºå®ã§ã¯ãªãã远å ã®ããŒããŠã§ã¢ãå¿ èŠã§ããããããå€§äŒæ¥ã§ã¯ãªããå€ããå°ãªããå€§äŒæ¥ã§ã¯ãCIãªãã§ã¯ã©ãã«ãè¡ããŸããã
äŸãšããŠãCIã®1ã€ã§ããTeamCityã®ã¹ã¯ãªãŒã³ã·ã§ãããçµã¿ç«ãŠããããç¡äºã«å®æããŸãããããã«å€ãã®å€æŽããããŸãããããã¯ãã®ãããªãããŠãã®ãããªæã«ãã®ãããªãããŠãã®ãããªãšãŒãžã§ã³ãã§ç«ã¡äžããããŸãããããã¯ããã¹ãŠãè¯å¥œã§ãæ³šå ¥ã§ããå Žåã®äŸã§ãã
å€ãã®ç°ãªãCIã·ã¹ãã ããããŸããèå³ãããã°ããªã¹ããäœæããŸãããAppVeyorãJenkinsãTravisãCircleCIãGoCDãBuildbotã§ããããããšãã
Pythonã«é¢ãããããªã³ãŒã¹ã®ä»ã®è¬çŸ©ã¯ãHabrÃ©ã®æçš¿ã«ãããŸãã