SonarQube 没有从 lcov 读取 javascript 测试覆盖率

Posted

技术标签:

【中文标题】SonarQube 没有从 lcov 读取 javascript 测试覆盖率【英文标题】:SonarQube not reading javascript test coverage from lcov 【发布时间】:2016-09-06 11:45:28 【问题描述】:

我正在将 Karma 测试集成到 maven 中,并使用 SonarQube 进行测试覆盖率报告。

虽然我能够查看 html 业力测试覆盖率报告(karma.conf.js 中的覆盖类型 HTML),但当 karma.conf.js 中的类型为 lcov 时,我无法在 SonarQube 中查看结果。

pom.xml的内容

<properties>
    <sonar.language>js</sonar.language>
    <sonar.exclusions>src/main/content/jcr_root/etc/clientlibs/$apps.project.path/js/vendor/**</sonar.exclusions>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.javascript.lcov.reportPath>src/main/content/jcr_root/etc/clientlibs/$apps.project.path/karma_target/lcov.info</sonar.javascript.lcov.reportPath>
</properties>



<build>
    <!-- Karma test sonar coverage properties: Start-->   
    <sourceDirectory>$basedir/src/main/content/jcr_root/etc/clientlibs/$apps.project.path/js</sourceDirectory>
    <testSourceDirectory>$basedir/src/main/content/jcr_root/etc/clientlibs/$apps.project.path/js_test</testSourceDirectory>

当我运行mvn clean install sonar:sonar 时,它会在属性中提到的&lt;sonar.javascript.lcov.reportPath&gt; 中创建lcov.info 文件。

lcov.info 文件内容:

TN:
SF:D:\Workspace\Workspace_MasterCard\Issuer_53\loyalty\aem\loyalty-aem-web\trunk\loyalty-aem-web-ui\src\main\content\jcr_root\etc\clientlibs\loyalty\js\config\namespace.js
FN:15,(anonymous_1)
FNF:1
FNH:1
FNDA:5,(anonymous_1)
DA:2,1
DA:15,1
DA:17,5
DA:21,5
DA:22,0
DA:25,5
DA:28,8
DA:30,5
DA:33,8
DA:36,5
LF:10
LH:9
BRDA:2,1,0,1
BRDA:2,1,1,1
BRDA:21,2,0,0
BRDA:21,2,1,5
BRDA:28,3,0,5
BRDA:28,3,1,3
BRF:6
BRH:5
end_of_record

运行后,SonarQube 仪表板显示 js 代码违规但不填充代码覆盖率。

karma.conf.js中的配置:

preprocessors: 
      'tpl/*.html': 'ng-html2js',
      '!(vendor)/*.js': 'coverage'
    ,

    coverageReporter: 
      // specify a common output directory
      type: 'lcov',
      dir : 'karma_target/karma-coverage'
    ,

使用的SonarQube版本是5.0.1,js插件版本是2.11

我猜问题出在相对路径上,我确实浏览了这些链接 here 和 here,尝试手动更新 SF 路径以相对指向 lcov.info 文件,但均无济于事。 % 仍然是 0。

如果我在这里做错了什么,请告诉我。控制台日志如下,所有引用的路径都是正确的。

[INFO] [13:21:32.877] Base dir: D:\Workspace\Workspace_MasterCard\Issuer_53\loyalty\aem\loyalty-aem-web\trunk\loyalty-aem-web-ui
[INFO] [13:21:32.877] Working dir: D:\Workspace\Workspace_MasterCard\Issuer_53\loyalty\aem\loyalty-aem-web\trunk\loyalty-aem-web-ui\target\sonar
[INFO] [13:21:32.886] Source paths: pom.xml, src/main/content/jcr_root/etc/clientlibs/loyalty/js
[INFO] [13:21:32.888] Test paths: src/main/content/jcr_root/etc/clientlibs/loyalty/js_test

[INFO] [13:21:34.441] Analysing D:\Workspace\Workspace_MasterCard\Issuer_53\loyalty\aem\loyalty-aem-web\trunk\loyalty-aem-web-ui\src\main\content\jcr_root\etc\clientlibs\loyalty\karma_target\lcov.info
[INFO] [13:21:34.441] 25/25 source files have been analyzed

【问题讨论】:

lcov.info 是否只包含这 9 行? 不,我刚刚截取了前几行的截图 lcov.info 应该包含以 DA 开头的行以指示应该覆盖的行:是这样吗?您还可以提供更大的日志部分,至少在 Analysing...lcov.info 上方和下方的行。 更新lcov.info文件内容 lcov.info 现在看起来没问题。如果可以提供完整的日志,会更容易帮助您。如果无法解析文件路径,则会出现警告。 【参考方案1】:

终于搞定了。就是这个相对路径的恶毒问题!问题在于karma.conf.js 文件相对于目标和其他文件夹的位置。现在一切正常。

【讨论】:

以上是关于SonarQube 没有从 lcov 读取 javascript 测试覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube:扫描过程忽略 lcov.info

SonarQube 和 Lcov 报告无法解析文件路径

SONARQUBE lcov 导入错误 - 无法解析 1 个文件路径

Sonarqube 默认覆盖范围为 0,来自具有绝对路径的 Karma Coverage LCOV 文件

LCOV.INFO 有 SF 的绝对路径

从 gcov/lcov 覆盖结果中排除某些功能