åé¢ãŠããããã¹ããçšããããã³ããšã³ãã³ã³ããŒãã³ããã¹ãã®åŸ¹åºè§£èª¬ãå ç¢ã§ä¿å®æ§ã®é«ãUIãä¿èšŒããããã®ãã¹ããã©ã¯ãã£ã¹ãããŒã«ããã¯ããã¯ãåŠã³ãŸãã
ããã³ããšã³ãã³ã³ããŒãã³ããã¹ãïŒå ç¢ãªUIã®ããã®åé¢ãŠããããã¹ããã¹ã¿ãŒã¬ã€ã
é²åãç¶ããWebéçºã®äžçã«ãããŠãå ç¢ã§ä¿å®æ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒUIïŒãæ§ç¯ããããšã¯æãéèŠã§ããããã³ããšã³ãã³ã³ããŒãã³ããã¹ããç¹ã«åé¢ããããŠããããã¹ãã¯ããã®ç®æšãéæããäžã§éèŠãªåœ¹å²ãæãããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãããã³ããšã³ãã³ã³ããŒãã³ãã®åé¢ãŠããããã¹ãã«é¢é£ããæŠå¿µãå©ç¹ããã¯ããã¯ãããŒã«ãæ¢æ±ããé«å質ã§ä¿¡é Œæ§ã®é«ãUIãæ§ç¯ããåãäžããŸãã
åé¢ãŠããããã¹ããšã¯ïŒ
äžè¬çã«ããŠããããã¹ããšã¯ãã·ã¹ãã ã®ä»ã®éšåããåé¢ããŠãåã ã®ã³ãŒãåäœããã¹ãããããšã§ããããã³ããšã³ãã³ã³ããŒãã³ããã¹ãã®æèã§ã¯ãããã¯ãã¿ã³ããã©ãŒã å ¥åãã¢ãŒãã«ãªã©ã®åäžã®ã³ã³ããŒãã³ããããã®äŸåé¢ä¿ãåšå²ã®ã³ã³ããã¹ãããç¬ç«ããŠãã¹ãããããšãæå³ããŸããåé¢ããããŠããããã¹ãã¯ãå€éšã®äŸåé¢ä¿ãæç€ºçã«ã¢ãã¯ãŸãã¯ã¹ã¿ãåããããšã§ããããããã«äžæ©é²ããã³ã³ããŒãã³ãã®åäœãçŽç²ã«ããèªäœã®äŸ¡å€ã§è©äŸ¡ãããããã«ããŸãã
ããã¯ãäžã€ã®ã¬ãŽãããã¯ããã¹ããããããªãã®ã ãšèããŠãã ããããã®ãããã¯ããä»ã®ã©ã®ãããã¯ã«æ¥ç¶ãããŠãããã«é¢ããããåç¬ã§æ£ããæ©èœããããšã確èªãããã®ã§ããæ¬ é¥ã®ãããããã¯ããã¬ãŽã®äœåã®ä»ã®å Žæã§åé¡ãåŒãèµ·ããããšã¯æãŸãããããŸããã
åé¢ãŠããããã¹ãã®äž»ãªç¹åŸŽïŒ
- åäžã³ã³ããŒãã³ããžã®éäžïŒ åãã¹ãã¯ç¹å®ã®1ã€ã®ã³ã³ããŒãã³ãã察象ãšãã¹ãã§ãã
- äŸåé¢ä¿ããã®åé¢ïŒ å€éšã®äŸåé¢ä¿ïŒäŸïŒAPIåŒã³åºããç¶æ 管çã©ã€ãã©ãªãä»ã®ã³ã³ããŒãã³ãïŒã¯ã¢ãã¯ãŸãã¯ã¹ã¿ãåãããŸãã
- é«éãªå®è¡ïŒ åé¢ãã¹ãã¯è¿ éã«å®è¡ãããã¹ãã§ãããéçºäžã«é »ç¹ãªãã£ãŒãããã¯ãå¯èœã«ããŸãã
- 決å®è«çãªçµæïŒ åãå ¥åãäžããããå Žåããã¹ãã¯åžžã«åãåºåãçæãã¹ãã§ããããã¯é©åãªåé¢ãšã¢ãã¯ã«ãã£ãŠéæãããŸãã
- æç¢ºãªã¢ãµãŒã·ã§ã³ïŒ ãã¹ãã¯æåŸ ãããåäœãæç¢ºã«å®çŸ©ããã³ã³ããŒãã³ããæåŸ éãã«åäœããããšãã¢ãµãŒãïŒè¡šæïŒãã¹ãã§ãã
ãªãããã³ããšã³ãã³ã³ããŒãã³ãã§åé¢ãŠããããã¹ããæ¡çšããã®ãïŒ
ããã³ããšã³ãã³ã³ããŒãã³ãã«åé¢ãŠããããã¹ããå°å ¥ããããšã«ã¯ãå€ãã®å©ç¹ããããŸãã
1. ã³ãŒãå質ã®åäžãšãã°ã®åæž
åã³ã³ããŒãã³ããåé¢ããŠç¶¿å¯ã«ãã¹ãããããšã§ãéçºãµã€ã¯ã«ã®æ©ã段éã§ãã°ãç¹å®ããä¿®æ£ããããšãã§ããŸããããã«ãããã³ãŒãå質ãåäžããã³ãŒãããŒã¹ãé²åããã«ã€ããŠãªã°ã¬ãã·ã§ã³ïŒæ©èœäœäžïŒãçºçããå¯èœæ§ãæžå°ããŸãããã°ã¯æ©ãèŠã€ããã»ã©ä¿®æ£ã³ã¹ããå®ããé·æçã«ã¯æéãšãªãœãŒã¹ãç¯çŽã§ããŸãã
2. ã³ãŒãã®ä¿å®æ§ãšãªãã¡ã¯ã¿ãªã³ã°ã®æ¹å
ããæžããããŠããããã¹ãã¯çããããã¥ã¡ã³ããšããŠæ©èœããåã³ã³ããŒãã³ãã®æåŸ ãããåäœãæç¢ºã«ããŸããã³ã³ããŒãã³ãããªãã¡ã¯ã¿ãªã³ã°ãŸãã¯å€æŽããå¿ èŠãããå ŽåããŠããããã¹ãã¯ã»ãŒããã£ããããæäŸãã倿Žãæ¢åã®æ©èœãæå³ããå£ããªãããšãä¿èšŒããŸããããã¯ããã¹ãŠã®ã³ã³ããŒãã³ãã®è€éããçè§£ããããšãå°é£ãªå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã§ç¹ã«äŸ¡å€ããããŸããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã å šäœã§äœ¿çšãããããã²ãŒã·ã§ã³ããŒããªãã¡ã¯ã¿ãªã³ã°ããããšãæ³åããŠã¿ãŠãã ãããå æ¬çãªãŠããããã¹ãã¯ããªãã¡ã¯ã¿ãªã³ã°ããã§ãã¯ã¢ãŠããã¢ã«ãŠã³ã管çã«é¢é£ããæ¢åã®ãŠãŒã¶ãŒã¯ãŒã¯ãããŒãå£ããªãããšãä¿èšŒããŸãã
3. éçºãµã€ã¯ã«ã®é«éå
åé¢ãŠããããã¹ãã¯ãéåžžãçµ±åãã¹ãããšã³ãããŒãšã³ããã¹ããããã¯ããã«é«éã«å®è¡ãããŸããããã«ãããéçºè ã¯èªèº«ã®å€æŽã«å¯Ÿããè¿ éãªãã£ãŒãããã¯ãåŸãããšãã§ããéçºããã»ã¹ãå éããŸãããã£ãŒãããã¯ã«ãŒããéãã»ã©ãçç£æ§ãåäžããåžå Žæå ¥ãŸã§ã®æéãççž®ãããŸãã
4. ã³ãŒã倿Žã«å¯Ÿããèªä¿¡ã®åäž
å æ¬çãªãŠããããã¹ãã¹ã€ãŒããæã€ããšã§ãéçºè ã¯ã³ãŒãããŒã¹ã«å€æŽãå ããéã«ãã倧ããªèªä¿¡ãæã€ããšãã§ããŸãããã¹ãããªã°ã¬ãã·ã§ã³ãæ€åºããŠããããšç¥ã£ãŠãããããæ¢åã®æ©èœãå£ãæããªããæ°æ©èœã®å®è£ ãæ¹åã«éäžã§ããŸããããã¯ãé »ç¹ãªã€ãã¬ãŒã·ã§ã³ãšãããã€ã¡ã³ããåžžæ ã§ããã¢ãžã£ã€ã«éçºç°å¢ã«ãããŠäžå¯æ¬ ã§ãã
5. ãã¹ãé§åéçºïŒTDDïŒã®ä¿é²
åé¢ãŠããããã¹ãã¯ããã¹ãé§åéçºïŒTDDïŒã®åºç€ã§ããTDDã§ã¯ãå®éã®ã³ãŒããæžãåã«ãã¹ããæžããŸããããã«ãããã³ã³ããŒãã³ãã®èŠä»¶ãšèšèšã«ã€ããŠäºåã«èããããšã匷å¶ãããŸããããã¯ãããçŠç¹ãçµããããã¹ãå¯èœãªã³ãŒãã«ã€ãªãããŸããäŸãã°ããŠãŒã¶ãŒã®å Žæã«åºã¥ããŠé貚ã衚瀺ããã³ã³ããŒãã³ããéçºããå ŽåãTDDã䜿çšãããšããŸããã±ãŒã«ã«å¿ããŠéè²šãæ£ãããã©ãŒããããããŠããããšãã¢ãµãŒããããã¹ããæžãå¿ èŠããããŸãïŒäŸïŒãã©ã³ã¹ã§ã¯ãŠãŒããæ¥æ¬ã§ã¯åãã¢ã¡ãªã«ã§ã¯ç±³ãã«ïŒã
åé¢ãŠããããã¹ãã®å®è·µçãªãã¯ããã¯
åé¢ãŠããããã¹ãã广çã«å®è£ ããã«ã¯ãé©åãªã»ããã¢ãããã¢ãã¯æè¡ãæç¢ºãªã¢ãµãŒã·ã§ã³ã®çµã¿åãããå¿ èŠã§ãã以äžã«äž»èŠãªãã¯ããã¯ããŸãšããŸãã
1. é©åãªãã¹ããã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã®éžæ
ããã³ããšã³ãéçºã«ã¯ãããã€ãã®åªãããã¹ããã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªãå©çšå¯èœã§ãã人æ°ã®ããéžæè¢ã«ã¯ä»¥äžã®ãããªãã®ããããŸãã
- JestïŒ äœ¿ãããããçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãåªããããã©ãŒãã³ã¹ã§ç¥ããããåºã䜿çšãããŠããJavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ã§ããç¹ã«Reactã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãããä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã䜿çšã§ããŸãã
- MochaïŒ æè»ã§æ¡åŒµå¯èœãªãã¹ããã¬ãŒã ã¯ãŒã¯ã§ãç¬èªã®ã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªãã¢ãã¯ããŒã«ãéžæã§ããŸããã¢ãµãŒã·ã§ã³ã«ã¯Chaiãã¢ãã¯ã«ã¯Sinon.JSãšçµã¿åãããŠäœ¿çšãããããšãå€ãã§ãã
- JasmineïŒ ãã¹ããæžãããã®ã¯ãªãŒã³ã§èªã¿ãããæ§æãæäŸããããã€ãã¢é§åéçºïŒBDDïŒãã¬ãŒã ã¯ãŒã¯ã§ããçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãå«ãŸããŠããŸãã
- CypressïŒ äž»ã«ãšã³ãããŒãšã³ããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠç¥ãããŠããŸãããCypressã¯ã³ã³ããŒãã³ããã¹ãã«ã䜿çšã§ããŸããå®éã®ãã©ãŠã¶ç°å¢ã§ã³ã³ããŒãã³ããšå¯Ÿè©±ããããã®åŒ·åã§çŽæçãªAPIãæäŸããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®éžæã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºãšããŒã ã®å¥œã¿ã«ãããŸããJestã¯ããã®äœ¿ãããããšå æ¬çãªæ©èœã»ããã®ãããå€ãã®ãããžã§ã¯ãã«ãšã£ãŠè¯ãåºçºç¹ã§ãã
2. äŸåé¢ä¿ã®ã¢ãã¯ãšã¹ã¿ã
ã¢ãã¯ãšã¹ã¿ãã¯ããŠããããã¹ãäžã«ã³ã³ããŒãã³ããåé¢ããããã®äžå¯æ¬ ãªãã¯ããã¯ã§ããã¢ãã¯ã¯ãå®éã®äŸåé¢ä¿ã®åäœãæš¡å£ããã·ãã¥ã¬ãŒãããããªããžã§ã¯ããäœæããããšãå«ã¿ãã¹ã¿ãã¯ãäŸåé¢ä¿ãäºåå®çŸ©ãããå€ãè¿ãåçŽåãããããŒãžã§ã³ã«çœ®ãæããããšãå«ã¿ãŸãã
ã¢ãã¯ãã¹ã¿ããå¿ èŠãšãªãäžè¬çãªã·ããªãªïŒ
- APIåŒã³åºãïŒ ãã¹ãäžã«å®éã®ãããã¯ãŒã¯ãªã¯ãšã¹ããè¡ããªãããã«APIåŒã³åºããã¢ãã¯ããŸããããã«ããããã¹ããé«éã§ä¿¡é Œæ§ãé«ããå€éšãµãŒãã¹ããç¬ç«ããŠããããšãä¿èšŒãããŸãã
- ç¶æ 管çã©ã€ãã©ãªïŒäŸïŒRedux, VuexïŒïŒ ã¹ãã¢ãšã¢ã¯ã·ã§ã³ãã¢ãã¯ããŠããã¹ã察象ã®ã³ã³ããŒãã³ãã®ç¶æ ãå¶åŸ¡ããŸãã
- ãµãŒãããŒãã£ã©ã€ãã©ãªïŒ ã³ã³ããŒãã³ããäŸåããå€éšã©ã€ãã©ãªãã¢ãã¯ããŠããã®åäœãåé¢ããŸãã
- ä»ã®ã³ã³ããŒãã³ãïŒ ãã¹ã察象ã®èŠªã³ã³ããŒãã³ãã®åäœã«ã®ã¿çŠç¹ãåœãŠãããã«ãåã³ã³ããŒãã³ããã¢ãã¯ããããšãå¿ èŠãªå ŽåããããŸãã
Jestã䜿çšããŠäŸåé¢ä¿ãã¢ãã¯ããæ¹æ³ã®äŸãããã€ã瀺ããŸãã
// Mocking a module
jest.mock('./api');
// Mocking a function within a module
api.fetchData = jest.fn().mockResolvedValue({ data: 'mocked data' });
3. æç¢ºã§æå³ã®ããã¢ãµãŒã·ã§ã³ã®èšè¿°
ã¢ãµãŒã·ã§ã³ã¯ãŠããããã¹ãã®å¿èéšã§ãããããã¯ã³ã³ããŒãã³ãã®æåŸ ãããåäœãå®çŸ©ãããããæåŸ éãã«åäœããããšãæ€èšŒããŸããæç¢ºã§ãç°¡æœã§ãçè§£ããããã¢ãµãŒã·ã§ã³ãæžããŸãããã
äžè¬çãªã¢ãµãŒã·ã§ã³ã®äŸãããã€ã瀺ããŸãã
- èŠçŽ ã®ååšã確èªããïŒ
expect(screen.getByText('Hello World')).toBeInTheDocument();
- å
¥åãã£ãŒã«ãã®å€ã確èªããïŒ
expect(inputElement.value).toBe('initial value');
- 颿°ãåŒã³åºããããã確èªããïŒ
expect(mockFunction).toHaveBeenCalled();
- 颿°ãç¹å®ã®åŒæ°ã§åŒã³åºããããã確èªããïŒ
expect(mockFunction).toHaveBeenCalledWith('argument1', 'argument2');
- èŠçŽ ã®CSSã¯ã©ã¹ã確èªããïŒ
expect(element).toHaveClass('active');
äœããã¹ãããŠããã®ããæç¢ºã«ããããã«ãã¢ãµãŒã·ã§ã³ã«ã¯èª¬æçãªèšèã䜿ããŸããããäŸãã°ãåã«é¢æ°ãåŒã³åºãããããšãã¢ãµãŒãããã®ã§ã¯ãªããæ£ããåŒæ°ã§åŒã³åºãããããšãã¢ãµãŒãããŸãã
4. ã³ã³ããŒãã³ãã©ã€ãã©ãªãšStorybookã®æŽ»çš
ã³ã³ããŒãã³ãã©ã€ãã©ãªïŒäŸïŒMaterial UI, Ant Design, BootstrapïŒã¯ãéçºãå€§å¹ ã«ã¹ããŒãã¢ããã§ããåå©çšå¯èœãªUIã³ã³ããŒãã³ããæäŸããŸããStorybookã¯ãUIã³ã³ããŒãã³ããåé¢ããŠéçºãã玹ä»ããããã®äººæ°ã®ããããŒã«ã§ãã
ã³ã³ããŒãã³ãã©ã€ãã©ãªã䜿çšããå ŽåããŠããããã¹ãã§ã¯ãã³ã³ããŒãã³ããã©ã€ãã©ãªã³ã³ããŒãã³ããæ£ãã䜿çšããŠããããšãããã³ç¹å®ã®ã³ã³ããã¹ãã§æåŸ ã©ããã«åäœããŠããããšãæ€èšŒããããšã«çŠç¹ãåœãŠãŸããäŸãã°ãäžççã«èªç¥ãããŠããæ¥ä»å ¥åã©ã€ãã©ãªã䜿çšããå Žåãç°ãªãåœã§æ¥ä»åœ¢åŒãæ£ãããã©ããããã¹ãã§ããŸãïŒäŸïŒè±åœã§ã¯DD/MM/YYYYãç±³åœã§ã¯MM/DD/YYYYïŒã
Storybookã¯ãã¹ããã¬ãŒã ã¯ãŒã¯ãšçµ±åããããšãã§ããStorybookã®ã¹ããŒãªãŒå ã®ã³ã³ããŒãã³ããšçŽæ¥å¯Ÿè©±ãããŠããããã¹ããæžãããšãã§ããŸããããã«ãããã³ã³ããŒãã³ããæ£ããã¬ã³ããªã³ã°ãããæåŸ ã©ããã«åäœããŠããããšãèŠèŠçã«æ€èšŒããæ¹æ³ãæäŸãããŸãã
5. ãã¹ãé§åéçºïŒTDDïŒã¯ãŒã¯ãããŒ
åè¿°ã®ããã«ãTDDã¯ã³ãŒãã®å質ãšãã¹ãå®¹ææ§ãå€§å¹ ã«åäžãããããšãã§ãã匷åãªéçºææ³ã§ããTDDã¯ãŒã¯ãããŒã¯ä»¥äžã®ã¹ããããå«ã¿ãŸãã
- 倱æãããã¹ããæžãïŒ ããããæ§ç¯ããã³ã³ããŒãã³ãã®æåŸ ãããåäœãå®çŸ©ãããã¹ããæžããŸããã³ã³ããŒãã³ãã¯ãŸã ååšããªãããããã®ãã¹ãã¯æåã¯å€±æããŸãã
- ãã¹ãããã¹ãããããã®æå°éã®ã³ãŒããæžãïŒ ãã¹ãããã¹ãããããã«å¯èœãªéãæãåçŽãªã³ãŒããæžããŸãããã®æ®µéã§ã¯ãã³ãŒããå®ç§ã«ããããšã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã
- ãªãã¡ã¯ã¿ãªã³ã°ïŒ ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãèšèšãšå¯èªæ§ãåäžãããŸãããªãã¡ã¯ã¿ãªã³ã°åŸããã¹ãŠã®ãã¹ãããã¹ãç¶ããããšã確èªããŸãã
- ç¹°ãè¿ãïŒ ã³ã³ããŒãã³ãã®æ°ããæ©èœãåäœããšã«ã¹ããã1ã3ãç¹°ãè¿ããŸãã
TDDã¯ãã³ã³ããŒãã³ãã®èŠä»¶ãšèšèšã«ã€ããŠäºåã«èããã®ã«åœ¹ç«ã¡ãããçŠç¹ãçµããããã¹ãå¯èœãªã³ãŒãã«ã€ãªãããŸãããã®ã¯ãŒã¯ãããŒã¯ããšããžã±ãŒã¹ãå«ããã¹ãŠã®ã±ãŒã¹ãã«ããŒãããã¹ããæžãããšã奚å±ããã³ãŒãã«å¯Ÿããé«ãã¬ãã«ã®ä¿¡é Œæ§ãæäŸããå æ¬çãªãŠããããã¹ãã¹ã€ãŒãããããããããäžçäžã§æçã§ãã
é¿ããã¹ãäžè¬çãªèœãšã穎
åé¢ãŠããããã¹ãã¯äŸ¡å€ã®ããå®è·µã§ãããããã€ãã®äžè¬çãªèœãšãç©Žã«æ³šæããããšãéèŠã§ãã
1. éå°ãªã¢ãã¯
ããŸãã«ãå€ãã®äŸåé¢ä¿ãã¢ãã¯ãããšããã¹ããèããªããç¶æãå°é£ã«ãªãå¯èœæ§ããããŸããã»ãšãã©ãã¹ãŠãã¢ãã¯ããŠããå Žåãå®è³ªçã«ã¯å®éã®ã³ã³ããŒãã³ãã§ã¯ãªããã¢ãã¯ããã¹ãããŠããããšã«ãªããŸããåé¢ãšçŸå®æ§ã®éã§ãã©ã³ã¹ãåãããã«åªããŠãã ãããã¿ã€ãã®ããã«äœ¿çšããå¿ èŠã®ããã¢ãžã¥ãŒã«ã誀ã£ãŠã¢ãã¯ããŠããŸãå¯èœæ§ããããããã«ããå€ãã®ãšã©ãŒãçºçãããããã°æã«æ··ä¹±ãæãå¯èœæ§ããããŸããåªããIDE/ãªã³ã¿ãŒã¯ãããæ€åºããã¯ãã§ãããéçºè ã¯ãã®å¯èœæ§ã«æ³šæããå¿ èŠããããŸãã
2. å®è£ 詳现ã®ãã¹ã
倿Žãããå¯èœæ§ãé«ãå®è£ 詳现ããã¹ãããããšã¯é¿ããŠãã ãããã³ã³ããŒãã³ãã®å ¬éAPIãšãã®æåŸ ãããåäœã®ãã¹ãã«çŠç¹ãåœãŠãŠãã ãããå®è£ 詳现ããã¹ããããšããã¹ããè匱ã«ãªããã³ã³ããŒãã³ãã®åäœãåããŸãŸã§ãã£ãŠããå®è£ ã倿Žããããã³ã«ãã¹ããæŽæ°ããå¿ èŠããããŸãã
3. ãšããžã±ãŒã¹ã®è»œèŠ
ãã¹ãŠã®å¯èœãªãšããžã±ãŒã¹ãšãšã©ãŒæ¡ä»¶ããã¹ãããããã«ããŠãã ãããããã«ãããéåžžã®ç¶æ³ã§ã¯æããã«ãªããªããããããªããã°ãç¹å®ããä¿®æ£ããã®ã«åœ¹ç«ã¡ãŸããäŸãã°ãã³ã³ããŒãã³ãããŠãŒã¶ãŒå ¥åãåãå ¥ããå Žåã空ã®å ¥åãç¡å¹ãªæåãç°åžžã«é·ãæååã§ã©ã®ããã«åäœãããããã¹ãããããšãéèŠã§ãã
4. é·ãããŠè€éãªãã¹ãã®èšè¿°
ãã¹ãã¯çããçŠç¹ãçµã£ããã®ã«ããŠãã ãããé·ããŠè€éãªãã¹ãã¯ãèªã¿ãçè§£ããç¶æããã®ãå°é£ã§ãããã¹ããé·ãããå Žåã¯ãããå°ããã管çãããããã¹ãã«åå²ããããšãæ€èšããŠãã ããã
5. ãã¹ãã«ãã¬ããžã®ç¡èŠ
ã³ãŒãã«ãã¬ããžããŒã«ã䜿çšããŠããŠããããã¹ãã§ã«ããŒãããŠããã³ãŒãã®å²åãæž¬å®ããŸããé«ããã¹ãã«ãã¬ããžã¯ã³ãŒãããã°ããªãŒã§ããããšãä¿èšŒãããã®ã§ã¯ãããŸãããããã¹ã掻åã®å®å šæ§ãè©äŸ¡ããããã®è²ŽéãªææšãæäŸããŸããé«ããã¹ãã«ãã¬ããžãç®æããŸãããéã®ããã«è³ªãç ç²ã«ããªãã§ãã ããããã¹ãã¯ãã«ãã¬ããžã®æ°å€ãäžããããã ãã«æžãããã®ã§ã¯ãªããæå³ããã广çã§ãªããã°ãªããŸãããäŸãã°ãSonarQubeã¯äŒæ¥ã§è¯å¥œãªãã¹ãã«ãã¬ããžãç¶æããããã«äžè¬çã«äœ¿çšãããŠããŸãã
ãã¬ãŒãã®ããŒã«
åé¢ãŠããããã¹ãã®èšè¿°ãšå®è¡ãæ¯æŽããããã€ãã®ããŒã«ããããŸãã
- JestïŒ åè¿°ã®éããçµã¿èŸŒã¿ã®ã¢ãã¯æ©èœãåããå æ¬çãªJavaScriptãã¹ããã¬ãŒã ã¯ãŒã¯ã
- MochaïŒ ChaiïŒã¢ãµãŒã·ã§ã³ïŒãSinon.JSïŒã¢ãã¯ïŒãšçµã¿åãããŠäœ¿çšãããããšãå€ããæè»ãªãã¹ããã¬ãŒã ã¯ãŒã¯ã
- ChaiïŒ æ§ã ãªã¢ãµãŒã·ã§ã³ã¹ã¿ã€ã«ïŒäŸïŒshould, expect, assertïŒãæäŸããã¢ãµãŒã·ã§ã³ã©ã€ãã©ãªã
- Sinon.JSïŒ JavaScriptçšã®ã¹ã¿ã³ãã¢ãã³ã®ãã¹ãã¹ãã€ãã¹ã¿ããã¢ãã¯ã©ã€ãã©ãªã
- React Testing LibraryïŒ å®è£ 詳现ã§ã¯ãªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«çŠç¹ãåœãŠããã¹ããæžãããšã奚å±ããã©ã€ãã©ãªã
- Vue Test UtilsïŒ Vue.jsã³ã³ããŒãã³ãã®å ¬åŒãã¹ããŠãŒãã£ãªãã£ã
- Angular Testing LibraryïŒ Angularã³ã³ããŒãã³ãçšã®ã³ãã¥ããã£äž»å°ã®ãã¹ãã©ã€ãã©ãªã
- StorybookïŒ UIã³ã³ããŒãã³ããåé¢ããŠéçºãã玹ä»ããããã®ããŒã«ã§ããã¹ããã¬ãŒã ã¯ãŒã¯ãšçµ±åã§ããŸãã
- IstanbulïŒ ãŠããããã¹ãã§ã«ããŒãããŠããã³ãŒãã®å²åãæž¬å®ããã³ãŒãã«ãã¬ããžããŒã«ã
å®äžçã®äŸ
å®äžçã®ã·ããªãªã§åé¢ãŠããããã¹ããé©çšããæ¹æ³ã«ã€ããŠãããã€ãã®å®è·µçãªäŸãèããŠã¿ãŸãããã
äŸ1ïŒãã©ãŒã å ¥åã³ã³ããŒãã³ãã®ãã¹ã
ç¹å®ã®ã«ãŒã«ïŒäŸïŒã¡ãŒã«åœ¢åŒããã¹ã¯ãŒã匷床ïŒã«åºã¥ããŠãŠãŒã¶ãŒå ¥åãæ€èšŒãããã©ãŒã å ¥åã³ã³ããŒãã³ãããããšããŸãããã®ã³ã³ããŒãã³ããåé¢ããŠãã¹ãããã«ã¯ãAPIåŒã³åºããç¶æ 管çã©ã€ãã©ãªãªã©ã®å€éšäŸåé¢ä¿ãã¢ãã¯ããŸãã
ReactãšJestã䜿çšããç°¡åãªäŸã以äžã«ç€ºããŸãã
// FormInput.jsx
import React, { useState } from 'react';
function FormInput({ validate, onChange }) {
const [value, setValue] = useState('');
const handleChange = (event) => {
const newValue = event.target.value;
setValue(newValue);
onChange(newValue);
};
return (
);
}
export default FormInput;
// FormInput.test.jsx
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import FormInput from './FormInput';
describe('FormInput Component', () => {
it('should update the value when the input changes', () => {
const onChange = jest.fn();
render( );
const inputElement = screen.getByRole('textbox');
fireEvent.change(inputElement, { target: { value: 'test value' } });
expect(inputElement.value).toBe('test value');
expect(onChange).toHaveBeenCalledWith('test value');
});
});
ãã®äŸã§ã¯ãonChange
ããããã£ãã¢ãã¯ããŠãå
¥åã倿Žããããšãã«æ£ããå€ã§åŒã³åºãããããšã確èªããŠããŸãããŸããå
¥åå€ãæ£ããæŽæ°ãããããšãã¢ãµãŒãããŠããŸãã
äŸ2ïŒAPIåŒã³åºããè¡ããã¿ã³ã³ã³ããŒãã³ãã®ãã¹ã
ã¯ãªãã¯ããããšãã«APIåŒã³åºããããªã¬ãŒãããã¿ã³ã³ã³ããŒãã³ããèããŠã¿ãŸãããããã®ã³ã³ããŒãã³ããåé¢ããŠãã¹ãããã«ã¯ããã¹ãäžã«å®éã®ãããã¯ãŒã¯ãªã¯ãšã¹ããè¡ããªãããã«APIåŒã³åºããã¢ãã¯ããŸãã
ReactãšJestã䜿çšããç°¡åãªäŸã以äžã«ç€ºããŸãã
// Button.jsx
import React from 'react';
import { fetchData } from './api';
function Button({ onClick }) {
const handleClick = async () => {
const data = await fetchData();
onClick(data);
};
return (
);
}
export default Button;
// api.js
export const fetchData = async () => {
// Simulating an API call
return new Promise(resolve => {
setTimeout(() => {
resolve({ data: 'API data' });
}, 500);
});
};
// Button.test.jsx
import React from 'react';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import Button from './Button';
import * as api from './api';
jest.mock('./api');
describe('Button Component', () => {
it('should call the onClick prop with the API data when clicked', async () => {
const onClick = jest.fn();
api.fetchData.mockResolvedValue({ data: 'mocked API data' });
render();
const buttonElement = screen.getByRole('button', { name: 'Click Me' });
fireEvent.click(buttonElement);
await waitFor(() => {
expect(onClick).toHaveBeenCalledWith({ data: 'mocked API data' });
});
});
});
ãã®äŸã§ã¯ãapi.js
ã¢ãžã¥ãŒã«ããfetchData
颿°ãã¢ãã¯ããŠããŸããjest.mock('./api')
ã䜿çšããŠã¢ãžã¥ãŒã«å
šäœãã¢ãã¯ããæ¬¡ã«api.fetchData.mockResolvedValue()
ã䜿çšããŠã¢ãã¯ããã颿°ã®æ»ãå€ãæå®ããŠããŸãããããŠããã¿ã³ãã¯ãªãã¯ããããšãã«onClick
ããããã£ãã¢ãã¯ãããAPIããŒã¿ã§åŒã³åºãããããšãã¢ãµãŒãããŠããŸãã
çµè«ïŒæç¶å¯èœãªããã³ããšã³ãã®ããã®åé¢ãŠããããã¹ãã®æ¡çš
åé¢ãŠããããã¹ãã¯ãå ç¢ã§ãä¿å®å¯èœã§ãã¹ã±ãŒã©ãã«ãªããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äžå¯æ¬ ãªå®è·µã§ããã³ã³ããŒãã³ããåé¢ããŠãã¹ãããããšã§ãéçºãµã€ã¯ã«ã®æ©ã段éã§ãã°ãç¹å®ããŠä¿®æ£ããã³ãŒãå質ãåäžãããéçºæéãççž®ããã³ãŒãã®å€æŽã«å¯Ÿããèªä¿¡ãé«ããããšãã§ããŸããé¿ããã¹ãããã€ãã®äžè¬çãªèœãšã穎ã¯ãããŸãããåé¢ãŠããããã¹ãã®å©ç¹ã¯èª²é¡ãã¯ããã«äžåããŸãããŠããããã¹ãã«å¯Ÿããäžè²«ããèŠåŸããã¢ãããŒããæ¡çšããããšã§ãæã®è©Šç·Žã«èããããšãã§ããæç¶å¯èœãªããã³ããšã³ããäœæã§ããŸãããã¹ããéçºããã»ã¹ã«çµ±åããããšã¯ãäžçäžã®ãã¹ãŠã®äººã«ãšã£ãŠããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒãããããã©ã®ãããžã§ã¯ãã§ãåªå äºé ã§ããã¹ãã§ãã
æ¢åã®ãããžã§ã¯ãã«ãŠããããã¹ããçµã¿èŸŒãããšããå§ãããã¯ããã¯ãããŒã«ã«æ £ããŠãããåŸã ã«åé¢ã®ã¬ãã«ãäžããŠãããŸããããäžè²«ããåªåãšç¶ç¶çãªæ¹åããåé¢ãŠããããã¹ãã®æè¡ãç¿åŸããé«å質ãªããã³ããšã³ããæ§ç¯ããããã®éµã§ããããšãå¿ããªãã§ãã ããã