Python项目SonarCloud代码覆盖率不显示问题求助
问题根因
你当前的配置存在3个核心错误,导致SonarCloud无法正常展示覆盖率数据:
- pytest覆盖率统计范围错误:执行的
py.test --cov=tests/ --cov-report xml:cov/coverage.xml命令中,--cov参数指定为测试代码目录,生成的覆盖率报告仅统计测试代码的覆盖情况。而你在配置中通过sonar.exclusions=tests/**排除了所有测试目录文件,导致Sonar没有可展示的业务代码覆盖率数据,从你提供的日志中也可以明确看到,扫描器仅保存了tests/目录下文件的覆盖率指标。 - 配置参数混用错误:
sonar.python.xunit.reportPath是测试结果报告(pytest生成的junit格式xml)的配置项,你传入了覆盖率报告路径,二者格式完全不匹配,配置无效- 后续新增的
sonar.coverage.jacoco.xmlReportPaths是Java生态Jacoco覆盖率工具的专属配置项,Python pytest-cov生成的是Cobertura格式覆盖率报告,和Jacoco格式不兼容,因此会抛出解析错误
- 误将默认日志提示当做问题:Sonar扫描时默认会启用Java相关插件,Jacoco相关的提示属于Java项目的默认检查逻辑,Python项目完全不需要理会该提示,也不需要额外配置Jacoco相关参数。
修复步骤
- 修正pytest覆盖率生成命令,将
--cov参数修改为你的业务源代码目录:
若业务代码存放在项目根目录的src/文件夹下,命令改为:
若业务代码直接存放在项目根目录,命令改为:py.test --cov=src/ --cov-report xml:cov/coverage.xmlpy.test --cov=./ --cov-report xml:cov/coverage.xml - 清理sonar-project.properties的无效配置,最终保留配置如下:
如果你需要同时展示测试用例执行结果,可以单独用pytest生成junit格式的测试报告:sonar.exclusions=tests/**, cov/** sonar.python.coverage.reportPaths=cov/coverage.xml sonar.verbose=true sonar.python.version=3.8.2
再新增配置pytest --junitxml=cov/xunit.xmlsonar.python.xunit.reportPath=cov/xunit.xml即可,不要和覆盖率报告混用同一个文件路径。 - 重新执行原sonar-scanner扫描命令即可正常上报覆盖率数据。
内容的提问来源于stack exchange,提问作者Lucas Scheepers
相关产品推荐
相关产品推荐

