在Azure Pipelines中用pytest发布Python项目覆盖率并解决0%显示问题
解决方案
你遇到的Azure Pipelines覆盖率显示为0%的问题,可通过以下步骤排查修复:
1. 先排查本地运行是否正常
在本地开发环境执行你yaml配置里的pytest命令,打开生成的htmlcov/index.html查看覆盖率是否正常:
- 如果本地覆盖率同样为0%,说明是pytest-cov的配置问题,优先排查下文的路径和包安装问题
- 如果本地覆盖率正常,说明是Azure Pipelines的路径匹配或任务配置问题
2. 修复包安装和cov路径匹配问题
90%以上的此类问题都是因为pip install .后,pytest导入的是site-packages下的安装包,而非本地src_dir目录下的源码,导致cov统计路径和实际运行代码路径不匹配。
可以选择以下任意一种方案修复:
- 方案一:将安装命令改为可编辑模式安装,导入模块时直接指向本地
src_dir源码 - 方案二:不需要修改安装命令,直接将
--cov参数的值改为你的Python包名
- bash: | # 方案一:加-e参数使用可编辑模式安装 pip install -e .[test] pip install pytest pytest-azurepipelines pytest-cov # 搭配方案一使用:--cov传绝对路径避免识别错误 pytest --junitxml=junit.xml --cov=$(System.DefaultWorkingDirectory)/src_dir --cov-report=xml --cov-report=html tests # 方案二(不需要加-e安装时使用):把--cov的值替换成你的实际包名即可,比如包名为myutils就写--cov=myutils # pytest --junitxml=junit.xml --cov=你的包名 --cov-report=xml --cov-report=html tests displayName: Test
3. 调整Pipeline任务配置
先发布测试结果再发布覆盖率,同时也可以使用新版的覆盖率发布任务提升兼容性:
# 先发布JUnit测试结果,避免顺序异常导致覆盖率统计失败 - task: PublishTestResults@2 inputs: testResultsFormat: 'JUnit' testResultsFiles: '$(System.DefaultWorkingDirectory)/junit.xml' condition: succeededOrFailed() # 用v2版本发布覆盖率,不需要手动指定工具类型,自动识别Cobertura格式 - task: PublishCodeCoverageResults@2 inputs: summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml' reportDirectory: '$(System.DefaultWorkingDirectory)/**/htmlcov' condition: succeededOrFailed()
4. 可选排查步骤
如果以上操作后还是异常,可以加一个临时步骤打印coverage.xml的内容,确认文件本身是否有正常的覆盖率数据:
- bash: cat coverage.xml displayName: 打印覆盖率报告内容排查 condition: succeededOrFailed()
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

