testing - SonarQube 不显示 Ruby on Rails 项目的测试代码覆盖率
问题描述
我有一个 Ruby on Rails 项目,我想在 SonarQube 中显示测试覆盖率。该项目是使用 Jenkins 构建的,它将结果发送到 SonarQube。单元测试使用 rspec 运行,代码覆盖率使用 SimpleCov 计算。SonarQube 要求以 json 格式生成代码覆盖率报告,因此我在以下代码中使用了simplecov-jsonrails_helper.rb
:
if Rails.env.development? || Rails.env.test?
require 'simplecov'
require 'simplecov-json'
SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter
SimpleCov.start
end
代码覆盖率报告成功生成并保存到这样的coverage
文件夹中(来自 Jenkins 控制台输出):
Coverage report generated for RSpec to /my-project/coverage/coverage.json. 2000 / 2000 LOC (100.0%) covered.
我sonar-project.properties
这样配置(阅读覆盖率报告):
sonar.sources=.
sonar.exclusions=**/*_test.go,**/vendor/**,**/coverage/**
sonar.tests=.
sonar.test.inclusions=**/*_spec.rb
sonar.test.exclusions=**/vendor/**
sonar.ruby.coverage.reportPaths=coverage/coverage.json
sonar.ruby.coverage.framework=RSpec
Jenkins 构建项目,运行测试,生成覆盖率报告,将结果发送到 SonarQube。但由于某种原因,SonarQube 总是显示 0% 的覆盖率。
运行sonar-scanner -X
(调试模式)显示此错误(Jenkins 控制台日志):
15:52:30.458 ERROR: Cannot read coverage report file, expecting standard SimpleCov resultset JSON format: 'coverage/coverage.json'
java.lang.ClassCastException: java.lang.String cannot be cast to org.sonarsource.analyzer.commons.internal.json.simple.JSONObject
at org.sonarsource.ruby.plugin.SimpleCovSensor.mergeFileCoverages(SimpleCovSensor.java:112)
at org.sonarsource.ruby.plugin.SimpleCovSensor.execute(SimpleCovSensor.java:71)
at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:45)
看起来 SonarQube 在阅读 json 覆盖率报告时遇到了问题——它的格式不符合预期。
解决方案
Sonar 的 SimpleCov 支持需要.resultset.json
文件,而不是 JSON 格式化程序的输出。您需要将配置指向结果集:
sonar.ruby.coverage.reportPaths=coverage/.resultset.json
推荐阅读
- javascript - 如何在使用 d3 构建的条形图中控制条形起点和轴之间的空间?
- continuous-integration - 我应该使用批准测试作为 CI 测试运行的一部分吗?
- excel - 另存为启用宏的工作簿
- sql - 以 oracle apex 形式创建动态 where 子句
- python-3.x - 数据框Python3中的循环列
- python - ValueError 递归但不是在开始时:
- mql4 - 如何更正我的代码以使我的 Expect Advisor 能够进行交易?
- c# - 发生某事时如何启用和禁用对象
- python - 根据列表对 Pandas 数据帧特征进行一次热编码
- git - 如何解决 Github 中重命名文件的合并冲突