You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:45:34