Python ํ๋ก์ ํธ์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ถ์์ ์ํด Coverage.py๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์น, ์ฌ์ฉ๋ฒ, ๋ณด๊ณ ์, ๊ธ๋ก๋ฒ ํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
Coverage.py ์ฐ๋: ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ํ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์ธก์
์ญ๋์ ์ธ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ธ๊ณ์์ ์ฝ๋ ํ์ง ๋ณด์ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค์ํ ์งํ์ธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ฝ๋๊ฐ ์ด๋ ์ ๋ ํ ์คํธ๋์๋์ง ์ดํดํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ Python์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ Coverage.py์ ์ด๋ฅผ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํจ๊ณผ์ ์ผ๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ด ๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ฌด์์ด๋ฉฐ ์ ์ค์ํ๊ฐ?
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ ์คํธ ์คํ ์ ์์ค ์ฝ๋๊ฐ ์ด๋ ์ ๋ ์คํ๋์๋์ง ์ ๋ํํฉ๋๋ค. ์ด๋ ํ ์คํธ ํจ๊ณผ์ฑ์ ๋ํ๋ด๋ ์ค์ํ ์งํ์ ๋๋ค. ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ง์ ์ฝ๋๊ฐ ํ ์คํธ์ ์ํด ์คํ๋๊ณ ์์์ ์์ฌํ๋ฉฐ, ์ด๋ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ํํธ์จ์ด์ ์์ ์ฑ์ ๋ณด์ฅํ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค. ๋ฐ๋๋ก, ๋ฎ์ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ฐ๊ฒฌ๋์ง ์์ ๋ฌธ์ ๊ฐ ์จ์ด ์์ ์ ์๋ ํ ์คํธ๋์ง ์์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ํํธ์จ์ด ํ๋ก์ ํธ์ ํ์ ํ๋ ๊ธ๋ก๋ฒ ํ์ ๊ฒฝ์ฐ, Coverage.py์ ๊ฐ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๊ฐ ์ง์ํ๋ ์ผ๊ด๋๊ณ ํฌ๊ด์ ์ธ ํ ์คํธ๋ ์๊ฐ๋, ์ธ์ด ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ ์์ค์ ๊ด๊ณ์์ด ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ ์คํธ๋์ง ์์ ์ฝ๋ ์๋ณ: ํ ์คํธ๋ก ์ปค๋ฒ๋์ง ์์ ์ฝ๋ ์์ญ์ ์ฐพ์ ์ ์ฌ์ ์ทจ์ฝ์ ์ ๊ฐ์กฐํฉ๋๋ค.
- ํ ์คํธ ํ์ง ํฅ์: ๋ ํฌ๊ด์ ์ธ ํ ์คํธ ์์ฑ์ ์ฅ๋ คํ์ฌ ๊ณ ํ์ง ์ํํธ์จ์ด๋ก ์ด์ด์ง๋๋ค.
- ๋ฒ๊ทธ ๊ฐ์: ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ์์ ๋น์ฉ์ ์ค์ ๋๋ค.
- ๋ฆฌํฉํ ๋ง ์ด์ง: ํ ์คํธ๊ฐ ์๋ํ์ง ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๊ฒฌํ ๊ฒ์ด๋ผ๋ ํ์ ์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ์ ์๋๋ก ํฉ๋๋ค.
- ํ์ ๊ฐํ: ํ ๋ด์์ ์ฝ๋ ํ์ง์ ๋ํ ๊ณต์ ๋ ์ดํด๋ฅผ ์กฐ์ฑํ๋ฉฐ, ์ด๋ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
Coverage.py ์๊ฐ
Coverage.py๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๋ Python ํจํค์ง์ ๋๋ค. ํ ์คํธ ์ค์ ์ฝ๋๊ฐ ์คํ๋๋ ๋ถ๋ถ์ ์ถ์ ํ๊ณ ์ปค๋ฒ๋ฆฌ์ง ๋ฐฑ๋ถ์จ์ ์์ธํ ์ค๋ช ํ๋ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค. ๋ค์ํ ํ ์คํ ํ๋ ์์ํฌ์ ์ํํ๊ฒ ํตํฉ๋๋ ๊ฐ๋จํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋๊ตฌ์ ๋๋ค.
Coverage.py์ ์ฃผ์ ๊ธฐ๋ฅ
- ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง: ์คํ๋ ์ฝ๋ ๋ผ์ธ์ ๋ฐฑ๋ถ์จ์ ์ธก์ ํฉ๋๋ค.
- ๋ธ๋์น ์ปค๋ฒ๋ฆฌ์ง: ์กฐ๊ฑด๋ฌธ(์:
if/else
)์ ๋ธ๋์น ์คํ์ ๊ฒฐ์ ํฉ๋๋ค. - ์ ์ฐํ ํตํฉ:
unittest
,pytest
,tox
์ ๊ฐ์ ์ธ๊ธฐ ์๋ ํ ์คํ ํ๋ ์์ํฌ์ ์๋ํฉ๋๋ค. - ๋ณด๊ณ ์ ์ต์ : ํ ์คํธ, HTML, XML์ ํฌํจํ ๋ค์ํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ตฌ์ฑ: ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์ธ๋ถ์ ์ธ ์ฌ์ฉ์ ์ ์๋ฅผ ํ์ฉํฉ๋๋ค.
์ค์น ๋ฐ ์ค์
pip, Python ํจํค์ง ์ค์น ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ Coverage.py๋ฅผ ์ฝ๊ฒ ์ค์นํ ์ ์์ต๋๋ค.
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
์ pytest์๊ฒ my_module
๋ชจ๋์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๋๋ก ์ง์ํฉ๋๋ค. --cov-report term
ํ๋๊ทธ๋ ํฐ๋ฏธ๋์์ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค. ์ถ๋ ฅ์ coverage report
์ถ๋ ฅ๊ณผ ์ ์ฌํ๋ฉฐ ์ปค๋ฒ๋ฆฌ์ง ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค.
๋ณด๊ณ ์ ์์ฑ
Coverage.py๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ณ ๋ถ์ํ๊ธฐ ์ํ ๋ค์ํ ๋ณด๊ณ ์ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ํ ์คํ ํ๋ก์ธ์ค์ ๋ํ ๋ค์ํ ๊ด์ ์ ์ ๊ณตํ๋ฉฐ ๊ธ๋ก๋ฒ ํ ๊ฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉํ ๋ณด๊ณ ์์ ์ ํ์ ํ์ ์ ํธ๋์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
ํ ์คํธ ๋ณด๊ณ ์
ํ
์คํธ ๋ณด๊ณ ์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ์ ๋ณด๊ณ ์์ด๋ฉฐ coverage report
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. ๊ฐ ํ์ผ ๋ฐ ์ ์ฒด ํ๋ก์ ํธ์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง ๋ฐฑ๋ถ์จ์ ๊ฐ๋จํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ณด๊ณ ์๋ ํฐ๋ฏธ๋ ์ถ๋ ฅ์์ ๊ณต์ ํ๊ธฐ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฒํ ํ ์ ์์ต๋๋ค.
coverage report
HTML ๋ณด๊ณ ์
HTML ๋ณด๊ณ ์๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ๋ํ ๋ณด๋ค ์๊ฐ์ ์ด๊ณ ์์ธํ ๋ณด๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ณ ํ์ผ๋ก ๋๋ฆด๋ค์ดํ์ฌ ์ด๋ค ์ฝ๋ ๋ผ์ธ์ด ์คํ๋์๊ณ ์ด๋ค ๋ผ์ธ์ด ์คํ๋์ง ์์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์์ธํ ๋ถ์ํ๋ ๋ฐ ํ์ํ ์ ํ์ ๋๋ค. HTML ๋ณด๊ณ ์๋ฅผ ํตํด ๋ถ์ฐ๋ ํ์ด ์ปค๋ฒ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค. ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ด๋ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ ๋ด์์ ๊ณต์ ํ ์ ์์ต๋๋ค.
coverage html
์ด ๋ช
๋ น์ HTML ๋ณด๊ณ ์๋ฅผ ํฌํจํ๋ htmlcov
๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
XML ๋ณด๊ณ ์
XML ๋ณด๊ณ ์๋ ์์ธํ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ XML ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์์ Continuous Integration(CI) ์์คํ ๋ฐ ๊ธฐํ ์๋ํ๋ ๋๊ตฌ์์ ํตํฉ์ ์ ์ฉํฉ๋๋ค. XML ๋ณด๊ณ ์๋ CI ์๋ฒ(Jenkins, GitLab CI, CircleCI ๋๋ 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. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์ ์๋ํ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ Continuous Integration/Continuous Deployment(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 ์์คํ ๊ณผ์ ํตํฉ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ถ์์ ์๋ํํ๋ ค๋ฉด CI/CD ํ์ดํ๋ผ์ธ์ Coverage.py๋ฅผ ํตํฉํฉ๋๋ค. CI/CD ์์คํ ์ ๊ตฌ์ฑํ์ฌ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์(HTML ๋๋ XML)๋ฅผ ์์ฑํ๊ณ ํ์ํฉ๋๋ค. ๋ง์ CI/CD ์์คํ ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฉํธ๋ฆญ์ ํ์ํ๊ณ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ํ๊ท๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ์ฉ ํตํฉ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ตญ์ ํ์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ ํ์ฌ ์ฝ๋ ๊ฐ์ ์ ๋ํ ์ ์ํ ํผ๋๋ฐฑ์ ๋ณด์ฅํฉ๋๋ค.
Coverage.py์ Django
Django ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Coverage.py์์ ํตํฉ์ ๋งค์ฐ ์ํํฉ๋๋ค. pytest-cov
ํ๋ฌ๊ทธ์ธ ๋๋ Django์ ํ
์คํธ ์คํ๊ธฐ์ ํจ๊ป `coverage run` ๋ช
๋ น์ ํ์ฉํฉ๋๋ค. Django์ ๋ด์ฅ ํ
์คํธ ํ์ผ ๋ฐ ํ
ํ๋ฆฟ์ ์ปค๋ฒ๋ฆฌ์ง ๊ณ์ฐ์์ ์ ์ธํ๋ ๋ฐ ํน๋ณํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค. ๊ตญ์ ๊ณ ๊ฐ๊ณผ ํ๋ ฅํ ๋ ์ผ๊ด๋ Django ํตํฉ์ ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ ์ง์ญ ์ ๋ฐ์ ๊ฑธ์ณ ์ํํธ์จ์ด ์์ ์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Coverage.py์ Asyncio
๋น๋๊ธฐ ์ฝ๋์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ ๋๋ ๋ชจ๋ ๋น๋๊ธฐ ํจ์์ ์์
์ด ํ
์คํธ๋ก ์ปค๋ฒ๋์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. pytest-asyncio
์ ๊ฐ์ ๋น๋๊ธฐ ํ
์คํ
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจ๊ณผ์ ์ธ ํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ค์ํ ๊ตญ์ ์์ฅ์ ์ํ ์ฝ๋๋ฅผ ์์ฑํ ๋, ๋ค๋ฅธ ๋คํธ์ํฌ์์ ์ด์๋๋ ์ฌ์ฉ์์๊ฒ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก async ํจ์๊ฐ ์ ํ
์คํธ๋์๋์ง ํ์ธํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ํด๊ฒฐ
๋ค์์ ๋ฐ์ํ ์ ์๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค:
- ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ฎ์: ํ ์คํธ๋ฅผ ๊ฒํ ํ๊ณ ๋ชจ๋ ์ฝ๋ ๋ธ๋์น๋ฅผ ์ปค๋ฒํ๊ธฐ ์ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ ์ถ๊ฐํฉ๋๋ค.
- ์๋ชป๋ ํ์ผ ๊ฒฝ๋ก:
.coveragerc
ํ์ผ๊ณผ ๋ช ๋ น์ค ์ธ์๋ฅผ ๋ค์ ํ์ธํ์ฌ ์ฌ๋ฐ๋ฅธ ํ์ผ ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋์๋์ง ํ์ธํฉ๋๋ค. ์์ค ์ฝ๋ ๋ฐ ํ ์คํธ ํ์ผ์ ์์น๋ฅผ ํ์ธํฉ๋๋ค. - ํน์ ๋ชจ๋์ ๋ํ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋๋ฝ: `.coveragerc`์
source
๊ตฌ์ฑ ์ค์ ๋๋ ์ฌ๋ฐ๋ฅธ ๋ช ๋ น์ค ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ด ์ปค๋ฒ๋ฆฌ์ง ๋ถ์์ ํฌํจ๋์๋์ง ํ์ธํฉ๋๋ค. ํ ์คํธ๋ฅผ ๊ฒํ ํ๊ณ ๋ชจ๋์ ๋ชจ๋ ํจ์์ ๋ํ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. - ํ
์คํธ ๋ฌด์: ํ
์คํธ ํ์ผ์ด ๊ตฌ์ฑ์ ์ํด ์ ์ธ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
.coveragerc
์์ ํ ์คํธ ํ์ผ์ ์ค์๋ก ์ ์ธํ์ง ์์๋์ง ํ์ธํฉ๋๋ค. - ๊ฐ์ ํ๊ฒฝ ๋ฌธ์ : Coverage.py ๋ฐ ๋ชจ๋ ํ ์คํ ํ๋ ์์ํฌ๊ฐ ๋์ผํ ๊ฐ์ ํ๊ฒฝ์ ์ค์น๋์๋์ง ํ์ธํฉ๋๋ค. ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์คํํ๊ธฐ ์ ์ ๊ฐ์ ํ๊ฒฝ์ ํ์ฑํํฉ๋๋ค.
๊ฒฐ๋ก
Python ํ๋ก์ ํธ์ Coverage.py๋ฅผ ํตํฉํ๋ ๊ฒ์ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ํ์ ๋จ๊ณ์ ๋๋ค. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๊ณ ์ถ์ ํ๋ฉฐ, ํ ์คํธ๋์ง ์์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์๋ณํ๊ณ , ์ฝ๋์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ๋ ผ์๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํจ์ผ๋ก์จ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ ๋ด์์ Coverage.py๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ , ํ์ ์ ์ด์งํ๋ฉฐ, ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์์ ์ ์ธ ์ํํธ์จ์ด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ ๊ธฐ์ ์ธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ถ์์ ํ ์คํ ๋ ธ๋ ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ , ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ฉฐ, ๊ฐ๋ฐ ํ ๋ด์์ ์ง์์ ์ธ ๊ฐ์ ๋ฌธํ๋ฅผ ์กฐ์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ ผ์๋ ์์น์ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋ค์ํ ํ๋ก์ ํธ ํฌ๊ธฐ, ํ ๊ตฌ์กฐ ๋ฐ ํ ์คํ ํ๋ ์์ํฌ์ ๋ง๊ฒ ์กฐ์ ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ์ ์ผ๊ด๋๊ฒ ์ ์ฉํจ์ผ๋ก์จ ํ์ ๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ์ ์ธ๊ณ ์ฌ๋๋ค์๊ฒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.