å ç¢ãªã³ãŒããä¿èšŒããããã®JavaScriptã¢ãžã¥ãŒã«ã³ãŒãã«ãã¬ããžã®å æ¬çã¬ã€ããäž»èŠãªææšãããŒã«ããã¹ããã©ã¯ãã£ã¹ã解説ããŸãã
JavaScriptã¢ãžã¥ãŒã«ã®ã³ãŒãã«ãã¬ããžïŒãã¹ãææšã®è§£èª¬
åçãªJavaScriptéçºã®äžçã§ã¯ãã³ãŒãã®ä¿¡é Œæ§ãšå ç¢æ§ã確ä¿ããããšãæãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ããç¹ã«ã¢ãžã¥ã©ãŒã¢ãŒããã¯ãã£ã®æ¡çšå¢å ã«äŒŽããè€éããå¢ãã«ã€ããŠãå æ¬çãªãã¹ãæŠç¥ãäžå¯æ¬ ã«ãªããŸãããã®ãããªæŠç¥ã®éèŠãªèŠçŽ ã®äžã€ãã³ãŒãã«ãã¬ããžã§ãããããã¯ãã¹ãã¹ã€ãŒããã³ãŒãããŒã¹ãã©ã®çšåºŠå®è¡ããŠããããæž¬å®ããææšã§ãã
ãã®ã¬ã€ãã§ã¯ãJavaScriptã¢ãžã¥ãŒã«ã®ã³ãŒãã«ãã¬ããžã«ã€ããŠæ·±ãæãäžãããã®éèŠæ§ãäž»èŠãªææšãäžè¬çãªããŒã«ããããŠå®è£ ã®ããã®ãã¹ããã©ã¯ãã£ã¹ã解説ããŸããããŸããŸãªãã¹ãæŠç¥ãåãäžããäžçäžã®ç°ãªããã¬ãŒã ã¯ãŒã¯ãç°å¢ã§é©çšå¯èœãªãJavaScriptã¢ãžã¥ãŒã«ã®å šäœçãªå質ãåäžãããããã«ã³ãŒãã«ãã¬ããžã掻çšããæ¹æ³ã瀺ããŸãã
ã³ãŒãã«ãã¬ããžãšã¯äœãïŒ
ã³ãŒãã«ãã¬ããžã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒããã©ã®çšåºŠãã¹ããããããå®éåãããœãããŠã§ã¢ãã¹ãã®ææšã§ããããã¯æ¬è³ªçã«ããã¹ãå®è¡æã«ã³ãŒãã®ã©ã®éšåãå®è¡ãããŠããããæããã«ããŸããäžè¬çã«ãã³ãŒãã«ãã¬ããžçãé«ãããšã¯ããã¹ããã³ãŒãããŒã¹ã培åºçã«å®è¡ããŠããããšã瀺ãããã°ã®æžå°ãã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãžã®ä¿¡é Œåäžã«ã€ãªããå¯èœæ§ããããŸãã
ããã¯ãããªãã®è¡ã®ã©ã®å°åãèŠå¯ã«ãã£ãŠååã«ããããŒã«ãããŠãããã瀺ãå°å³ã®ãããªãã®ã ãšèããŠãã ãããããåºããšãªã¢ãããããŒã«ãããŠããªããã°ãç¯çœªè¡çºã暪è¡ãããããããŸãããåæ§ã«ãååãªãã¹ãã«ãã¬ããžããªããã°ããã¹ããããŠããªãã³ãŒãéšåã«é ãããã°ãæœãã§ããããããã¯æ¬çªç°å¢ã§åããŠè¡šé¢åããå¯èœæ§ããããŸãã
ãªãã³ãŒãã«ãã¬ããžã¯éèŠãªã®ãïŒ
- æªãã¹ãã³ãŒãã®ç¹å®ïŒ ã³ãŒãã«ãã¬ããžã¯ããã¹ããäžè¶³ããŠããã³ãŒãã»ã¯ã·ã§ã³ãæµ®ã圫ãã«ããæãå¿ èŠãªå Žæã«ãã¹ãã®åŽåãéäžãããããšãã§ããŸãã
- ã³ãŒãå質ã®åäžïŒ ããé«ãã³ãŒãã«ãã¬ããžãç®æãããšã§ãéçºè ã¯ããå æ¬çã§æå³ã®ãããã¹ããæžãåæ©ä»ããšãªããããå ç¢ã§ä¿å®æ§ã®é«ãã³ãŒãããŒã¹ã«ã€ãªãããŸãã
- ãã°ã®ãªã¹ã¯äœæžïŒ 培åºçã«ãã¹ããããã³ãŒãã¯ãæ¬çªç°å¢ã§åé¡ãåŒãèµ·ããå¯èœæ§ã®ããæªçºèŠã®ãã°ãå«ãå¯èœæ§ãäœããªããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ä¿é²ïŒ è¯å¥œãªã³ãŒãã«ãã¬ããžãããã°ããã¹ããããã»ã¹äžã«å°å ¥ããããªã°ã¬ãã·ã§ã³ãæ€åºããŠããããšç¢ºä¿¡ããŠãèªä¿¡ãæã£ãŠã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ã§ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ã®åŒ·åïŒ ã³ãŒãã«ãã¬ããžã¬ããŒãã¯ããã¹ãåè³ªã®æç¢ºã§å®¢èгçãªå°ºåºŠãæäŸããéçºè éã®ããè¯ãã³ãã¥ãã±ãŒã·ã§ã³ãšã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããŸãã
- ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³/ç¶ç¶çãããã€ã¡ã³ãïŒCI/CDïŒã®ãµããŒãïŒ ã³ãŒãã«ãã¬ããžã¯ããã¹ãã«ãã¬ããžãäžååãªã³ãŒããæ¬çªç°å¢ã«ãããã€ãããã®ãé²ãã²ãŒããšããŠãCI/CDãã€ãã©ã€ã³ã«çµ±åããããšãã§ããŸãã
äž»èŠãªã³ãŒãã«ãã¬ããžææš
ã³ãŒãã«ãã¬ããžãè©äŸ¡ããããã«ããã€ãã®ææšã䜿çšãããããããããã¹ã察象ã³ãŒãã®ç°ãªãåŽé¢ã«çŠç¹ãåœãŠãŠããŸãããããã®ææšãçè§£ããããšã¯ãã³ãŒãã«ãã¬ããžã¬ããŒããè§£éãããã¹ãæŠç¥ã«ã€ããŠæ å ±ã«åºã¥ããæ±ºå®ãäžãããã«äžå¯æ¬ ã§ãã
1. è¡ã«ãã¬ããž
è¡ã«ãã¬ããžã¯æãåçŽã§ãæãäžè¬çã«äœ¿çšãããææšã§ãããã¹ãã¹ã€ãŒãã«ãã£ãŠå®è¡ãããå®è¡å¯èœãªã³ãŒãè¡ã®å²åãæž¬å®ããŸãã
èšç®åŒïŒ (å®è¡ãããè¡æ°) / (å®è¡å¯èœãªç·è¡æ°) * 100
äŸïŒ ã¢ãžã¥ãŒã«ã«100è¡ã®å®è¡å¯èœãªã³ãŒããããããã¹ãããã®ãã¡ã®80è¡ãå®è¡ããå Žåãè¡ã«ãã¬ããžã¯80%ã§ãã
èæ ®äºé ïŒ çè§£ããããäžæ¹ã§ãè¡ã«ãã¬ããžã¯èª€è§£ãæãããšããããŸããããè¡ãå®è¡ãããŠãããã®ãã¹ãŠã®å¯èœãªæ¯ãèããå®å šã«ãã¹ããããŠãããšã¯éããŸãããäŸãã°ãè€æ°ã®æ¡ä»¶ãæã€è¡ããç¹å®ã®1ã€ã®ã·ããªãªã«ã€ããŠã®ã¿ãã¹ããããå ŽåããããŸãã
2. åå²ã«ãã¬ããž
åå²ã«ãã¬ããžïŒãã·ãžã§ã³ã«ãã¬ããžãšãåŒã°ããïŒã¯ããã¹ãã¹ã€ãŒãã«ãã£ãŠå®è¡ãããåå²ïŒäŸïŒ`if`æã`switch`æãã«ãŒãïŒã®å²åãæž¬å®ããŸããããã«ãããæ¡ä»¶æã®`true`ãš`false`ã®äž¡æ¹ã®åå²ããã¹ããããããšãä¿èšŒãããŸãã
èšç®åŒïŒ (å®è¡ãããå岿°) / (ç·å岿°) * 100
äŸïŒ ã¢ãžã¥ãŒã«ã«`if`æãããå Žåãåå²ã«ãã¬ããžã§ã¯`if`ãããã¯ãš`else`ãããã¯ïŒãŸãã¯`else`ããªãå Žåã¯`if`ã«ç¶ãã³ãŒãïŒã®äž¡æ¹ãå®è¡ãããã¹ããäœæããå¿ èŠããããŸãã
èæ ®äºé ïŒ åå²ã«ãã¬ããžã¯ããã¹ãŠã®å¯èœãªå®è¡ãã¹ã調æ»ãããããšãä¿èšŒãããããäžè¬çã«è¡ã«ãã¬ããžãããå æ¬çã§ãããšèããããŠããŸãã
3. 颿°ã«ãã¬ããž
颿°ã«ãã¬ããžã¯ãã¢ãžã¥ãŒã«å ã®é¢æ°ã®ãã¡ããã¹ãã¹ã€ãŒãã«ãã£ãŠå°ãªããšã1ååŒã³åºããã颿°ã®å²åãæž¬å®ããŸãã
èšç®åŒïŒ (åŒã³åºããã颿°æ°) / (ç·é¢æ°æ°) * 100
äŸïŒ ã¢ãžã¥ãŒã«ã«10åã®é¢æ°ãå«ãŸããŠããããã¹ãããã®ãã¡ã®8åãåŒã³åºããå Žåã颿°ã«ãã¬ããžã¯80%ã§ãã
èæ ®äºé ïŒ é¢æ°ã«ãã¬ããžã¯ãã¹ãŠã®é¢æ°ãåŒã³åºãããããšãä¿èšŒããŸãããããããç°ãªãå ¥åããšããžã±ãŒã¹ã§åŸ¹åºçã«ãã¹ããããŠããããšãä¿èšŒãããã®ã§ã¯ãããŸããã
4. ã¹ããŒãã¡ã³ãã«ãã¬ããž
ã¹ããŒãã¡ã³ãã«ãã¬ããžã¯è¡ã«ãã¬ããžãšéåžžã«ãã䌌ãŠããŸããã³ãŒãå ã®ã¹ããŒãã¡ã³ãïŒæïŒã®ãã¡ãå®è¡ããããã®ã®å²åãæž¬å®ããŸãã
èšç®åŒïŒ (å®è¡ãããã¹ããŒãã¡ã³ãæ°) / (ç·ã¹ããŒãã¡ã³ãæ°) * 100
äŸïŒ è¡ã«ãã¬ããžãšåæ§ã«ãåã¹ããŒãã¡ã³ããå°ãªããšã1åå®è¡ãããããšãä¿èšŒããŸãã
èæ ®äºé ïŒ è¡ã«ãã¬ããžãšåæ§ã«ãã¹ããŒãã¡ã³ãã«ãã¬ããžã¯åçŽãããããšãããã埮åŠãªãã°ãèŠéãå¯èœæ§ããããŸãã
5. ãã¹ã«ãã¬ããž
ãã¹ã«ãã¬ããžã¯æãå æ¬çã§ãããéæããã®ãæãå°é£ãªææšã§ããããŸããã³ãŒããéããã¹ãŠã®å¯èœãªå®è¡ãã¹ã®ãã¡ããã¹ãããããã¹ã®å²åãæž¬å®ããŸãã
èšç®åŒïŒ (å®è¡ããããã¹æ°) / (å¯èœãªç·ãã¹æ°) * 100
äŸïŒ è€æ°ã®ãã¹ããã`if`æãæã€é¢æ°ãèããŠã¿ãŠãã ããããã¹ã«ãã¬ããžã§ã¯ããããã®æã«å¯Ÿãã`true`ãš`false`ã®ãã¹ãŠã®å¯èœãªçµã¿åããããã¹ãããå¿ èŠããããŸãã
èæ ®äºé ïŒ å¯èœãªãã¹ãææ°é¢æ°çã«å¢å ãããããè€éãªã³ãŒãããŒã¹ã§100%ã®ãã¹ã«ãã¬ããžãéæããããšã¯ãã°ãã°éçŸå®çã§ããããããé«ããã¹ã«ãã¬ããžãç®æãããšã¯ãã³ãŒãã®å質ãšä¿¡é Œæ§ãå€§å¹ ã«åäžãããããšãã§ããŸãã
6. 颿°åŒã³åºãã«ãã¬ããž
颿°åŒã³åºãã«ãã¬ããžã¯ãã³ãŒãå ã®ç¹å®ã®é¢æ°åŒã³åºãã«çŠç¹ãåœãŠãŸãããã¹ãäžã«ç¹å®ã®é¢æ°åŒã³åºããå®è¡ããããã©ããã远跡ããŸãã
èšç®åŒïŒ (å®è¡ãããç¹å®ã®é¢æ°åŒã³åºãã®æ°) / (ãã®ç¹å®ã®é¢æ°åŒã³åºãã®ç·æ°) * 100
äŸïŒ ç¹å®ã®ãŠãŒãã£ãªãã£é¢æ°ãéèŠãªã³ã³ããŒãã³ãããåŒã³åºãããããšãä¿èšŒãããå Žåã颿°åŒã³åºãã«ãã¬ããžã§ããã確èªã§ããŸãã
èæ ®äºé ïŒ ç¹ã«ã¢ãžã¥ãŒã«éã®è€éãªçžäºäœçšã«ãããŠãç¹å®ã®é¢æ°åŒã³åºããæåŸ ã©ããã«è¡ãããŠããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
JavaScriptã³ãŒãã«ãã¬ããžã®ããã®ããŒã«
JavaScriptãããžã§ã¯ãã§ã³ãŒãã«ãã¬ããžã¬ããŒããçæããããã®åªããããŒã«ãããã€ãå©çšå¯èœã§ãããããã®ããŒã«ã¯éåžžããã¹ãäžã«ã©ã®è¡ãåå²ã颿°ãå®è¡ããããã远跡ããããã«ãã³ãŒããïŒå®è¡æãŸãã¯ãã«ãã¹ãããäžã«ïŒã€ã³ã¹ãã«ã¡ã³ãããŸãã以äžã«æã人æ°ã®ãããªãã·ã§ã³ãããã€ã玹ä»ããŸãã
1. Istanbul/NYC
Istanbulã¯ãJavaScriptã§åºã䜿çšãããŠããã³ãŒãã«ãã¬ããžããŒã«ã§ããNYCã¯Istanbulã®ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ã§ããããã¹ããå®è¡ããŠã«ãã¬ããžã¬ããŒããçæãã䟿å©ãªæ¹æ³ãæäŸããŸãã
ç¹åŸŽïŒ
- è¡ãåå²ã颿°ãã¹ããŒãã¡ã³ãã«ãã¬ããžããµããŒãã
- ããŸããŸãªã¬ããŒã圢åŒïŒHTMLãããã¹ããLCOVãCoberturaïŒãçæã
- MochaãJestãJasmineãªã©ã®äžè¬çãªãã¹ããã¬ãŒã ã¯ãŒã¯ãšçµ±åã
- é«åºŠãªèšå®ãå¯èœã
äŸïŒMochaãšNYCã䜿çšïŒïŒ
npm install --save-dev nyc mocha
`package.json`ã«ä»¥äžãèšè¿°ïŒ
"scripts": {
"test": "nyc mocha"
}
次ã«ã以äžãå®è¡ïŒ
npm test
ããã«ããMochaãã¹ããå®è¡ããã`coverage`ãã£ã¬ã¯ããªã«ã³ãŒãã«ãã¬ããžã¬ããŒããçæãããŸãã
2. Jest
Jestã¯Facebookã«ãã£ãŠéçºããã人æ°ã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããçµã¿èŸŒã¿ã®ã³ãŒãã«ãã¬ããžæ©èœãå«ãŸããŠããã远å ã®ããŒã«ãå¿ èŠãšããã«ç°¡åã«ã«ãã¬ããžã¬ããŒããçæã§ããŸãã
ç¹åŸŽïŒ
- ãŒãã³ã³ãã£ã°ã¬ãŒã·ã§ã³ã§ã®ã»ããã¢ããïŒã»ãšãã©ã®å ŽåïŒã
- ã¹ãããã·ã§ãããã¹ãã
- ã¢ãã¯æ©èœã
- çµã¿èŸŒã¿ã®ã³ãŒãã«ãã¬ããžã
äŸïŒ
npm install --save-dev jest
`package.json`ã«ä»¥äžãèšè¿°ïŒ
"scripts": {
"test": "jest --coverage"
}
次ã«ã以äžãå®è¡ïŒ
npm test
ããã«ããJestãã¹ããå®è¡ããã`coverage`ãã£ã¬ã¯ããªã«ã³ãŒãã«ãã¬ããžã¬ããŒããçæãããŸãã
3. Blanket.js
Blanket.jsã¯ããã©ãŠã¶ãšNode.jsã®äž¡æ¹ã®ç°å¢ããµããŒãããããäžã€ã®JavaScriptçšã³ãŒãã«ãã¬ããžããŒã«ã§ããæ¯èŒçç°¡åãªã»ããã¢ããã§ãåºæ¬çãªã«ãã¬ããžææšãæäŸããŸãã
ç¹åŸŽïŒ
- ãã©ãŠã¶ãšNode.jsããµããŒãã
- ç°¡åãªã»ããã¢ããã
- åºæ¬çãªã«ãã¬ããžææšã
èæ ®äºé ïŒ Blanket.jsã¯ãIstanbulãJestãšæ¯èŒããŠãããŸã掻çºã«ã¡ã³ããã³ã¹ãããŠããŸããã
4. c8
c8ã¯ãé«éãã€å¹ççã«ã«ãã¬ããžã¬ããŒããçæããæ¹æ³ãæäŸããææ°ã®ã³ãŒãã«ãã¬ããžããŒã«ã§ããNode.jsã®çµã¿èŸŒã¿ã³ãŒãã«ãã¬ããžAPIãæŽ»çšããŠããŸãã
ç¹åŸŽïŒ
- é«éãã€å¹ççã
- Node.jsã®çµã¿èŸŒã¿ã³ãŒãã«ãã¬ããžAPIã䜿çšã
- ããŸããŸãªã¬ããŒã圢åŒããµããŒãã
äŸïŒ
npm install --save-dev c8
`package.json`ã«ä»¥äžãèšè¿°ïŒ
"scripts": {
"test": "c8 mocha"
}
次ã«ã以äžãå®è¡ïŒ
npm test
ã³ãŒãã«ãã¬ããžãå®è£ ããããã®ãã¹ããã©ã¯ãã£ã¹
ã³ãŒãã«ãã¬ããžã¯è²Žéãªææšã§ãããè³¢ã䜿çšããããããèœãšã穎ãé¿ããããšãäžå¯æ¬ ã§ãã以äžã«ãJavaScriptãããžã§ã¯ãã§ã³ãŒãã«ãã¬ããžãå®è£ ããããã®ãã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãã
1. é«ãã«ãã¬ããžã ãã§ãªããæå³ã®ãããã¹ããç®æã
ã³ãŒãã«ãã¬ããžã¯ç®æšã§ã¯ãªããã¬ã€ãã§ããã¹ãã§ããã«ãã¬ããžçãäžããããã ãã«ãã¹ããæžããšãå®éã«ã¯ããŸã䟡å€ã®ãªã衚é¢çãªãã¹ãã«ã€ãªããå¯èœæ§ããããŸããã¢ãžã¥ãŒã«ã®æ©èœã培åºçã«å®è¡ããéèŠãªãšããžã±ãŒã¹ãã«ããŒããæå³ã®ãããã¹ããæžãããšã«éäžããŠãã ããã
äŸãã°ã颿°ã«ãã¬ããžãéæããããã«é¢æ°ãåŒã³åºãã ãã§ãªããããŸããŸãªå ¥åã«å¯ŸããŠé¢æ°ãæ£ããåºåãè¿ãããšã©ãŒãé©åã«åŠçããããšãã¢ãµãŒããããã¹ããæžããŠãã ãããå¢çæ¡ä»¶ãæœåšçã«ç¡å¹ãªå ¥åãèæ ®ããŸãããã
2. æ©æã«éå§ããã¯ãŒã¯ãããŒã«çµ±åãã
ãããžã§ã¯ãã®çµãããŸã§ã³ãŒãã«ãã¬ããžã«ã€ããŠèããã®ãåŸ ããªãã§ãã ãããéçºã¯ãŒã¯ãããŒã®æåããã³ãŒãã«ãã¬ããžãçµ±åããŸããããããã«ãããã«ãã¬ããžã®ã®ã£ãããæ©æã«ç¹å®ããŠå¯ŸåŠã§ããå æ¬çãªãã¹ããæžãããããªããŸãã
çæ³çã«ã¯ãCI/CDãã€ãã©ã€ã³ã«ã³ãŒãã«ãã¬ããžãçµã¿èŸŒãã¹ãã§ããããã«ããããã«ãããšã«èªåçã«ã«ãã¬ããžã¬ããŒããçæãããã«ãã¬ããžã®åŸåã远跡ãããªã°ã¬ãã·ã§ã³ãé²ãããšãã§ããŸãã
3. çŸå®çãªã«ãã¬ããžç®æšãèšå®ãã
é«ãã³ãŒãã«ãã¬ããžãç®æãããšã¯äžè¬çã«æãŸããã§ãããéçŸå®çãªç®æšãèšå®ããããšã¯é广ã«ãªãå¯èœæ§ããããŸããã¢ãžã¥ãŒã«ã®è€éããšéèŠåºŠã«é©ããã«ãã¬ããžã¬ãã«ãç®æããŸãããã80ã90%ã®ã«ãã¬ããžã¯ãã°ãã°åŠ¥åœãªç®æšã§ãããããã¯ãããžã§ã¯ãã«ãã£ãŠç°ãªãå ŽåããããŸãã
ãŸããããé«ãã«ãã¬ããžãéæããããã®ã³ã¹ããèæ ®ããããšãéèŠã§ããå Žåã«ãã£ãŠã¯ãã³ãŒãã®ãã¹ãŠã®è¡ããã¹ãããããã«å¿ èŠãªåŽåããæœåšçãªå©çã«èŠåããªãããšããããŸãã
4. ã³ãŒãã«ãã¬ããžã䜿çšããŠåŒ±ç¹ãç¹å®ãã
ã³ãŒãã«ãã¬ããžã¬ããŒãã¯ããã¹ãã«ãã¬ããžãäžååãªã³ãŒãé åãç¹å®ããããã«äœ¿çšãããšãã«æã䟡å€ããããŸãããããã®é åã«ãã¹ãã®åŽåãéäžãããç¹ã«è€éãªããžãã¯ããšããžã±ãŒã¹ãæœåšçãªãšã©ãŒæ¡ä»¶ã«æ³šæãæã£ãŠãã ããã
åã«ã«ãã¬ããžãäžããããã«ãã¿ããã«ãã¹ããæžãã®ã§ã¯ãªãããªãã³ãŒãã®ç¹å®ã®é åãã«ããŒãããŠããªãã®ããçè§£ããæ ¹æ¬çãªåé¡ã«å¯ŸåŠããæéããããŠãã ãããããã«ã¯ãã³ãŒãããããã¹ãããããããããã®ãªãã¡ã¯ã¿ãªã³ã°ããããçãçµã£ããã¹ãã®äœæãå«ãŸããå ŽåããããŸãã
5. ãšããžã±ãŒã¹ãšãšã©ãŒãã³ããªã³ã°ãç¡èŠããªã
ãšããžã±ãŒã¹ãšãšã©ãŒãã³ããªã³ã°ã¯ããã¹ããæžãéã«èŠéããããã¡ã§ãããããããããã¯é ãããã°ãè匱æ§ãæããã«ããããšãå€ãããããã¹ãããããšãéåžžã«éèŠã§ããç¡å¹ãªå€ãäºæããªãå€ãå«ãå¹ åºãå ¥åãã«ããŒãããã¹ããäœæããã¢ãžã¥ãŒã«ããããã®ã·ããªãªãé©åã«åŠçããããšã確èªããŠãã ããã
äŸãã°ãã¢ãžã¥ãŒã«ãèšç®ãè¡ãå Žåã¯ã倧ããªæ°å€ãå°ããªæ°å€ããŒããè² ã®æ°å€ã§ãã¹ãããŸããã¢ãžã¥ãŒã«ãå€éšAPIãšããåãããå Žåã¯ãããŸããŸãªãããã¯ãŒã¯æ¡ä»¶ãæœåšçãªãšã©ãŒã¬ã¹ãã³ã¹ã§ãã¹ãããŸãã
6. ã¢ãã¯ãšã¹ã¿ãã䜿çšããŠã¢ãžã¥ãŒã«ãåé¢ãã
å€éšãªãœãŒã¹ãä»ã®ã¢ãžã¥ãŒã«ã«äŸåããã¢ãžã¥ãŒã«ããã¹ãããå Žåãã¢ãã¯ãã¹ã¿ãã®ãã¯ããã¯ã䜿çšããŠããããåé¢ããŸããããã«ãããäŸåé¢ä¿ã®æ¯ãèãã«åœ±é¿ãããããšãªããã¢ãžã¥ãŒã«ãåç¬ã§ãã¹ãã§ããŸãã
ã¢ãã¯ã¯ããã¹ãäžã«å¶åŸ¡ããã³æäœã§ããäŸåé¢ä¿ã®ã·ãã¥ã¬ãŒããããããŒãžã§ã³ãäœæããããšãå«ã¿ãŸããã¹ã¿ãã¯ãäŸåé¢ä¿ãäºåå®çŸ©ãããå€ãæ¯ãèãã«çœ®ãæããããšãå«ã¿ãŸãã人æ°ã®JavaScriptã¢ãã¯ã©ã€ãã©ãªã«ã¯ãJestã®çµã¿èŸŒã¿ã¢ãã¯æ©èœãSinon.jsããããŸãã
7. ãã¹ããç¶ç¶çã«ã¬ãã¥ãŒãããªãã¡ã¯ã¿ãªã³ã°ãã
ãã¹ãã¯ãã³ãŒãããŒã¹ã«ãããŠç¬¬äžçŽã®åžæ°ãšããŠæ±ãããã¹ãã§ãããã¹ããäŸç¶ãšããŠé©åã§ãæ£ç¢ºã§ãä¿å®å¯èœã§ããããšã確èªããããã«ã宿çã«ã¬ãã¥ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãã ãããã³ãŒããé²åããã«ã€ããŠããã¹ããããã«åãããŠé²åããå¿ èŠããããŸãã
å€ããªã£ããã¹ããåé·ãªãã¹ããåé€ããæ©èœãæ¯ãèãã®å€æŽãåæ ããããã«ãã¹ããæŽæ°ããŠãã ãããä»ã®éçºè ããã¹ãäœæ¥ã«å®¹æã«è²¢ç®ã§ããããã«ããã¹ããçè§£ãããããä¿å®ããããããšã確èªããŠãã ããã
8. ç°ãªãçš®é¡ã®ãã¹ããæ€èšãã
ã³ãŒãã«ãã¬ããžã¯ãã°ãã°ãŠããããã¹ãã«é¢é£ä»ããããŸãããçµ±åãã¹ãããšã³ãããŒãšã³ãïŒE2EïŒãã¹ããªã©ãä»ã®çš®é¡ã®ãã¹ãã«ãé©çšã§ããŸããåçš®é¡ã®ãã¹ãã¯ç°ãªãç®çãæãããå šäœçãªã³ãŒãå質ã«è²¢ç®ã§ããŸãã
- ãŠããããã¹ãïŒ åã ã®ã¢ãžã¥ãŒã«ã颿°ãåç¬ã§ãã¹ãããŸããæãäœãã¬ãã«ã§ã³ãŒãã®æ£ãããæ€èšŒããããšã«çŠç¹ãåœãŠãŸãã
- çµ±åãã¹ãïŒ ç°ãªãã¢ãžã¥ãŒã«ãã³ã³ããŒãã³ãéã®çžäºäœçšããã¹ãããŸããã¢ãžã¥ãŒã«ãæ£ãã飿ºããŠåäœããããšãæ€èšŒããããšã«çŠç¹ãåœãŠãŸãã
- E2Eãã¹ãïŒ ãŠãŒã¶ãŒã®èŠç¹ããã¢ããªã±ãŒã·ã§ã³å šäœããã¹ãããŸããå®éã®ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãæåŸ ã©ããã«æ©èœããããšãæ€èšŒããããšã«çŠç¹ãåœãŠãŸãã
3çš®é¡ãã¹ãŠã®ãã¹ããå«ããã©ã³ã¹ã®åãããã¹ãæŠç¥ãç®æããåçš®é¡ãå šäœçãªã³ãŒãã«ãã¬ããžã«è²¢ç®ããããã«ããŸãããã
9. éåæã³ãŒãã«æ³šæãã
JavaScriptã§éåæã³ãŒãããã¹ãããããšã¯å°é£ãªå ŽåããããŸãããã¹ããPromiseãObservableãã³ãŒã«ããã¯ãªã©ã®éåææäœãé©åã«åŠçããããšã確èªããŠãã ããã`async/await`ã`done`ã³ãŒã«ããã¯ãªã©ã®é©åãªãã¹ããã¯ããã¯ã䜿çšããŠããã¹ããçµæãã¢ãµãŒãããåã«éåææäœã®å®äºãåŸ ã€ããã«ããŠãã ããã
ãŸããéåæã³ãŒãã§çºçããå¯èœæ§ã®ããç«¶åç¶æ ãã¿ã€ãã³ã°ã®åé¡ã«ã泚æããŠãã ããããããã®ã·ããªãªãç¹ã«ã¿ãŒã²ããã«ãããã¹ããæžããã¢ãžã¥ãŒã«ããããã®çš®ã®åé¡ã«å¯ŸããŠå埩åãããããšã確èªããŠãã ããã
10. 100%ã®ã«ãã¬ããžã«åºå·ããªã
é«ãã³ãŒãã«ãã¬ããžãç®æãããšã¯è¯ãç®æšã§ããã100%ã®ã«ãã¬ããžãéæããããšã«åºå·ããã®ã¯é广ã«ãªãå¯èœæ§ããããŸããã³ãŒãã®ãã¹ãŠã®è¡ããã¹ãããããšãçŸå®çã§ãªããè²»çšå¯Ÿå¹æãæªãå ŽåããããŸããäŸãã°ãäžéšã®ã³ãŒãã¯ãã®è€éããå€éšãªãœãŒã¹ãžã®äŸåã®ããã«ãã¹ããé£ããå ŽåããããŸãã
ã³ãŒãã®æãéèŠã§è€éãªéšåããã¹ãããããšã«éäžãããã¹ãŠã®ã¢ãžã¥ãŒã«ã§100%ã®ã«ãã¬ããžãéæããããšã«ããŸãå¿é ããªãã§ãã ãããã³ãŒãã«ãã¬ããžã¯å€ãã®ææšã®äžã®1ã€ã«éããã絶察çãªã«ãŒã«ãšããŠã§ã¯ãªããã¬ã€ããšããŠäœ¿çšãããã¹ãã§ããããšãå¿ããªãã§ãã ããã
CI/CDãã€ãã©ã€ã³ã«ãããã³ãŒãã«ãã¬ããž
CI/CDïŒç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³/ç¶ç¶çãããã€ã¡ã³ãïŒãã€ãã©ã€ã³ã«ã³ãŒãã«ãã¬ããžãçµ±åããããšã¯ãã³ãŒãããããã€ãããåã«ç¹å®ã®åè³ªåºæºãæºãããŠããããšãä¿èšŒãã匷åãªæ¹æ³ã§ãã以äžã«ãã®æ¹æ³ã瀺ããŸãã
- ã³ãŒãã«ãã¬ããžçæã®èšå®ïŒ åãã«ããŸãã¯ãã¹ãå®è¡åŸã«èªåçã«ã³ãŒãã«ãã¬ããžã¬ããŒããçæããããã«CI/CDã·ã¹ãã ãèšå®ããŸããããã¯éåžžãã³ãŒãã«ãã¬ããžãæå¹ã«ããŠãã¹ããå®è¡ããã¹ãããããã«ãã¹ã¯ãªããã«è¿œå ããããšãå«ã¿ãŸãïŒäŸïŒJestã§`npm test -- --coverage`ïŒã
- ã«ãã¬ããžã®ãããå€ã®èšå®ïŒ ãããžã§ã¯ãã®æå°ã³ãŒãã«ãã¬ããžãããå€ãå®çŸ©ããŸãããããã®ãããå€ã¯ãè¡ã«ãã¬ããžãåå²ã«ãã¬ããžã颿°ã«ãã¬ããžãªã©ã®æå°èš±å®¹ã«ãã¬ããžã¬ãã«ã衚ããŸããéåžžããããã®ãããå€ã¯ã³ãŒãã«ãã¬ããžããŒã«ã®èšå®ãã¡ã€ã«ã§æ§æã§ããŸãã
- ã«ãã¬ããžã«åºã¥ããŠãã«ãã倱æãããïŒ ã³ãŒãã«ãã¬ããžãå®çŸ©ããããããå€ãäžåã£ãå Žåã«ãã«ãã倱æãããããã«CI/CDã·ã¹ãã ãèšå®ããŸããããã«ããããã¹ãã«ãã¬ããžãäžååãªã³ãŒããæ¬çªç°å¢ã«ãããã€ãããã®ãé²ããŸãã
- ã«ãã¬ããžçµæã®ã¬ããŒãïŒ ã³ãŒãã«ãã¬ããžããŒã«ãCI/CDã·ã¹ãã ãšçµ±åããŠãã«ãã¬ããžçµæãæç¢ºã§ã¢ã¯ã»ã¹ãããã圢åŒã§è¡šç€ºããŸããããã«ãããéçºè ã¯ã«ãã¬ããžã®åŸåãç°¡åã«è¿œè·¡ããæ¹åãå¿ èŠãªé åãç¹å®ã§ããŸãã
- ã«ãã¬ããžãããžã®äœ¿çšïŒ ãããžã§ã¯ãã®READMEãã¡ã€ã«ãCI/CDããã·ã¥ããŒãã«ã³ãŒãã«ãã¬ããžãããžã衚瀺ããŸãããããã®ãããžã¯ãçŸåšã®ã³ãŒãã«ãã¬ããžã¹ããŒã¿ã¹ã®èŠèŠçãªã€ã³ãžã±ãŒã¿ãæäŸããäžç®ã§ã«ãã¬ããžã¬ãã«ãç£èŠããããããŸããCoverallsãCodecovãªã©ã®ãµãŒãã¹ããããã®ãããžãçæã§ããŸãã
äŸïŒGitHub ActionsãšJestãCodecovã䜿çšïŒïŒ
`.github/workflows/ci.yml`ãã¡ã€ã«ãäœæããŸãïŒ
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 16
uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Install dependencies
run: npm install
- name: Run tests with coverage
run: npm test -- --coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }} # Required if the repository is private
fail_ci_if_error: true
verbose: true
ãã©ã€ããŒããªããžããªã䜿çšããŠããå Žåã¯ãGitHubãªããžããªã®èšå®ã§`CODECOV_TOKEN`ã·ãŒã¯ã¬ãããèšå®ããŠãã ããã
ã³ãŒãã«ãã¬ããžã®ããããèœãšã穎ãšãã®åé¿æ¹æ³
ã³ãŒãã«ãã¬ããžã¯è²ŽéãªããŒã«ã§ããããã®éçãšæœåšçãªèœãšã穎ãèªèããããšãéèŠã§ãã以äžã«é¿ããã¹ãäžè¬çãªééããããã€ã玹ä»ããŸãã
- äœã«ãã¬ããžé åã®ç¡èŠïŒ å šäœçãªã«ãã¬ããžãå¢ããããšã«éäžããäžè²«ããŠã«ãã¬ããžãäœãç¹å®ã®é åãèŠèœãšããã¡ã§ãããããã®é åã«ã¯ããã¹ããé£ããè€éãªããžãã¯ããšããžã±ãŒã¹ãå«ãŸããŠããããšããããããŸããããå€ãã®åŽåãå¿ èŠã§ãã£ãŠãããããã®é åã®ã«ãã¬ããžãæ¹åããããšãåªå ããŠãã ããã
- äºçްãªãã¹ãã®äœæïŒ æå³ã®ããã¢ãµãŒã·ã§ã³ãè¡ããã«åã«ã³ãŒããå®è¡ããã ãã®ãã¹ããæžããšãå®éã«ã³ãŒãã®å質ãåäžãããããšãªããã«ãã¬ããžã人çºçã«èšããŸããããšãã§ããŸããããŸããŸãªæ¡ä»¶äžã§ã®ã³ãŒãã®æ¯ãèãã®æ£ãããæ€èšŒãããã¹ããæžãããšã«éäžããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°ã®ãã¹ããããªãïŒ ãšã©ãŒãã³ããªã³ã°ã³ãŒãã¯ãã¹ããé£ããããšãå€ãã§ãããã¢ããªã±ãŒã·ã§ã³ã®å ç¢æ§ã確ä¿ããããã«ã¯äžå¯æ¬ ã§ãããšã©ãŒæ¡ä»¶ãã·ãã¥ã¬ãŒãããã³ãŒããããããé©åã«åŠçããããšïŒäŸïŒäŸå€ã®ã¹ããŒããšã©ãŒã®ãã°èšé²ãæçãªã¡ãã»ãŒãžã®è¡šç€ºïŒãæ€èšŒãããã¹ããæžããŠãã ããã
- ãŠããããã¹ãã®ã¿ã«äŸåããïŒ ãŠããããã¹ãã¯åã ã®ã¢ãžã¥ãŒã«ã®æ£ãããæ€èšŒããããã«éèŠã§ãããçµ±åãããã·ã¹ãã ã§ã¢ãžã¥ãŒã«ãæ£ãã飿ºããŠåäœããããšãä¿èšŒãããã®ã§ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³å šäœãšããŠæ©èœããããšã確èªããããã«ããŠããããã¹ããçµ±åãã¹ããE2Eãã¹ãã§è£å®ããŠãã ããã
- ã³ãŒãã®è€éããç¡èŠããïŒ ã³ãŒãã«ãã¬ããžã¯ããã¹ã察象ã®ã³ãŒãã®è€éããèæ ®ããŸãããã«ãã¬ããžãé«ãåçŽãªé¢æ°ã¯ãåãã«ãã¬ããžã®è€éãªé¢æ°ããããªã¹ã¯ãäœããããããŸãããéçè§£æããŒã«ã䜿çšããŠãç¹ã«è€éã§ãã培åºçãªãã¹ããå¿ èŠãªã³ãŒãé åãç¹å®ããŠãã ããã
- ã«ãã¬ããžãããŒã«ã§ã¯ãªãç®æšãšããŠæ±ãïŒ ã³ãŒãã«ãã¬ããžã¯ããã¹ãã®åŽåãå°ãããã®ããŒã«ãšããŠäœ¿çšãããã¹ãã§ãããããèªäœãç®æšã§ã¯ãããŸããããã¹ãã®å質ãé¢é£æ§ãç ç²ã«ããŠãŸã§ã100%ã®ã«ãã¬ããžããã¿ããã«ç®æããªãã§ãã ããããããã«äœãã«ãã¬ããžãåãå ¥ããããšã«ãªã£ããšããŠããçã®äŸ¡å€ãæäŸããæå³ã®ãããã¹ããæžãããšã«éäžããŠãã ããã
æ°å€ã®å ãžïŒãã¹ãã®å®æ§çåŽé¢
ã³ãŒãã«ãã¬ããžã®ãããªå®éçææšã¯ééããªãæçšã§ããããœãããŠã§ã¢ãã¹ãã®å®æ§çãªåŽé¢ãå¿ããªãããšãéèŠã§ããã³ãŒãã«ãã¬ããžã¯ãã©ã®ã³ãŒããå®è¡ãããŠããããæããŠãããŸããããã®ã³ãŒããã©ãã ãããŸããã¹ããããŠãããã¯æããŠãããŸããã
ãã¹ãèšèšïŒ ãã¹ãã®å質ã¯éãããéèŠã§ããé©åã«èšèšããããã¹ãã¯ãçŠç¹ãçµãããç¬ç«ããŠãããç¹°ãè¿ãå¯èœã§ããšããžã±ãŒã¹ãå¢çæ¡ä»¶ããšã©ãŒæ¡ä»¶ãå«ãå¹ åºãã·ããªãªãã«ããŒããŸããäžé©åã«èšèšããããã¹ãã¯ãè匱ã§ä¿¡é Œæ§ãäœãã誀ã£ãå®å¿æãäžããå¯èœæ§ããããŸãã
ãã¹ãå®¹ææ§ïŒ ãã¹ããé£ããã³ãŒãã¯ããã°ãã°èšèšãäžååã§ããããšã®å åã§ããã¢ãžã¥ãŒã«åãããççµåã§ããã¹ãã®ããã«åé¢ããããã³ãŒããæžãããšãç®æããŠãã ãããäŸåæ§æ³šå ¥ãã¢ãã¯ããã®ä»ã®ãã¯ããã¯ã䜿çšããŠãã³ãŒãã®ãã¹ãå®¹ææ§ãåäžãããŠãã ããã
ããŒã æåïŒ åŒ·åãªãã¹ãæåã¯ãé«å質ã®ãœãããŠã§ã¢ãæ§ç¯ããããã«äžå¯æ¬ ã§ããéçºè ãæ©æã«é »ç¹ã«ãã¹ããæžãããã¹ããã³ãŒãããŒã¹ã®ç¬¬äžçŽã®åžæ°ãšããŠæ±ããç¶ç¶çã«ãã¹ãã¹ãã«ãåäžãããããšã奚å±ããŠãã ããã
çµè«
JavaScriptã¢ãžã¥ãŒã«ã®ã³ãŒãã«ãã¬ããžã¯ãã³ãŒãã®å質ãšä¿¡é Œæ§ãåäžãããããã®åŒ·åãªããŒã«ã§ããäž»èŠãªææšãçè§£ããé©åãªããŒã«ã䜿çšãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã³ãŒãã«ãã¬ããžã掻çšããŠæªãã¹ãé åãç¹å®ãããã°ã®ãªã¹ã¯ãäœæžãããªãã¡ã¯ã¿ãªã³ã°ãä¿é²ããããšãã§ããŸããããããã³ãŒãã«ãã¬ããžã¯å€ãã®ææšã®äžã®1ã€ã«éããã絶察çãªã«ãŒã«ãšããŠã§ã¯ãªããã¬ã€ããšããŠäœ¿çšãããã¹ãã§ããããšãå¿ããªãã§ãã ãããã³ãŒãã培åºçã«å®è¡ããéèŠãªãšããžã±ãŒã¹ãã«ããŒããæå³ã®ãããã¹ããæžãããšã«éäžããã³ãŒãã«ãã¬ããžãCI/CDãã€ãã©ã€ã³ã«çµ±åããŠãã³ãŒããæ¬çªç°å¢ã«ãããã€ãããåã«ç¹å®ã®åè³ªåºæºãæºãããŠããããšã確èªããŠãã ãããå®éçææšãšå®æ§çèæ ®äºé ã®ãã©ã³ã¹ãåãããšã§ãé«å質ã®JavaScriptã¢ãžã¥ãŒã«ãæäŸããå ç¢ã§å¹æçãªãã¹ãæŠç¥ãæ§ç¯ã§ããŸãã
ã³ãŒãã«ãã¬ããžãå«ãå ç¢ãªãã¹ããã©ã¯ãã£ã¹ãå®è£ ããããšã§ãäžçäžã®ããŒã ããœãããŠã§ã¢ã®å質ãåäžãããéçºã³ã¹ããåæžãããŠãŒã¶ãŒæºè¶³åºŠãé«ããããšãã§ããŸãããœãããŠã§ã¢ãéçºã»ãã¹ãããéã«ã°ããŒãã«ãªèãæ¹ãåãå ¥ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãåœéçãªãªãŒãã£ãšã³ã¹ã®å€æ§ãªããŒãºã«å¿ããããšãä¿èšŒããŸãã