2

我在我的新项目中遇到了 codeclimate-test-reporter 和 Travis CI 的问题。Travis CI 的覆盖率分析与本地的完全不同。具体来说,本地的 LOC 是 56(这是准确的),但是当我在 Travis CI 上构建项目时,它被列为 10,333。

代码和输出

本地输出(56 / 56 LOC)

Finished in 0.0749 seconds (files took 0.60563 seconds to load)
7 examples, 0 failures

Coverage report generated for RSpec to /Users/lee/GitHub/rescuetime/coverage. 
56 / 56 LOC (100.0%) covered.
Coverage = 100.0%. Sending report to https://codeclimate.com for branch 
data-analytics-api... done.

Travis CI 输出(4954 / 10333 LOC?!)

Coverage report generated for RSpec to /home/travis/build/leesharma/rescuetime/coverage. 
4954 / 10333 LOC (47.94%) covered.
Coverage = 47.94%. Sending report to https://codeclimate.com for branch 
data-analytics-api... done.

spec_helper.rb(与 codeclimate-test-reporter 相关的位)

require 'codeclimate-test-reporter'
require 'simplecov'
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
    SimpleCov::Formatter::HTMLFormatter,
    CodeClimate::TestReporter::Formatter
]
SimpleCov.start
...

VCR.configure do |config|
  ...
  config.ignore_hosts 'codeclimate.com'
end

完整的项目源代码

我试过的

我已经确认代码完全相同,并且这些结果对于每个测试的 ruby​​ 都是相同的(在本地和 Travis CI 上,>=1.9.3 MRI)。我尝试将其限制为仅适用于 Travis 的一个 ruby​​ 版本,但结果是相同的。我试过搜索类似的问题,但到目前为止,我只在他们的 repo 上发现了一个未解决的 GitHub 问题。

老实说,我什至不确定接下来要尝试什么来调试它,因为我无法在本地重现它。知道接下来要尝试什么吗?

4

1 回答 1

4

我向 CodeClimate 发送了一封电子邮件,他们回复了非常有用的回复!

tl;博士

我调用的是 SimpleCov.start 而不是 CodeClimate::TestReporter.start,这意味着我的 /vendor 和 /spec 目录被包含在分析中。

我需要将spec_helper.rb的测试覆盖率报告部分替换为:

# Test coverage reporters
require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
    SimpleCov::Formatter::HTMLFormatter,
    CodeClimate::TestReporter::Formatter
]

实际反应

嘿李-

感谢您提供详细的电子邮件。我做了一些挖掘,我相信我看到了这里发生的事情。这归结为在不同的测试环境中应用了不同的排除项。从广义上讲,您在 Travis 中看到如此高的 LOC 的原因是因为 /vendor 和 /spec 文件夹中文件的覆盖率数据包含在 LOC 计数中。我在下面解释了如何在 Travis 运行您的构建和发布代码气候覆盖数据时排除这些目录。

为了对此进行调查,我首先查看了您在 GitHub 中的 spec_helper.rb 文件,我注意到有一点与 Code Climate 通常需要的不同。具体来说,我看到调用的是 SimpleCov.start 而不是 CodeClimate::TestReporter.start。这可能会导致许多不同的问题,其中之一是我们通常应用的文件排除没有被触发。也就是说,通常我们的报告器会自动排除所有 /vendor 和 /spec 目录中的覆盖数据——但是,如果您不调用 CodeClimate::TestReporter.start,那么我们的排除将不会生效。在大多数情况下,您赢了'不希望包含这些目录,因为它们不代表您编写的代码。

为了纠正这个问题,我继续 fork 你的存储库,然后将我的 fork 添加到 Travis。然后我对项目的 spec_helper.rb 文件进行了一些更改,如下所示:https ://github.com/jonathancadepowers/rescuetime/blob/master/spec/spec_helper.rb请注意,我正在启动 Code Climate 记者(在第 3 行)并且我不再直接启动 SimpleCov。由于 Code Climate 的 Ruby 测试报告器实际上只是 SimpleCov 的一个薄包装器,因此您无需直接启动 SimpleCov(每次运行测试时仍应生成来自 SimpleCov 的 HTML 报告)。

进行更改后,我在 Travis 中运行了一个构建。由于您的 .travis.yml 列出了四个不同版本的 Ruby,这导致了四个单独的构建作业。对于所有这些,行数下降到 30 行(因为现在我们的排除被触发),您现在拥有 100% 的覆盖率。请参阅此处的第 152 行:https ://travis-ci.org/jonathancadepowers/rescuetime/jobs/59266389#L152

我的 Travis 构建发布了您的 Code Climate 实例覆盖率数据,因此您现在也拥有 100% 的覆盖率:https ://codeclimate.com/github/leesharma/rescuetime

当然,56 不等于 30。也就是说,我想我也明白为什么会这样了。我从早期的有效负载中注意到 Travis 已为您的项目发送给我们,其中不仅 /vendor 文件包含在覆盖有效负载中,还包括 /spec 文件夹中文件的覆盖数据。深入挖掘,我发现包含两个特定的 /spec 文件:spec/unit/activities_spec.rb(共 11 行)和 spec/unit/client_spec.rb(共 15 行)。所以:56 - 11 - 15 = 30。也就是说,我敢打赌,当您运行测试时,本地 /vendor 会被排除在外,但 /spec 不会。如果您进行我上面推荐的 spec_helper.rb 更改,/vendor 和 /spec 都将被过滤掉,将您降至 30。因此,30 可能是正确的数字,而不是 56。

您应该能够进行我上面提到的 spec_helper.rb 更改以纠正此问题。当然,如果还有什么我可以帮忙的,请告诉我。再次为这里的混乱感到抱歉。

谢谢,

-乔纳森

于 2015-04-20T23:36:13.767 回答