17

我正在通过 sonar-runner 运行一组非常简单的 python 项目,并且在显示测试时遇到问题。

我正在使用 Python 插件 1.1 运行声纳 3.2.1。覆盖率报告是先前生成的。

我有以下设置:

sonar.dynamicAnalysis=reuseReports
sonar.core.codeCoveragePlugin=cobertura
sonar.python.coverage.reportPath=coverage.xml

无论我此时做什么,都不会显示覆盖范围。

我的测试与我的来源在同一个文件夹中......这可能是问题吗?是否有要求如何布置源代码以使覆盖率报告由声纳正确分析?

编辑:添加更多注释...

  • 它是一个多项目 python 实例。我在那里有三个项目。声纳报告中似乎都正确显示了其他所有内容。我已经为每个目录定义了基本目录和源目录,并且coverage.xml 文件已预先生成到每个目录的基本目录中。
  • 覆盖小部件显示,但显示:

    Code coverage
    -
    Unit test success
    0 tests
    
  • 当我运行 sonar-runner 时,我也看到了:

    10:04:29.641 INFO  p.PhasesTimeProfiler - Sensor PythonCoverageSensor...
    10:04:29.642 INFO  .p.c.CoberturaParser - Parsing report '/home/jenkins/jobs/myproject/workspace/trunk/src/python/coverage.xml'
    10:04:29.883 INFO  p.PhasesTimeProfiler - Sensor PythonCoverageSensor done: 242 ms
    
4

4 回答 4

14

也有这个问题,pytest 没有生成格式正确的覆盖报告,sonarqube 可以利用什么。我coverage xml -i在 pytest 生成覆盖率报告后运行,此命令生成格式正确的覆盖率报告,sonarqube 可以理解。

于 2017-05-10T14:12:13.170 回答
5

我遇到了一个类似的问题,即 Python 测试覆盖率没有反映在 SonarQube 中。当coverage.xml的源文件路径不正确并且SonarQube 在解析xml 报告时无法找到这些源文件时,就会出现此问题。

在coveragepy 上有一个针对同一问题的开放错误:https ://github.com/nedbat/coveragepy/issues/578和解决方法https://github.com/LibraryOfCongress/concordia/pull/857。但是,这种解决方法对我不起作用。

我最终做了什么:运行我的测试命令(python -m pytest -m unit)生成具有错误路径的coverage.xml后,我运行了coverage xml -i。它覆盖了以前的coverage.xml并具有指向源文件的正确路径。

现在 SonarQube 有了覆盖信息。

于 2020-05-06T11:47:32.647 回答
2

“sonar.python.coverage.reportPath”必须指向覆盖文件相对于“sonar-project.properties”文件的路径。通常,这些临时文件是在“target”或“bin”等临时文件夹中生成的。所以你的配置应该更像:

sonar.python.coverage.reportPath=target/coverage.xml
于 2012-10-12T08:43:00.690 回答
2

这个问题的简单答案:-

  1. 当我们在另一个位置生成 XML 报告并在另一个位置运行 SonarAnalyze 时,通常会出现此问题。因此,Sonaranalyze 将无法选择 coverage.xml 中提到的那些文件。

  2. 因此,如果您在 xml 文件中看到源代码,那么它们应该包含某个位置,因此如果 coverage.xml 中提到的位置与 Sonaranalyze 的路径匹配,那么您的问题将得到解决。来源<>a/b/c/d<>来源

  3. 现在的挑战是如何检查coverage.xml 的文件夹结构。获取正确的文件位置和路径。我使用命令行进行检查,因为我使用的是Windows 代理。(Azure 开发运维)

  • 任务:CmdLine@2

    输入:

    script: |
    
      echo  '$(System.DefaultWorkingDirectory)'
    
      dir
    
      dir subfoldername
    

其中 dir 将列出所有目录或文件

  1. 然后在知道文件夹结构后,我只是通过更改coverage.xml 中的源目录来操作coverage.xml。我使用 powershell 编辑了您可以使用 sed 的coverage.xml,这取决于您的代理。

对于任务:PowerShell@2

  inputs:

    targetType: 'inline'

    script: |


  
      (Get-Content coverage.xml)| ForEach-Object { $_.replace("a/b/c","$(System.DefaultWorkingDirectory)") } | Set-Content coverage2.xml

      Copy-Item -Path coverage2.xml -Destination coverage.xml -PassThru

      Remove-Item coverage2.xml

对于 bash 用户 sed -i 's#a/b/c#D:/AZ#g;s#/x/c#D:/m#g;' 覆盖率.xml

然后我成功地获得了 Sonarqube 的报道。

于 2021-07-01T05:43:08.857 回答