ptest 병행 테스트와 동시에 덮어쓰는 방법
개시하다
현대 개발에서 테스트 코드와 CI 환경은 없어서는 안 된다.그러나 개발 규모가 커지면서 테스트의 수가 늘어나고 실행 시간도 길어지고 있다.또한 테스트의 실행 시간이 길수록 개발자에게 피드백을 주는 시간이 길어져 개발 속도가 떨어진다.10분 이상 걸리면 위험 신호라고 할 수 있죠.
테스트 운행 속도가 떨어지지 않도록 데이터베이스와 화면 등 다른 것에 의존하지 말고 가벼운 대상을 사용해 테스트를 하는 것이 좋으나 병행화된 대응도 수단이다.
또한 코드 덮어쓰기도 개발의 중요한 지표 중 하나다.커버리지가 높다=품질이 높다고 할 수는 없지만 사실상 커버리지가 높을수록 안심하고 개발할 수 있다.또한 덮어쓰기 라인을 미리 측정하면 코드 오류를 테스트할 때[1]를 쉽게 발견할 수 있기 때문에 미리 덮어쓰기 라인을 측정하는 것이 중요하다.
참고로 코드 덮어쓰기에 대한 고찰은 아래 기사에 쓰여 있다.
이처럼 매우 중요한'테스트 병행화'와'코드 덮어쓰기 측정'은 이 두 가지를 동시에 실현하기 위해 공을 들여야 한다.본고는 다음과 같은 두 가지 방법을 동시에 실현하였다.
전제 조건
다음 환경에서 확인합니다.
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 병렬 실행 용기--cov-branch
: 분기 네트워킹(ptest-cov 옵션) 사용--cov=apps
,--cov=templates
: 덮어쓰기 측정 경로 지정(ptest-cov 옵션)--junit-xml
: JUNIt 형식의 XML 출력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 정도면 쉽게 대처할 수 있어요.각주
시험에 통과했어야 할 코드가 통과되지 않았을 때'이상하다'고 생각하고 조사해보면 테스트 코드 작성에 여러 차례 오류가 있었다.↩︎
기사 파이톤은 강등되었지만 히로쿠에서 운행 환경을 옮겼기 때문이다.↩︎
Reference
이 문제에 관하여(ptest 병행 테스트와 동시에 덮어쓰는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ikemo/articles/pytest-parallel-coverage텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)