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

Azure DevOps中Docker运行pytest无法发布测试覆盖率报告

在Azure DevOps流水线Docker容器中运行pytest无法发布测试覆盖率报告的问题

问题现象

在Azure DevOps流水线中,在Docker容器内运行pytest时无法发布测试覆盖率报告,出现警告:
Warnings: Coverage XML was not created, skipping upload.

现有配置

Dockerfile

..
...

RUN pip install pytest pytest-azurepipelines pytest-cov
...
..

azure-pipelines.yml

- task: Bash@3
  displayName: Run Python Tests
  inputs:
    targetType: "inline"
    script: |
      docker run --user "$(id -u):$(id -g)" -v "$(System.DefaultWorkingDirectory)/data-science/app:/usr/src/app" "$(azure.acr.name).azurecr.io/project-name:$(branchName)" pytest tests/ --cov-report xml

流水线日志详情

系统在/usr/src/app/test-output.xml文件生成前尝试解析它,抛出System.IO.FileNotFoundException异常,随后该文件才生成,同时出现覆盖率XML未创建的警告。

更新说明

使用docker cp方案可在流水线中发布覆盖率,但无法在UI中查看行级覆盖率。

解决方案

由于pytest-azurepipelines插件在Docker容器内运行时,无法直接将报告传递给Azure DevOps任务,需按以下步骤调整:

  1. 修改pytest命令,明确输出路径与文件名
    调整docker run中的pytest命令,指定覆盖率报告输出到挂载的主机目录,同时禁用插件自动上传,改用Azure DevOps原生任务处理:

    docker run --user "$(id -u):$(id -g)" -v "$(System.DefaultWorkingDirectory)/data-science/app:/usr/src/app" "$(azure.acr.name).azurecr.io/project-name:$(branchName)" pytest tests/ --cov=./ --cov-report xml:./coverage.xml --no-header -v
    
    • --cov=./:指定覆盖当前目录下的代码
    • --cov-report xml:./coverage.xml:指定生成名为coverage.xml的覆盖率报告,存放在挂载目录中
    • --no-header/-v:调整输出格式,可选
  2. 添加Azure DevOps任务发布结果
    在Bash任务后添加两个任务,分别发布测试结果和覆盖率报告:

    • 发布测试结果:
      - task: PublishTestResults@2
        displayName: Publish Test Results
        inputs:
          testResultsFormat: 'JUnit'
          testResultsFiles: '**/test-*.xml'
          searchFolder: '$(System.DefaultWorkingDirectory)/data-science/app'
      
    • 发布覆盖率报告:
      - task: PublishCodeCoverageResults@1
        displayName: Publish Code Coverage Results
        inputs:
          codeCoverageTool: 'Cobertura'
          summaryFileLocation: '$(System.DefaultWorkingDirectory)/data-science/app/coverage.xml'
      
  3. 确保文件权限与路径映射正确

    • 由于使用了--user "$(id -u):$(id -g)",需确保主机挂载目录允许该用户写入,避免生成的报告文件无法被主机读取
    • 若仍无法查看行级覆盖率,需确保覆盖率报告中的文件路径与主机代码路径一致:可通过coverage.py配置文件调整路径映射,或在pytest命令中添加--cov-context=test参数,保证Azure DevOps能正确关联代码行

内容的提问来源于stack exchange,提问作者yardstick17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:27