Python 프로젝트에 Codecov 연동하기

Reading time ~3 minutes

코드 커버리지(Code Coverage)란 소프트웨어의 테스트가 얼마나 코드를 잘 커버하고 있는가를 나타내주는 지표 중 하나이다. 코드 커버리지를 측정해주는 도구들이 많이 나와있는데 그 중에 하나가 Codecov이다. 이 포스트에서는 pytest, CircleCI 를 이용하고 있는 python 프로젝트에 pytest-cov 패키지를 이용하여 Codecov를 붙여보는 방법에 대해서 설명한다. git push를 하면 CircleCI 가 알아서 빌드 하면서 pytest-cov를 실행하고 code coverage를 측정하여 알려준다.


사전 준비

위에서 언급했듯이 pytest-cov를 이용하기 위해서는 Test와 CI 환경이 구축되어 있어야한다. 도움이 필요하다면 아래의 링크를 참고하면 된다.


Codecov 시작하기

Codecov 에서 세개의 웹호스팅 서비스 중에 하나를 선택하여 로그인한다.
이 포스트에서는 Github을 이용한다.

codecov main

해당하는 organization의 Integrate a repository을 누르면 다음 페이지로 넘어가고 Add new repository 버튼을 통해 프로젝트를 선택할 수 있다.

codecov gh

아래와 같은 그림이 나오면 프로젝트 설정이 완료된 것이다. Upload Token을 제공해 주는데 public 프로젝트에서는 필요없다.

codecov complete


Install pytest-cov

패키지들을 설치하고 requirements를 업데이트 한다.

$ pip install codecov
$ pip install pytest-cov
$ pip freeze > requirements.txt


Run pytest-cov

현재 프로젝트의 구조는 아래와 같다.
circleci 설정을 위한 circle.yml파일과 requirements.txt 파일 등의 설정 파일들이 존재하고 메인 코드인 hansung-bab.py, 테스트 코드인 test_sample.py 가 존재한다.

$ tree
.
[...]
├── circle.yml
├── hansung-bab.py
├── requirements.txt
└── test_sample.py


pytest-cov 실행 명령

pytest-cov 의 실행 명령어는 pytest --cov=[src] [test] 의 형태이다. [src] 에는 소스코드가 위치한 폴더명 혹은 소스 파일명을 입력하고 [test]에는 테스트 코드가 위치한 폴더명 혹은 테스트 파일명을 입력한다. 즉, [src]에 coverage를 측정하고자 하는 소스를 입력하고 [test]에는 측정하기 위해 사용되는 테스트를 입력하는 것이다.

$ pytest --cov=./ ./test_sample.py

으로 실행해보면 결과는 아래와 같다.

pytest cov result


CircleCI pytest-cov 연동하기

git push 할때마다 CI가 code coverage를 측정해서 결과를 알려주도록 설정이 필요하다.
circle.yml 파일을 아래와 같이 수정하여 빌드할 때 pytest-cov 명령을 수행하도록 하고,
codecov 라는 명령 추가해서 code coverage 결과를 codecov.io에 업로드 하여 웹으로 확인할 수 있도록 한다.

circle.yml

test:
    override:
        - pytest --cov=./ ./test_sample.py
    post:
        - codecov


결과 확인

작성한 내용들을 push 한 후 Circle CI Dashboard 에서 해당 빌드를 자세히 보면 pytest-cov와 codecov 명령을 수행하고 빌드가 성공한 것을 확인할 수 있다.

circleci pytest

circleci codecov

Codecov 에서는 code coverage 결과에 대한 자세한 내용을 확인할 수 있다.

result codecov

github pull request codecov comment

github repository 의 settings에 CircleCI 가 services로 등록이 되어있다면

github service

pull request 를 보낼때마다 codecov 가 coverage에 대한 정보를 커맨트로 달아준다.

codecov comment


참고자료

https://github.com/codecov/example-python

Spring AOP

프로그래밍을 할 때 핵심 기능(Business Logic)을 작성하면서 디버깅을 위한 log, 보안, 원자성을 위한 Transaction 등의 코드를 작성할 일이 많이 있다. 이러한 코드들을 핵심 기능과 함께 작성하는 것은 의존성을 높이고 재...… Continue reading