如何在buildspec.yaml中集成AWS CodeBuild与Python pytest-cov覆盖率报告
解决方案:将Python代码覆盖率报告集成到AWS CodeBuild
核心思路
AWS CodeBuild原生支持Cobertura格式的代码覆盖率报告,但pytest-cov默认生成的是coverage.py标准XML格式,无法直接被识别。我们需要通过工具将coverage XML转换为Cobertura兼容格式,再配置buildspec让CodeBuild读取该报告。
步骤1:安装格式转换工具
在buildspec的install阶段新增安装cov-cobertura的命令,该工具可将coverage XML转换为CodeBuild支持的Cobertura格式:
# 在install阶段的commands中添加 - python3 -m pip install --upgrade cov-cobertura
步骤2:修改测试命令并添加转换步骤
执行pytest生成coverage XML后,新增转换命令生成Cobertura格式报告:
# 在pytest命令之后添加 - cov-cobertura ./pytest_reports/cov.xml -o ./pytest_reports/cobertura-coverage.xml
步骤3:更新buildspec的reports配置
在现有reports区块下新增覆盖率报告的配置,指定Cobertura格式:
reports: pytest_reports: files: - junitxml-report.xml base-directory: ./pytest_reports file-format: JUNITXML # 新增覆盖率报告配置 pytest_coverage_reports: files: - cobertura-coverage.xml base-directory: ./pytest_reports file-format: COBERTURA
修改后的完整buildspec.yaml
version: 0.2 env: variables: # Elastic Container Registry (ECR) hosts MAIN_REPO: 999999999999.dkr.ecr.us-east-1.amazonaws.com DR_REPO: 999999999999.dkr.ecr.us-west-2.amazonaws.com phases: install: runtime-versions: python: 3.9 commands: # 新增安装cov-cobertura - python3 -m pip install --upgrade pip - python3 -m pip install --upgrade pytest - python3 -m pip install --upgrade pytest-mock - python3 -m pip install --upgrade pytest-cov - python3 -m pip install --upgrade cov-cobertura build: on-failure: ABORT commands: # ------------------------------------------------------------------------------------------- # PART 1 - EXECUTE UNIT TESTS AND CODE COVERAGE ON THE PYTHON SOURCE CODE # ------------------------------------------------------------------------------------------- - pip install --extra-index-url https://artifactory.my-company-domain.com/artifactory/api/pypi/private-pypi/simple -e ./the_python_code - python3 -m pytest --junitxml=./pytest_reports/junitxml-report.xml --cov-fail-under=69 --cov-report xml:pytest_reports/cov.xml --cov-report html:pytest_reports/cov_html --cov-report term-missing --cov=./the_python_code/src/ ./the_python_code # 新增转换命令生成Cobertura格式报告 - cov-cobertura ./pytest_reports/cov.xml -o ./pytest_reports/cobertura-coverage.xml # ------------------------------------------------------------------------------------------- # PART 2 - BUILD THE DOCKER IMAGE AND PUBLISH TO ECR # ------------------------------------------------------------------------------------------- - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 999999999999.dkr.ecr.us-east-1.amazonaws.com - docker image build -t 999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name . - docker push 999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name # ------------------------------------------------------------------------------------------- # PART 3 - BUILD THE SAM PROJECT # ------------------------------------------------------------------------------------------- - printenv - echo "-----------------------------------------------------" - 'echo "ARTIFACTS_BUCKET_NAME : $ARTIFACTS_BUCKET_NAME"' - 'echo "ARTIFACTS_BUCKET_PATH : $ARTIFACTS_BUCKET_PATH"' - 'echo "CODEBUILD_KMS_KEY_ID : $CODEBUILD_KMS_KEY_ID"' - echo "-----------------------------------------------------" - MAIN_TEMPLATE="main-template.yaml" - sam build --debug - | sam package \ --template-file .aws-sam/build/template.yaml \ --output-template-file "${MAIN_TEMPLATE}" \ --image-repository "999999999999.dkr.ecr.us-east-1.amazonaws.com/my-docker-image-tag-name" \ --s3-bucket "${ARTIFACTS_BUCKET_NAME}" \ --s3-prefix "${ARTIFACTS_BUCKET_PATH}" \ --kms-key-id "${CODEBUILD_KMS_KEY_ID}" \ --force-upload reports: pytest_reports: files: - junitxml-report.xml base-directory: ./pytest_reports file-format: JUNITXML # 新增覆盖率报告组 pytest_coverage_reports: files: - cobertura-coverage.xml base-directory: ./pytest_reports file-format: COBERTURA artifacts: files: - main-template.yaml - parameters/*.json
效果验证
配置完成后重新运行CodeBuild构建,可在CodeBuild控制台的报告页面看到两个独立报告组:
pytest_reports:原有单元测试结果pytest_coverage_reports:新增的代码覆盖率报告,包含整体覆盖率、各文件/函数覆盖率等详细数据
内容的提问来源于stack exchange,提问作者Jim Tough
相关产品推荐
相关产品推荐

