ptest 병행 테스트와 동시에 덮어쓰는 방법

18448 단어 PythonTestCIpytesttech

개시하다


현대 개발에서 테스트 코드와 CI 환경은 없어서는 안 된다.그러나 개발 규모가 커지면서 테스트의 수가 늘어나고 실행 시간도 길어지고 있다.또한 테스트의 실행 시간이 길수록 개발자에게 피드백을 주는 시간이 길어져 개발 속도가 떨어진다.10분 이상 걸리면 위험 신호라고 할 수 있죠.
테스트 운행 속도가 떨어지지 않도록 데이터베이스와 화면 등 다른 것에 의존하지 말고 가벼운 대상을 사용해 테스트를 하는 것이 좋으나 병행화된 대응도 수단이다.
또한 코드 덮어쓰기도 개발의 중요한 지표 중 하나다.커버리지가 높다=품질이 높다고 할 수는 없지만 사실상 커버리지가 높을수록 안심하고 개발할 수 있다.또한 덮어쓰기 라인을 미리 측정하면 코드 오류를 테스트할 때[1]를 쉽게 발견할 수 있기 때문에 미리 덮어쓰기 라인을 측정하는 것이 중요하다.
참고로 코드 덮어쓰기에 대한 고찰은 아래 기사에 쓰여 있다.
https://zenn.dev/ikemo/articles/test-coverage-100-percent
이처럼 매우 중요한'테스트 병행화'와'코드 덮어쓰기 측정'은 이 두 가지를 동시에 실현하기 위해 공을 들여야 한다.본고는 다음과 같은 두 가지 방법을 동시에 실현하였다.
  • CircleaCI 용기에서 pytest를 병행화하여 실행 시간 개선
  • 측정 코드 덮어쓰기
  • 전제 조건


    다음 환경에서 확인합니다.
  • Python: 3.8 [2]
  • Django: 4.0.1
  • CircleCI
  • 코드 덮어쓰기 측정Codecov.
    Codecov 이전질문, 메르카리 등은 피해를 입었지만 편리한 서비스를 위해 자체적으로 계속 사용하고 있다(당연히 기본 대응이고 이후에는 문제가 없다는 전제).
    작업을 확인할 때전에도 썼어요. 자체 제작된 Django 애플리케이션이 사용됩니다.그 중에서pytest와 관련된 프로그램 라이브러리 버전은 다음과 같다.

  • pytest : 6.2.5

  • coverage : 6.2

  • pytest-cov : 3.0.0

  • pytest-django : 4.5.2

  • pytest-xdist : 2.5.0

  • django_coverage_plugin : 2.0.2
  • CircleaCI 구성


    우선 현재 사용 중인.circleci/config.yml을 직접 게재합니다.
    version: 2.1
    orbs:
      codecov: codecov/[email protected]
    
    commands:
      install_packages:
        steps:
          # Download and cache dependencies
          - restore_cache:
              keys:
                - v7-dependencies-{{ checksum "requirements/common.txt" }}-{{ checksum "requirements/development.txt" }}
    
          - run:
              command: |
                set -eu
                python -m venv venv
                . venv/bin/activate
                pip install -r requirements/development.txt
    
    jobs:
      build:
        docker:
          - image: cimg/python:3.8
            environment:
              - LANG: ja_JP.UTF-8
              - LANGUAGE: ja_JP.UTF-8
    
        resource_class: large
    
        working_directory: ~/repo
    
        steps:
          - checkout
          - install_packages
    
          - run:
              name: make build
              command: make build
    
      test:
        docker:
          - image: cimg/python:3.8
            environment:
              - LANG: ja_JP.UTF-8
              - LANGUAGE: ja_JP.UTF-8
    
        resource_class: large
        parallelism: 3
    
        working_directory: ~/repo
    
        steps:
          - checkout
          - install_packages
    
          - run:
              name: make unit-test
              command: |
                export COVERAGE_FILE=.coverage.${CIRCLE_NODE_INDEX}
                TESTFILES=$(circleci tests glob "apps/**/tests.py" "apps/**/test_*.py" "apps/**/*_tests.py" | circleci tests split --split-by=timings)
                echo $TESTFILES
                . venv/bin/activate
                pytest -n 8 \
                  --cov-branch \
                  --cov=apps \
                  --cov=templates \
                  --junit-xml=test-results/junit.xml \
                  $TESTFILES
    
          - save_cache:
              paths:
                - ./venv
              key: v7-dependencies-{{ checksum "requirements/common.txt" }}-{{ checksum "requirements/development.txt" }}
    
          - store_test_results:
              path: test-results
    
          - persist_to_workspace:
              root: ~/repo
              paths:
                - .coverage.*
    
      coverage:
        docker:
          - image: cimg/python:3.8
            environment:
              - LANG: ja_JP.UTF-8
              - LANGUAGE: ja_JP.UTF-8
    
        working_directory: ~/repo
    
        steps:
          - checkout
          - install_packages
    
          - attach_workspace:
              at: ~/repo
    
          - run:
              name: combile coverage
              command: |
                . venv/bin/activate
                coverage combine
                coverage xml
    
          - codecov/upload:
              file: coverage.xml
    
    workflows:
      version: 2
      main:
        jobs:
          - build
          - test
          - coverage:
              requires:
                - test
    
    요점은 다음과 같다.
  • 테스트용 작업test과 통계를 덮어쓰는 작업coverage을 분리하여 후자를 전자
  • 에 의존하게 한다.
  • parallelism: 3: 3 병렬 실행 용기
  • pytest 옵션
  • --cov-branch: 분기 네트워킹(ptest-cov 옵션) 사용
  • --cov=apps,--cov=templates: 덮어쓰기 측정 경로 지정(ptest-cov 옵션)
  • --junit-xml: JUNIt 형식의 XML 출력
  • store_test_테스트 결과를 CircleaCI에 저장합니다.이렇게 TESTS 탭이 표시됩니다.

  • 각 컨테이너 측정의 덮어쓰기 저장


    병행 실행 테스트와 동시에 덮어쓰기 측정을 하기 위해서는 병행 실행된 용기에서 측정된 덮어쓰기를 병합해야 한다.이를 위해 다음과 같은 일을 했다.
    먼저 덮어쓰기 측정 도구coverage에서 기본적으로 결과를 .coverage 파일에 씁니다.그러나 기본 설정은 모든 용기가 같은 파일 이름이기 때문에 저장persist_to_workspace할 때 덮어씁니다.이러한 상황을 방지하기 위해 다음과 같은 파일 이름을 변경했습니다.
    export COVERAGE_FILE=.coverage.${CIRCLE_NODE_INDEX}
    
    노드 ID는 ${CIRCLE_NODE_INDEX} 형식으로 지정됩니다.그리고 .coverage가 아니라 .coverage.0라는 파일 이름으로 저장합니다.CircleaCI가 아닌 다른 CI 서비스를 사용할 때, 모든 서비스에 적당한 환경 변수를 사용해서 덮어쓰지 마십시오.
    그런 다음 작업공간에 저장합니다.
    jobs:
      test:
        steps:
          - persist_to_workspace:
              root: ~/repo
              paths:
                - .coverage.*
    

    측정된 덮개를 하나로 정리하다


    그런 다음 측정된 덮어쓰기 영역을 하나로 요약합니다.이것은 다음 단계에서 진행된다.
    jobs:
      test:
        steps:
          - run:
              name: combile coverage
              command: |
                . venv/bin/activate
                coverage combine
                coverage xml
    
    명령을 사용하여 coverage combine 파일을 하나의 파일로 통합합니다.그런 다음 .coverage.* 명령을 사용하여 덮어쓰기를 XML로 출력합니다.HTML 형식을 사용하려면 coverage xml 명령을 실행합니다.
    마지막으로 Codecov에 업로드합니다.
    version: 2.1
    orbs:
      codecov: codecov/[email protected]
    
    jobs:
      coverage:
        steps:
          - codecov/upload:
              file: coverage.xml
    
    는 다음과 같은 덮어쓰기 상황을 기록한다.



    끝말


    이걸 쓰면서CircleaCI의 무료 프로그램coverage html이 지원된다는 걸 알게 됐어요.매달 30달러를 지불하는 건 솔직히 힘들어서 고마워요10 정도면 쉽게 대처할 수 있어요.
    각주
    시험에 통과했어야 할 코드가 통과되지 않았을 때'이상하다'고 생각하고 조사해보면 테스트 코드 작성에 여러 차례 오류가 있었다.↩︎
    기사 파이톤은 강등되었지만 히로쿠에서 운행 환경을 옮겼기 때문이다.↩︎

    좋은 웹페이지 즐겨찾기