Pythonãããžã§ã¯ãã§Coverage.pyã广çã«çµ±åããã³ãŒãã«ãã¬ããžåæãè¡ãæ¹æ³ãåŠã³ãŸããã€ã³ã¹ããŒã«ãäœ¿çšæ³ãã¬ããŒãäœæãããã³åœéçãªããŒã åãã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠèª¬æããŸãã
Coverage.pyã®çµ±åïŒã°ããŒãã«ãœãããŠã§ã¢éçºã®ããã®ã³ãŒãã«ãã¬ããžæž¬å®
ãœãããŠã§ã¢éçºã®ãã€ãããã¯ãªäžçã§ã¯ãã³ãŒãå質ã®ç¢ºä¿ãæãéèŠã§ããã³ãŒãã«ãã¬ããžã¯ãéèŠãªã¡ããªã¯ã¹ã§ãããã³ãŒããã©ã®çšåºŠãã¹ããããŠããããçè§£ããã®ã«åœ¹ç«ã¡ãŸãããã®ããã°æçš¿ã§ã¯ãPythonã§ã³ãŒãã«ãã¬ããžã枬å®ããããã®åŒ·åãªããŒã«ã§ããCoverage.pyãšããããã°ããŒãã«ãªãœãããŠã§ã¢éçºã¯ãŒã¯ãããŒã«å¹æçã«çµ±åããæ¹æ³ã«ã€ããŠè©³ãã説æããŸãã
ã³ãŒãã«ãã¬ããžãšã¯äœãããªãéèŠãªã®ãïŒ
ã³ãŒãã«ãã¬ããžã¯ããã¹ãã®å®è¡æã«ãœãŒã¹ã³ãŒããã©ã®çšåºŠå®è¡ãããããå®éåããŸããããã¯ããã¹ãã®æå¹æ§ã瀺ãéèŠãªææšã§ããé«ãã³ãŒãã«ãã¬ããžã¯éåžžãããå€ãã®ã³ãŒãããã¹ãã«ãã£ãŠå®è¡ãããŠããããšã瀺åããããã«ãã£ãŠãã°ããã£ãããããœãããŠã§ã¢ã®å®å®æ§ã確ä¿ããå¯èœæ§ãé«ãŸããŸããéã«ãäœãã«ãã¬ããžã¯ããã¹ããããŠããªãã³ãŒããã¹ã瀺ããŠããå¯èœæ§ããããæªçºèŠã®åé¡ãæ±ããŠããå¯èœæ§ããããŸãããœãããŠã§ã¢ãããžã§ã¯ãã§å ±åäœæ¥ãè¡ãåœéçãªããŒã ã«ãšã£ãŠãCoverage.pyã®ãããªã³ãŒãã«ãã¬ããžããŒã«ã«ãã£ãŠä¿é²ããããäžè²«æ§ã®ããå æ¬çãªãã¹ãã¯ãã¿ã€ã ãŸãŒã³ãèšèªãããã³ããŸããŸãªéçºè ã®çµéšã¬ãã«å šäœã§ã³ãŒãå質ãç¶æããããã«äžå¯æ¬ ã§ãã
ã³ãŒãã«ãã¬ããžã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã
- ãã¹ããããŠããªãã³ãŒãã®ç¹å®ïŒãã¹ãã§ã«ããŒãããŠããªãã³ãŒãã®é åãç¹å®ããæœåšçãªè匱æ§ã匷調ããŸãã
- ãã¹ãå質ã®åäžïŒããå æ¬çãªãã¹ãã®äœæãä¿ããããé«å質ã®ãœãããŠã§ã¢ã«ã€ãªãããŸãã
- ãã°ã®åæžïŒéçºãµã€ã¯ã«ã®æ©ã段éã§ãã°ããã£ããããä¿®æ£ã³ã¹ããåæžããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ä¿é²ïŒãã¹ãã«ãã£ãŠæå³ããªã倿Žãæ€åºãããããšãç¥ã£ãŠãã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããéã«èªä¿¡ãæäŸããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ã®åŒ·åïŒããŒã å ã§ã®ã³ãŒãå質ã®å ±éçè§£ãä¿é²ããŸããããã¯ãå°ççã«åæ£ããããŒã ã«ãšã£ãŠç¹ã«éèŠã§ãã
Coverage.pyã®ç޹ä»
Coverage.pyã¯ãã³ãŒãã«ãã¬ããžã枬å®ããPythonããã±ãŒãžã§ãããã¹ãäžã«ã³ãŒãã®ã©ã®éšåãå®è¡ããããã远跡ããã«ãã¬ããžçã詳现ã«ç€ºãã¬ããŒããçæããŸããããŸããŸãªãã¹ããã¬ãŒã ã¯ãŒã¯ãšã·ãŒã ã¬ã¹ã«çµ±åã§ãããç°¡åã§äœ¿ããããããŒã«ã§ãã
Coverage.pyã®äž»ãªæ©èœ
- è¡ã«ãã¬ããžïŒå®è¡ãããã³ãŒãã®è¡ã®ããŒã»ã³ããŒãžã枬å®ããŸãã
- åå²ã«ãã¬ããžïŒæ¡ä»¶ä»ãã¹ããŒãã¡ã³ãïŒäŸïŒ
if/else
ïŒã§ã®åå²ã®å®è¡ã決å®ããŸãã - æè»ãªçµ±åïŒ
unittest
ãpytest
ãtox
ãªã©ã®äžè¬çãªãã¹ããã¬ãŒã ã¯ãŒã¯ãšé£æºããŸãã - ã¬ããŒããªãã·ã§ã³ïŒããã¹ããHTMLãXMLãªã©ãããŸããŸãªã¬ããŒããçæããŸãã
- æ§æïŒãããžã§ã¯ãã®ç¹å®ã®ããŒãºã«åãããŠè©³çްãªã«ã¹ã¿ãã€ãºãå¯èœã§ãã
ã€ã³ã¹ããŒã«ãšã»ããã¢ãã
Coverage.pyã®ã€ã³ã¹ããŒã«ã¯ãPythonããã±ãŒãžã€ã³ã¹ããŒã©ãŒã§ããpipã䜿çšãããšç°¡åã§ãã
pip install coverage
ã€ã³ã¹ããŒã«åŸãããã«äœ¿çšã§ããŸããä»®æ³ç°å¢ïŒãã¹ããã©ã¯ãã£ã¹ïŒãå©çšãããããžã§ã¯ãã®å Žåã¯ãCoverage.pyãé©åãªä»®æ³ç°å¢å ã«ã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããã
unittest
ã§ã®åºæ¬çãªäœ¿çšæ³
çµã¿èŸŒã¿ã®unittest
ãã¬ãŒã ã¯ãŒã¯ã§Coverage.pyã䜿çšããç°¡åãªäŸã次ã«ç€ºããŸãã
- Pythonãã¡ã€ã«ãäœæããŸãïŒäŸïŒ
my_module.py
ïŒïŒ
def add(x, y):
return x + y
def subtract(x, y):
return x - y
- ãã¹ããã¡ã€ã«ãäœæããŸãïŒäŸïŒ
test_my_module.py
ïŒïŒ
import unittest
import my_module
class TestMyModule(unittest.TestCase):
def test_add(self):
self.assertEqual(my_module.add(2, 3), 5)
def test_subtract(self):
self.assertEqual(my_module.subtract(5, 2), 3)
if __name__ == '__main__':
unittest.main()
- Coverage.pyã§ãã¹ããå®è¡ããŸãïŒ
coverage run -m unittest discover
coverage run
ã³ãã³ãã¯ããã¹ããå®è¡ããã³ãŒãã«ãã¬ããžã远跡ããŸãã-m unittest discover
ã¯ãunittestãã¹ããå®è¡ããããã«æç€ºããŸããdiscover
ã¯ãunittestã®æ€åºæ©èœã䜿çšããŠãã¹ããæ€çŽ¢ããŸãããã®ã³ãã³ãã¯ãçŸåšã®ãã£ã¬ã¯ããªãŸãã¯ãµããã£ã¬ã¯ããªå
ã®ãã¹ãŠã®ãã¹ããæ€çŽ¢ããŸãã
- ã«ãã¬ããžã¬ããŒããçæããŸãïŒ
coverage report
ããã«ãããã¿ãŒããã«ã«ããã¹ãããŒã¹ã®ã¬ããŒããçæãããåãã¡ã€ã«ã®ã«ãã¬ããžçã衚瀺ãããŸãã
åºåäŸïŒ
Name Stmts Miss Cover
--------------------------------------
my_module.py 4 0 100%
--------------------------------------
TOTAL 4 0 100%
pytest
ã§ã®Coverage.pyã®äœ¿çš
pytestã䜿çšãããããžã§ã¯ãã®å Žåãçµ±åã¯åæ§ã«ç°¡åã§ããpytestã«ã¯ãããã»ã¹ãç°¡çŽ åããpytest-cov
ãšåŒã°ãããã©ã°ã€ã³ããããŸãã
- ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãïŒ
pip install pytest-cov
- `--cov`ãã©ã°ãæå®ããŠpytestãã¹ããå®è¡ããŸãïŒ
pytest --cov=my_module --cov-report term
--cov=my_module
ã¯ãmy_module
ã¢ãžã¥ãŒã«ã®ã«ãã¬ããžã枬å®ããããã«pytestã«æç€ºããŸãã--cov-report term
ãã©ã°ã¯ãã¿ãŒããã«ã«ã¬ããŒããçæããŸããåºåã¯`coverage report`ã®åºåãšåæ§ã«ãªããã«ãã¬ããžæ
å ±ã衚瀺ãããŸãã
ã¬ããŒãã®çæ
Coverage.pyã¯ãã³ãŒãã«ãã¬ããžããŒã¿ãèŠèŠåããã³åæããããã®ããŸããŸãªã¬ããŒããªãã·ã§ã³ãæäŸããŸãããããã®ã¬ããŒãã¯ããã¹ãããã»ã¹ã«é¢ããããŸããŸãªèŠç¹ãæäŸããåœéçãªããŒã éã§å ±æã§ããŸããã©ã®ã¬ããŒãã䜿çšãããã¯ãããŒã ã®å¥œã¿ãšãããžã§ã¯ãã®ç¹å®ã®ããŒãºã«ãã£ãŠç°ãªããŸãã
ããã¹ãã¬ããŒã
ããã¹ãã¬ããŒãã¯ãæãåºæ¬çãªã¬ããŒã圢åŒã§ãããcoverage report
ã³ãã³ãã䜿çšããŠçæãããŸããåãã¡ã€ã«ãšãããžã§ã¯ãå
šäœã®ã«ãã¬ããžçã®ç°¡åãªæŠèŠãæäŸããŸãããã®ã¬ããŒãã¯ãã¿ãŒããã«ã®åºåã§ç°¡åã«å
±æã§ããããã«ç¢ºèªã§ããŸãã
coverage report
HTMLã¬ããŒã
HTMLã¬ããŒãã¯ãã³ãŒãã«ãã¬ããžã®ããèŠèŠçã§è©³çްãªãã¥ãŒãæäŸããŸããåã ã®ãã¡ã€ã«ãããªã«ããŠã³ããŠãã©ã®ã³ãŒãè¡ãå®è¡ãããã©ã®ã³ãŒãè¡ãå®è¡ãããªãã£ããã確èªã§ããŸãã詳现ãªã«ãã¬ããžåæã«æé©ã§ããHTMLã¬ããŒãã䜿çšãããšã忣ããŒã ãã«ãã¬ããžçµæãç°¡åã«å ±æã§ããŸããã¯ã©ãŠãã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ãŸãã¯ãããžã§ã¯ã管çããŒã«å ã§å ±æã§ããŸãã
coverage html
ãã®ã³ãã³ãã¯ãHTMLã¬ããŒããå«ãhtmlcov
ãã£ã¬ã¯ããªãçæããŸãã
XMLã¬ããŒã
XMLã¬ããŒãã¯ã詳现ãªã«ãã¬ããžããŒã¿ãå«ãXMLãã¡ã€ã«ãçæããŸãããã®åœ¢åŒã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã·ã¹ãã ããã®ä»ã®èªååããŒã«ãšã®çµ±åã«åœ¹ç«ã¡ãŸããXMLã¬ããŒãã¯ãCIãµãŒããŒïŒJenkinsãGitLab CIãCircleCIãªã©ïŒã§è§£æã§ããæéã®çµéã«äŒŽãã«ãã¬ããžã®åŸåã衚瀺ããããã«äœ¿çšã§ããŸãã
coverage xml
ãã®ã³ãã³ãã¯ãcoverage.xml
ãã¡ã€ã«ãäœæããŸãã
æ§æãªãã·ã§ã³
Coverage.pyã¯ããã®åäœãã«ã¹ã¿ãã€ãºãããããžã§ã¯ãã®ç¹å®ã®ããŒãºãæºããããã®ããã€ãã®æ§æãªãã·ã§ã³ãæäŸããŸãããããã®æ§æãªãã·ã§ã³ã¯ã.coveragerc
ãã¡ã€ã«ã§æå®ããããã³ãã³ãã©ã€ã³åŒæ°ã䜿çšããŠæå®ã§ããŸãã
.coveragerc
ãã¡ã€ã«
.coveragerc
ãã¡ã€ã«ã¯ãCoverage.pyãæ§æããããã®æšå¥šãããæ¹æ³ã§ããå«ãããŸãã¯é€å€ãããã¡ã€ã«ãç¡èŠãããã©ã³ãã䜿çšããã¬ããŒã圢åŒãªã©ãããŸããŸãªãªãã·ã§ã³ãæå®ã§ããŸãããã®ãã¡ã€ã«ã¯éåžžããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«é
眮ãããŸãã
.coveragerc
ãã¡ã€ã«ã®ç°¡åãªäŸã次ã«ç€ºããŸãã
[run]
source = .
omit =
*/tests/*
[report]
show_missing = True
exclude_lines =
pragma: no cover
ãã®æ§æã§ã¯ã次ã®ããšãæå®ããŸãã
source = .
ïŒçŸåšã®ãã£ã¬ã¯ããªããã³ãµããã£ã¬ã¯ããªå ã®ãã¹ãŠã®Pythonãã¡ã€ã«ãå«ã¿ãŸããomit = */tests/*
ïŒã«ãã¬ããžåæãã`tests`ãã£ã¬ã¯ããªãšãã®ãµããã£ã¬ã¯ããªå ã®ãã¹ãŠã®ãã¡ã€ã«ãé€å€ããŸããããã¯ããã¹ãèªäœãã«ãã¬ããžã¡ããªã¯ã¹ã«åœ±é¿ãäžããªãããã«ããããã®äžè¬çãªæ¹æ³ã§ããshow_missing = True
ïŒã¬ããŒãã§ãã¹ãã§ã«ããŒãããŠããªãã³ãŒãè¡ã衚瀺ããŸããexclude_lines = pragma: no cover
ïŒ`pragma: no cover`ã³ã¡ã³ããå«ãè¡ãã«ãã¬ããžåæããé€å€ããŸãããã®ãã£ã¬ã¯ãã£ãã¯ããã¹ããé©çšã§ããªãããŸãã¯æå³çã«çç¥ãããŠããã³ãŒãã®éšåã«åœ¹ç«ã¡ãŸãã
ã³ãã³ãã©ã€ã³ãªãã·ã§ã³
ã³ãã³ãã©ã€ã³åŒæ°ã䜿çšããŠCoverage.pyãæ§æããããšãã§ããŸãããããã®ãªãã·ã§ã³ã¯ã.coveragerc
ãã¡ã€ã«ã§æå®ãããèšå®ããªãŒããŒã©ã€ãããŸããã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã¯ãç¹å®ã®ãã¹ãå®è¡ã®ããã«è¿
éãªæ§æå€æŽãæäŸããŸãã
äŸïŒ
coverage run --source=my_package --omit=*/tests/* -m pytest
ãã®ã³ãã³ãã¯pytestãå®è¡ãããœãŒã¹ãã£ã¬ã¯ããªãæå®ãããã¹ããã«ãã¬ããžããé€å€ããŠãã«ãã¬ããžã枬å®ããŸãã
ã°ããŒãã«ãœãããŠã§ã¢éçºã®ãã¹ããã©ã¯ãã£ã¹
Coverage.pyã®ãããªã³ãŒãã«ãã¬ããžããŒã«ãéçºã¯ãŒã¯ãããŒã«çµ±åããããšã¯ããœãããŠã§ã¢ã®å質ãåäžãããããã®éèŠãªã¹ãããã§ããã°ããŒãã«ããŒã ã®å Žåããã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã§ãã³ã©ãã¬ãŒã·ã§ã³ãå€§å¹ ã«åŒ·åãããšã©ãŒãæžããããªãªãŒã¹ãµã€ã¯ã«ãå éã§ããŸãã
1. äžè²«ãããã¹ãã«ãã¬ããžç®æš
ãããžã§ã¯ãã®ã¿ãŒã²ããã³ãŒãã«ãã¬ããžçïŒäŸïŒ80ïŒ ä»¥äžïŒã確ç«ããŸããããã«ãããéçºããŒã ã«æž¬å®å¯èœãªç®æšãæäŸãããŸããã«ãã¬ããžç®æšãããããžã§ã¯ãå ã®ãã¹ãŠã®ã¢ãžã¥ãŒã«ããã³ã³ã³ããŒãã³ãå šäœã§äžè²«ããŠããããšã確èªããŸããã«ãã¬ããžã宿çã«ç£èŠããç®æšãéæããããã®äœäžãŸãã¯å€±æã«è¿ éã«å¯ŸåŠããŸããããŸããŸãªã¿ã€ã ãŸãŒã³ã§äœæ¥ããã°ããŒãã«ããŒã ã®å Žåã宿çãªç£èŠãšã¢ã©ãŒããéèŠã§ãã
2. ã³ãŒãã«ãã¬ããžã¬ããŒãã®èªåå
ã³ãŒãã«ãã¬ããžã¬ããŒããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³/ç¶ç¶çãããã€ã¡ã³ãïŒCI/CDïŒãã€ãã©ã€ã³ã«çµ±åããŸãããã«ããŸãã¯ããŒãžãªã¯ãšã¹ãããšã«ãHTMLãŸãã¯XMLã¬ããŒããèªåçã«çæããŸããJenkinsãGitLab CIãCircleCIããŸãã¯GitHub Actionsã®ãããªCIããŒã«ã䜿çšããŠããã¹ããå®è¡ããã«ãã¬ããžã¬ããŒããèªåçã«çæããŸããããã«ãããããã»ã¹ãèªååãããå Žæãã¿ã€ã ãŸãŒã³ã«é¢ä¿ãªãããã¹ãŠã®ããŒã ã¡ã³ããŒãææ°ã®ã«ãã¬ããžããŒã¿ãããã«å©çšã§ããããã«ãªããŸãã峿ã®ãã£ãŒãããã¯ã«ãããå埩ãéããªãããã°ã®è§£æ±ºãè¿ éã«ãªããŸãã
3. ã«ãã¬ããžã¬ããŒãã®å®æçãªç¢ºèª
ã³ãŒãã«ãã¬ããžã¬ããŒããã³ãŒãã¬ãã¥ãŒããã»ã¹ã«äžå¯æ¬ ãªéšåã«ããŸããéçºè ã¯ã«ãã¬ããžããŒã¿ã確èªããæ°ããã³ãŒãã®å€æŽãé©åã«ãã¹ããããŠããããšã確èªããå¿ èŠããããŸããã«ããŒãããŠããªãã³ãŒãé åãç¹å®ããŠå¯ŸåŠããŸãããã®å ±åã¢ãããŒãã«ãããããŸããŸãªã°ããŒãã«ãã±ãŒã·ã§ã³ã®éçºè ãå ±åã§ãæ°ããå°å ¥ããããã¹ãŠã®æ©èœãšå€æŽããã¹ãã§ã«ããŒãããããã«ããããšãã§ããŸãã
4. æå³ã®ãããã¹ããäœæãã
ããŸããŸãªã·ããªãªããšããžã±ãŒã¹ãã«ããŒããé«å質ã®ãã¹ããäœæããããšã«çŠç¹ãåœãŠãŸããé«ããã¹ãã«ãã¬ããžã¯äŸ¡å€ããããŸããããã¹ãã®æå¹æ§ãããéèŠã§ãããã¹ãã¯ãã³ãŒãã®æ©èœãå æ¬çã«æ€èšŒããå¿ èŠããããŸãããã¹ãã¯ãçè§£ãããããä¿å®ãããããã®ã§ãªããã°ãªããŸãããéçºè ã«ãéèŠãªæ©èœãšéèŠãªã³ãŒããã¹ãã«ããŒãããã¹ãã®äœæãåªå ããããã«ä¿ããŸããé©åã«äœæããããã¹ãã¯ãã·ã¹ãã ã®åäœãæç¢ºã«ããããŸããŸãªå°ççãªå Žæã§ã®ãããã°ã容æã«ãããããåœéçãªããŒã ã«ãšã£ãŠéåžžã«éèŠã§ãã
5. ããŒãžã§ã³ç®¡çã§Coverage.pyã䜿çšãã
ã³ãŒãã«ãã¬ããžã¬ããŒãããããŒãžã§ã³ç®¡çïŒäŸïŒGitïŒã®ã³ãŒããšãšãã«ä¿åããŸããããã«ãããæéã®çµéã«äŒŽãã«ãã¬ããžã®å€æŽã远跡ããæœåšçãªãªã°ã¬ãã·ã§ã³ãç¹å®ã§ããŸããããŒãžã§ã³ç®¡çã«ãããå Žæã«é¢ä¿ãªãããã¹ãŠã®ããŒã ã¡ã³ããŒãã«ãã¬ããžã®å±¥æŽãšæéã®çµéãšãšãã«ã©ã®ããã«é²åããŠãããã確èªã§ããŸããGitãªã©ã®ããŒã«ã¯ããã¹ãŠã®ã«ãã¬ããžããŒã¿ãç¶æããã³ç¢ºèªããããã®å ±éã®åºç€ãæäŸããŸãã
6. æç¢ºãªãã¹ãã¬ã€ãã©ã€ã³ã®ç¢ºç«
ãã¹ãã®äœæã«é¢ããæç¢ºãªã¬ã€ãã©ã€ã³ãšæšæºãå®çŸ©ããŸããããã«ã¯ããã¹ãã®åœåããã¹ããã¡ã€ã«ã®æ§æãããã³é©åãªãã¹ããã¬ãŒã ã¯ãŒã¯ã®éžæã«é¢ããèŠåãå«ãŸããŸãããããã®ã¬ã€ãã©ã€ã³ã«ãããäžè²«æ§ã確ä¿ãããäžçäžã®ããŒã ã¡ã³ããŒããã¹ãäœæ¥ãçè§£ããè²¢ç®ãããããªããŸãããã®æšæºåã«ãããæœåšçãªèª€è§£ã軜æžãããããã»ã¹ãåçåãããŸãã
7. ã«ãã¬ããžã®ã®ã£ããã«è¿ éã«å¯ŸåŠãã
ã®ã£ãããç¹å®ãããããè¿ éã«å¯ŸåŠããŸããã«ããŒãããŠããªãã³ãŒããã«ããŒããããã«ãã¹ããäœæããç¹å®ã®ã¿ã¹ã¯ãéçºè ã«å²ãåœãŠãŸããã®ã£ããã«è¿ éã«å¯ŸåŠããããšã§ãããŒã å ã§ã®ã³ãŒãã«ãã¬ããžã®éèŠæ§ã匷åãããŸããããŸããŸãªã¿ã€ã ãŸãŒã³ã§ãã£ãŠããããŒã å šäœã§ã®å®æçãªã³ãã¥ãã±ãŒã·ã§ã³ãšè¿ éãªå¯Ÿå¿ã¯ãè¿ éãã€å¹æçãªè§£æ±ºãä¿èšŒããããã«äžå¯æ¬ ã§ãã
8. ã³ãŒãå質ããã·ã¥ããŒãã®äœ¿çš
ã³ãŒãã«ãã¬ããžããŒã¿ããã³ãã®ä»ã®å質ã¡ããªã¯ã¹ãã³ãŒãå質ããã·ã¥ããŒãã«çµ±åããŸããããã«ããããããžã§ã¯ãã®å¥å šæ§ã®äžå åããããã¥ãŒãæäŸãããç®æšã«åããé²æç¶æ³ã远跡ã§ããŸããSonarQubeã®ãããªããŒã«ããŸãã¯åæ§ã®ããã·ã¥ããŒãã¯ããœãããŠã§ã¢ã®å¥å šæ§ãšããã©ãŒãã³ã¹ãç£èŠããã®ã«åœ¹ç«ã¡ãŸããããã·ã¥ããŒãã¯ã誰ããã¢ã¯ã»ã¹ã§ããçµ±åãã¥ãŒãæäŸãããããžã§ã¯ãã®å¥å šæ§ã®ç£èŠã容æã«ããã°ããŒãã«ããŒã ãå質åé¡ãã¿ã€ã ãªãŒã«è¿œè·¡ããã³å¯ŸåŠã§ããããã«ããŸãã
9. ãã¬ãŒãã³ã°ãšç¥èã®å ±æ
Coverage.pyã®äœ¿çšãšå¹æçãªãã¹ãã®äœæã«ã€ããŠãããŒã ã¡ã³ããŒã«ãã¬ãŒãã³ã°ãšãªãœãŒã¹ãæäŸããŸãããã¹ããã©ã¯ãã£ã¹ãä¿é²ããããã«ãç¥èå ±æã»ãã·ã§ã³ãšã³ãŒãã¬ãã¥ãŒãä¿é²ããŸããã¯ãã¹ãã¬ãŒãã³ã°ã¯ãã°ããŒãã«ããŒã å šäœã®äžè²«æ§ã®æ¬ åŠãå æããããã®åªããæ¹æ³ã§ãã
10. ã¿ã€ã ãŸãŒã³ãšã³ãã¥ãã±ãŒã·ã§ã³ãèæ ®ãã
äŒè°ã®ã¹ã±ãžã¥ãŒã«ãšãã£ãŒãããã¯ã®æäŸæã«ãã¿ã€ã ãŸãŒã³ã®éããèªèããŠèæ ®ããŸããé»åã¡ãŒã«ããããžã§ã¯ã管çããŒã«ãªã©ã®éåæã³ãã¥ãã±ãŒã·ã§ã³æ¹æ³ã䜿çšããŠãã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããŸãããã°ã®å ±åãšã³ãŒãã«ãã¬ããžã®çµæã«ã€ããŠè°è«ããããã®æç¢ºãªã³ãã¥ãã±ãŒã·ã§ã³ãã£ãã«ã確ç«ããŸãããã®ãã©ã¯ãã£ã¹ã«ãããã°ããŒãã«ããŒã ã¡ã³ããŒã¯ã¿ã€ã ãŸãŒã³ãè¶ããŠå¹æçã«æ©èœã§ããŸãã
é«åºŠãªäœ¿çšæ³ãšèæ ®äºé
åºæ¬ãè¶ ããŠãCoverage.pyã¯ãããè€éãªãããžã§ã¯ãåãã®é«åºŠãªæ©èœãšèæ ®äºé ãæäŸããŸãã
åå²ã«ãã¬ããžãšæ¡ä»¶ä»ãã¹ããŒãã¡ã³ã
Coverage.pyã¯ããã¹ãäžã«æ¡ä»¶ä»ãã¹ããŒãã¡ã³ãïŒäŸïŒif/else
ãfor
ãwhile
ïŒã®ãã¹ãŠã®åå²ãå®è¡ããããã©ããã远跡ããåå²ã«ãã¬ããžãæäŸããŸãããã¹ãŠã®åå²ãã«ããŒãããŠããããšã確èªããŠãããŸããŸãªã·ããªãªã§ã®æœåšçãªãã°ãåé¿ããŸããåå²ã«ãã¬ããžã¯ãããŸããŸãªæ¡ä»¶ãã·ããªãªãåŠçããäžã§éåžžã«éèŠã«ãªããããã«ãã£ãŠãœãããŠã§ã¢ã®ä¿¡é Œæ§ãåäžããŸããããã¯ããœãããŠã§ã¢ãäžçäžã§äœ¿çšãããŠããå Žåã¯ç¹ã«ããã§ãã
ã«ãã¬ããžããã®ã³ãŒãã®é€å€
ç¹å®ã®ã·ããªãªã§ã¯ãã«ãã¬ããžæž¬å®ããç¹å®ã®ã³ãŒããé€å€ãããå ŽåããããŸããããã¯éåžžãçæãããã³ãŒãããã¹ããé£ããã³ãŒãããŸãã¯éèŠã§ã¯ãªããšèŠãªãããã³ãŒãã®å Žåã§ãã.coveragerc
ãã¡ã€ã«ã®omit
æ§æãªãã·ã§ã³ã䜿çšããããã³ãŒãã§pragma: no cover
ãã£ã¬ã¯ãã£ãã䜿çšããŸãã
CI/CDã·ã¹ãã ãšã®çµ±å
ã³ãŒãã«ãã¬ããžåæãèªååããã«ã¯ãCoverage.pyãCI/CDãã€ãã©ã€ã³ãšçµ±åããŸãããã¹ããå®è¡ããã«ãã¬ããžã¬ããŒãïŒHTMLãŸãã¯XMLïŒãçæããŠè¡šç€ºããããã«CI/CDã·ã¹ãã ãæ§æããŸããå€ãã®CI/CDã·ã¹ãã ã¯ãã³ãŒãã«ãã¬ããžã¡ããªã¯ã¹ã衚瀺ããã³ãŒãã«ãã¬ããžã®ãªã°ã¬ãã·ã§ã³ãèå¥ããããã®å°çšã®çµ±åãæäŸããŸããããã«ãããåœéçãªããŒã ã®ã¯ãŒã¯ãããŒã匷åãããã³ãŒãã®æ¹åã«å¯Ÿããè¿ éãªãã£ãŒãããã¯ãä¿èšŒãããŸãã
Coverage.pyãšDjango
Djangoãããžã§ã¯ãã®å ŽåãCoverage.pyãšã®çµ±åã¯ã·ãŒã ã¬ã¹ã§ãã`pytest-cov`ãã©ã°ã€ã³ãŸãã¯Djangoã®ãã¹ãã©ã³ããŒã§`coverage run`ã³ãã³ãã䜿çšããŸããã«ãã¬ããžèšç®ããDjangoã®çµã¿èŸŒã¿ãã¹ããã¡ã€ã«ãšãã³ãã¬ãŒããé€å€ããããšã«ç¹ã«æ³šæããŠãã ãããåœéçãªã¯ã©ã€ã¢ã³ããšé£æºããå Žåãäžè²«ããDjangoçµ±åã¯ããã°ãæžãããå°åå šäœã®ãœãããŠã§ã¢ã®å®å®æ§ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
Coverage.pyãšAsyncio
éåæã³ãŒãã®ã«ãã¬ããžã枬å®ããå Žåããã¹ãŠã®éåæé¢æ°ãšã¿ã¹ã¯ããã¹ãã§ã«ããŒãããŠããããšã確èªããããšãéèŠã§ãã`pytest-asyncio`ã®ãããªéåæãã¹ããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠã广çãªãã¹ããäœæããŸããããŸããŸãªåœéåžå Žåãã®ã³ãŒããäœæããå Žåã¯ãããŸããŸãªãããã¯ãŒã¯ã§åäœãããŠãŒã¶ãŒã®åé¡ãé²ãããã«ãéåæé¢æ°ãååã«ãã¹ããããŠããããšã確èªããŠãã ããã
äžè¬çãªåé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
çºçããå¯èœæ§ã®ããäžè¬çãªåé¡ãšãã®å¯ŸåŠæ¹æ³ã次ã«ç€ºããŸãã
- ã«ãã¬ããžãäœãïŒãã¹ãã確èªããã³ãŒãã®ãã¹ãŠã®åå²ãã«ããŒããããã«ãã¹ãã±ãŒã¹ã远å ããŸãã
- ãã¡ã€ã«ãã¹ãæ£ãããªãïŒ
.coveragerc
ãã¡ã€ã«ãšã³ãã³ãã©ã€ã³åŒæ°ãå確èªããŠãæ£ãããã¡ã€ã«ãã¹ã䜿çšãããŠããããšã確èªããŸãããœãŒã¹ã³ãŒããšãã¹ããã¡ã€ã«ã®å Žæã確èªããŸãã - ç¹å®ã®ã¢ãžã¥ãŒã«ã®ãã¹ãã«ãã¬ããžããªãïŒ`.coveragerc`ã®`source`æ§æèšå®ã確èªããããæ£ããã³ãã³ãã©ã€ã³ãã©ã°ã䜿çšããŠãã¢ãžã¥ãŒã«ãã«ãã¬ããžåæã«å«ãŸããŠããããšã確èªããŸãããã¹ãã確èªããã¢ãžã¥ãŒã«ã®ãã¹ãŠã®é¢æ°ã«ãã¹ãã±ãŒã¹ãããããšã確èªããŸãã
- ãã¹ãã®ç¡èŠïŒæ§æã§ãã¹ããã¡ã€ã«ãé€å€ãããŠããªãããšã確èªããŸãã
.coveragerc
ã§ãã¹ããã¡ã€ã«ã誀ã£ãŠé€å€ããŠããªãããšã確èªããŠãã ããã - ä»®æ³ç°å¢ã®åé¡ïŒCoverage.pyãšãã¹ãŠã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãåãä»®æ³ç°å¢ã«ã€ã³ã¹ããŒã«ãããŠããããšã確èªããŸããã«ãã¬ããžãå®è¡ããåã«ãä»®æ³ç°å¢ãã¢ã¯ãã£ãã«ããŸãã
çµè«
Coverage.pyãPythonãããžã§ã¯ãã«çµ±åããããšã¯ãé«å質ã®ãœãããŠã§ã¢ãä¿èšŒããããã®äžå¯æ¬ ãªã¹ãããã§ããããã«ãããã³ãŒãã«ãã¬ããžã枬å®ããã³è¿œè·¡ãããã¹ããããŠããªãã³ãŒããã¹ãç¹å®ããã³ãŒãå šäœã®å質ãåäžãããããšãã§ããŸãããã®ã¬ã€ãã§èª¬æãããŠãããã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã«ãããã°ããŒãã«ãªãœãããŠã§ã¢éçºããŒã å ã§Coverage.pyã广çã«æŽ»çšããã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããäžçäžã®ãŠãŒã¶ãŒã«ä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãæäŸã§ããŸãã宿çãªã³ãŒãã«ãã¬ããžåæã¯ããã¹ãã®åãçµã¿ãå€§å¹ ã«æ¹åããã³ãŒãå質ãåäžãããéçºããŒã å ã§ç¶ç¶çãªæ¹åã®æåãè²ãã®ã«åœ¹ç«ã¡ãŸãã
ããã§èª¬æããååã¯åºãé©çšå¯èœã§ãããããŸããŸãªãããžã§ã¯ããµã€ãºãããŒã æ§é ãããã³ãã¹ããã¬ãŒã ã¯ãŒã¯ã«åãããŠèª¿æŽã§ããŸãããããã®ææ³ãäžè²«ããŠé©çšããããšã«ãããããŒã ã¯ããå ç¢ã§ä¿å®å¯èœãªãœãããŠã§ã¢ãæ§ç¯ã§ããæçµçã«ã¯äžçäžã®äººã ã«ãšã£ãŠããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåŸãããŸãã