python coverage with unittest 적용하기 feat. travis 기술 이야기 2021. 1. 11. 00:58

python coverage 사용법에 대해서 검색해보니 하나 같이 비슷한 내용이네. 나는 unittest를 사용 중인데, 진짜 너무 기본적인 내용들 뿐이고 내용도 너무 빈약해서 official guide를 보고 적용하였다. unittest 사용하는 프로젝트에 적용하는 방법, travis CI에 적용하는 방법을 간단하게 정리해서 올려둔다.

설치하기

pip install coverage 로 설치하면 된다. 중요한것은 본인 프로젝트의 setup.py에 의존성을 추가해주는 것이다. 특별히 extras_require에 추가하고, 설치할 때는 pip install -e.[dev] 옵션으로 설치하면 된다. 즉, 개발자는 pip install -e.[dev] 요렇게 설치하도록 가이드 하면된다. README 업데이트 고고.ㅎ

setup(name='smtm',
    version='0.1',
    description='make money using algorithm with python',
    long_description=long_description(),
    url='https://github.com/msaltnet/smtm',
    author='msalt',
    author_email='salt.jeong@gmail.com',
    license='MIT',
    packages=find_packages(),
    classifiers=[
            'Programming Language :: Python :: 2.7',
            'Programming Language :: Python :: 3',
            'Programming Language :: Python :: 3.6',
        ],
    install_requires=[
            'requests==2.25.0'
        ],
    extras_require={
        'dev': [
            'coverage'
        ]
    },
    test_suite='setup.smtm_test_suite',
    zip_safe=False)

실행하기

unittest를 사용하는 경우 coverage run -m unittest discover 로 실행 할 수 있다. smtm project 에서는 coverage run --omit="*/test*" -m unittest discover ./tests/ *test.py를 실행하면 된다. run을 실행하면 .coverage 바이너리 파일이 생성된다. 굳이 열어보면 아래와 같은 내용을 확인 할 수 있다. 이때 --omit="*/test*"은 커버리지 체크에 테스트 파일이 포함되지 않도록 하기 위함이다.

coverage report -m을 실행하면 그 결과 파일이 화면에 출력된다.

추상클래스는 빼야하는데, 넣어도 96%이군. TDD 프로젝트라.ㅎ

coverage html 을 실행하면 htmlcov 라는 폴더에 index.html을 포함한 static 파일들이 잔뜩 생긴다. index.html을 브라우저에서 열면 확인이 가능하다.

다른 test framework을 사용하는 방법외의 자세한 사용법은 Coverage.py에 자세히 나와있다. 그냥 사용법만 덩그러니 복붙해 놓은 어설플 블로그 보느니 official guide를 보는것이 낫다. 그래도 나는 실제 프로젝트에 어떻게 적용하고, setup.py에 추가하는 방법이나 CI/Cd 연동 방법까지 기술했는데...

Travis CI X codecov 사용하기

코드 커버리지는 coverage 패키지를 통해서 진행 측정했고, 결과는 바이너리 파일로 생성되는 것을 확인했다. 그것을 어떻게 보여주느냐가 중요한데, Travis CI를 통해서 매 커밋마다 테스트를 진행하고, 현재 커밋의 상태를 뱃지 형태로 깃헙 레포 첫화면에 표시가 된다.

커버리지도 결과를 표시하고 싶은데, 커버리지 테스트 결과를 클라우드에 저장해서 뱃지 형태로 제공하고 Pull-Reqeust에도 표시가 되었으면 좋겠다 싶은 마음을 잘 알아주는 서비스가 있었다.

coverallscodecov라는 서비스가 있었는데, 둘을 잘 비교해준 포스트가 있어서 선태에 도움이 되었다. 감사.ㅎ Codecov vs Coveralls

당장 codecov에 가입했다. repo 선택하고, 토큰 받았다. 근데, travis는 token이 필요없다. codecovtravis가 서로 연동된다.

.travis.yml 파일을 좀 만져주면 될 것 같은데, Travis team blog post 내용을 보니 그냥 codecov만 실행해줘도 알아서 되는것 처럼 설명해놨다. 가이드가 pytest 기준이라 일부만 참고해서 smtm 프로젝트의 .travis.yml을 수정해 보았다.

before_install:
  - python --version
  - pip install -U pip
  - pip install codecov  

# command to install dependencies
install: pip install -e .[dev]

# command to run tests
script: coverage run --omit="*/test*" -m unittest discover ./tests/ *test.py

after_success:
  - codecov # submit coverage

중요한 점은 codecov를 travis에서만 설치하는 것이다. 어차피 로컬에서는 submit할 일이 없으니, travis의 before_install에만 추가해주었다. script에는 coverage를 통해서 테스트를 실행하도록 하고, after_success 항목에서 submit 하게 했다.

https://codecov.io/ 대쉬보드에 들어가보니 한눈에 보기 좋게 정리가 잘 되어있다.ㅎ 그리고 깃헙 뱃지도 잘 나온다잉~ㅎ

https://github.com/msaltnet/smtm

마치며

내가 블로그를 쓰는 이유는 official reference 에 있는 내용을 옮겨 놓고자 함이 아니다. 국문으로 xxx 사용법 이런 글을 눌러보면 번역 수준에도 못 미치는 글들이 많다. 물론 블로그에 소중한 글들도 많고, 나 역시 그런 블로거들에게 보답하고자 이렇게 시간을 들여서 글을 작성하고 있는 것이다.

개인적으로 블로그 글은 자신의 경험이 바탕이 되어서, official reference를 사용할 때, 적용할 때 문제점이나 주의해야 할 점 또는 이해하기 어려웠던 부분이나 응용할 수 있는 부분들을 정리해서 올리는 것이 좋다고 생각한다. 그것이 디지털 쓰레기를 만들지 않는 길이고 누군가에게 많은 도움이 될 수 있는 보람있는 일이 될 것이라 확신한다. 보통 그런 글들에서 감사의 댓글이 많이 달려있다.ㅎ

댓글