택시짱의 개발 노트

django 토이 프로젝트에 git action, code cov 적용해보기 (회고 느낌) - 1 본문

Django(장고)

django 토이 프로젝트에 git action, code cov 적용해보기 (회고 느낌) - 1

택시짱 2022. 2. 3. 01:20

토이프로젝트 시작 이유로는 회사를 다니면서 배운 기술( django code 작성법, test code, CI, elasticsearch, swagger 등등..)을 복습 및 잊어 버리지 않기 위해 시작하게 되었다.

토이 프로젝트는 간단한 API를 설계 하였고
API를 혼자 설계 및 테스트하면 재미가 없기 때문에 나의 api를 사용해줄
android 개발자도 섭외 했다. ( 아래는 현재 진행 중인 토이 프로젝트 github 링크 )
https://github.com/taxijjang/django_shopping_mall_api_project

 

GitHub - taxijjang/django_shopping_mall_api_project: django로 쇼핑몰 API 프로젝트

django로 쇼핑몰 API 프로젝트 . Contribute to taxijjang/django_shopping_mall_api_project development by creating an account on GitHub.

github.com



본론으로 돌아와 토이 프로젝트를 진행하며 내가 새롭게 작성한 코드로 인해
기존에 작성한 코드에 문제가 생기는 사이드 이펙트를 최대한 없애고 싶어
test code를 작성하기 시작했다.

test code를 작성하면서 test code를 통과한 code는 문제가 없는걸까?라는 고민을 했고
아래의 인용글 처럼 믿어도 되지만 맹신해서는 안된다고 느꼈다.

작성한 테스트는 믿어도 될까?
믿어도 되지만 맹신해서는 안된다. 믿어도 되지만 영속할 것이라 생각해선 안된다. 테스트 코드는 매우 연약하다. 화면 일부의 텍스트가 변경되는지를 확인하는 테스트 코드의 경우는 더욱 연약하다.
하지만 반대로 말하자면, 페이지나 컴포넌트의 변경이 발생하기 전까지는 우리의 흐려지는 기억을 완벽하게 대신해줄 수 있는 것은 테스트 코드뿐이다. 테스트 코드는 문서의 기능을 같이 겸할 수 있기 때문에 정리를 깔끔하게 해놓는다면 원본 코드에는 어떤 비지니스 로직이 들어있는지 매우 쉽게 파악할 수 있어서 추후에 발생가능한 버그 수정이나 기능 추가건에 대해서 유연하게 대처할 수 있다.

출처: https://medium.com/watcha/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%AF%BF%EC%96%B4%EB%8F%84-%EB%90%A0%EA%B9%8C-3da3f337f136



맹신할 수 없다면 많은 믿음을 가질 수 있도록 test code를 조금더 탄탄하게 작성 할 수도 있다고 생각 했고, 또 다른 생각은 내가 작성한 코드를 모두다 검사?를 한다면 되지 않을까 라는 생각을 했다.

그래서 coverage라는 것을 알게 되었다.

Coverage란?
코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나이다. 테스트를 진행하였을 때 ‘코드 자체가 얼마나 실행되었느냐’는 것이고, 이는 수치를 통해 확인할 수 있다.

출처: https://tecoble.techcourse.co.kr/post/2020-10-24-code-coverage/



Django에서도 역시 coverage를 측정하는 package가 있었다. ( https://coverage.readthedocs.io/ )
coverage가 뭔지 또 어떻게 하는지는 이분의 글을 많이 참고 하였다. ( https://minyoungjung.github.io/%ED%8C%8C%EC%9D%B4%EC%8D%AC/django/%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/%ED%85%8C%EC%8A%A4%ED%8A%B8/2017/06/20/inserting-testcode-django/ )

 

Django 서비스 테스트하기

Coverage 설치 파이썬 코드의 테스트 커버리지를 나타내 주는 라이브러리인 coverage를 설치한다. pip3 install coverage Coverage 설정 .coveragerc 파일 생성 vi .coveragerc vim을 이용해서 간단하게 coveragerc 설정

minyoungjung.github.io



coverage의 수치를 점점 높여가며 test code를 작성하니 게임을 하는 것처럼 재미가 있었다.
아래와 같이 coverage를 확인 할 수 있다.

83프로.... 아직 멀었다.


그렇게 프로젝트를 진행하다 보니 여러 오픈소스의 github README.md를 보게되었고 아래와 같이 badge형태의 coverage를 표시하는 부분을 알게 되었다. 어떻게 하는거지 찾아보니까 https://codecov.io/ 라는 사이트를 통해서 가능 한 것을 찾게 되었다.


나는 내가 commit이나 pr을 요청 할때 나의 coverage를 계속해서 확인하고 싶었고 역시 찾아보니까 github action을 이용하여 가능 했다. 이때 CI라는 것을 알게 되었다.

CI(Continuous Integration)
개발자가 각각 개발한 소스코드를 모아서 한꺼번에 빌드하는 통합 빌드의 과정을 특점 시점이 아니라 주기적으로 수행함으로써 통합에서 발생하는 오류를 사전에 해결하고 이러한 과정들에 소요되는 시간을 줄이기 위한 기법을 말한다.


github action을 이용하기 위해서는 yml파일을 생성해 주어야 했다.
master, dev branch에 pr을 요청시 coverage를 확인하고, codecov에 coverage를 업데이트 하도록 했다.

name: Django CI

on:
  pull_request:
    branches: [ master, dev ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.7]

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
        
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements/requirements-dev.txt
        
    - name: Run Tests
      run: |
        coverage run manage.py test --settings=config.settings.test
        coverage report
        coverage xml
        coverage html
        
    - name: "Upload coverage to Codecov"
      uses: codecov/codecov-action@v2
      with:
        fail_ci_if_error: true
        directory: ./htmlcov/
        files: ./coverage.xml
        flags: unittests


github action을 통해 codecov에 업데이트 된것을 확인할 수 있다.
https://app.codecov.io/gh/taxijjang/django_shopping_mall_api_project

 

Codecov

 

app.codecov.io


나도 README.md에 coverage 뱃지를 추가하고 싶었기에 역시나 찾아 보았고
codecov settings의 Badge라는 항목에서 찾을 수 있었다.

[![codecov](https://codecov.io/gh/taxijjang/django_shopping_mall_api_project/branch/dev/graph/badge.svg?token=J761FVEC5X)](https://codecov.io/gh/taxijjang/django_shopping_mall_api_project)


README.md에 추가하였고
현재 프로젝트의 coverage를 README에서 확인할 수 있게 되었다.




마지막으로 프로젝트의 기능의 추가는 많이 추가가 되지는 않을것 같기에
coverage를 100%로 만들어 보려고 한다.

이 프로젝트를 하면서 이런저런 새로운것도 많이 알게 되었고, 여러 개념도 알게 되었다. 아직 진행중이기 때문에 간간히 commit을 이어나갈 예정이다~

반응형
Comments