Karma 为具有无效行号的 Angular 项目生成 lcov 报告

Posted

技术标签:

【中文标题】Karma 为具有无效行号的 Angular 项目生成 lcov 报告【英文标题】:Karma produces lcov report for angular project with invalid line numbers 【发布时间】:2016-10-02 21:39:39 【问题描述】:

我有一个带有一些测试的 Angular 项目。我的构建是用 Gulp 编写的。我使用 Karma 运行测试并生成 lcov 报告。

然后我使用 gulp-sonar 插件来运行 Sonar。我的声纳配置如下所示:

"sonar": 
  "host": 
    "url": "http://mysonar.example.com.au"
  ,
  "projectKey": "sonar:advertising-test",
  "projectName": "advertising-test",
  "projectVersion": "1.0.0",
  "sources": "app/js",
  "javascript": 
    "lcov": 
      "reportPath": "reports/coverage/lcov.info"
    
  ,
  "exec": 
    "maxBuffer": "1048576"
  

Sonar 运行并分析代码,但在尝试读取 lcov 报告时失败:

[09:38:58] 09:38:58.322 WARN  - Problem during processing LCOV report: can't save DA data for line 0.
java.lang.IllegalArgumentException: Line with number 0 doesn't belong to file app/js/main.js
...    
[09:38:58] 09:38:58.324 WARN  - Problem during processing LCOV report: can't save DA data for line 65.
java.lang.IllegalArgumentException: Line with number 65 doesn't belong to file app/js/constants.js

我拥有的几乎每个 js 文件都以此类推。

如果我生成一个 html 覆盖率报告,那么报告看起来很好,因此报告似乎正在正确生成。

我想知道这是否是由我使用的 karma-browserify 步骤引起的。

有人可以帮助我的 lcov 报告错误吗?

有没有人设法使用 karma 和 browserify 获得 lcov 覆盖率报告?

【问题讨论】:

你觉得SonarQube端有问题吗?你得到的错误对我来说似乎很清楚。撇开 SonarQube 不谈,我认为问题在于了解如何获得包含无效行号的报告。 我也有这个。使用 Sonar 5.3 时工作正常,现在升级到 Sonar 5.6 时我得到了这个。 同样的问题,你用的是 ES6 吗? 你找到解决这个问题的方法了吗? 【参考方案1】:

我想我找到了解决方案。我尚未对其进行测试,但阅读文档表明这是正确的方法。

首先,问题不在于声纳,而在于业力。您的覆盖率报告是针对已处理的打字稿文件构建的,因此存在线路问题。

查看有关 karma-coverage-istanbul-reporter npm 包描述的文档(粗体来自我):

这只是一个报告器,不会对您的代码进行实际检测。 Babel 用户应该使用 istanbul babel 插件来检测你的代码,webpack + typescript 用户应该使用 istanbul-instrumenter-loader 然后使用这个 karma 报告器来做实际的报告。有关如何组合它们的 e2e 示例,请参阅测试配置。

Angular 或多或少是 webpack + typescript。

这里建议使用相同的解决方案,以使用 istanbul 仪器加载程序:https://www.linkedin.com/pulse/typescript-20-how-get-correct-test-coverage-line-numbers-willem-liu

我建议我们应该重新配置我们的 karma 配置以生成正确的 lcov.info 文件并查看结果。

【讨论】:

以上是关于Karma 为具有无效行号的 Angular 项目生成 lcov 报告的主要内容,如果未能解决你的问题,请参考以下文章

PhantomJS 不适用于 Angular2 项目中的 Karma

Angular - Jasmine/karma - 订阅 lambda 表达式未执行

有没有办法批量处理 Karma - Angular 单元测试?

如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例

使用 karma 和 jamis 进行 Angular 单元测试

在 Angular 8 (Karma 4.1.0) 升级后,在 Angular 7 (Karma 2.0.4) 中成功完成的 Karma 测试失败