【问题标题】:CodeClimate coverage analysis is wrong on Travis CITravis CI 上的 CodeClimate 覆盖率分析错误
【发布时间】:2015-04-16 14:53:47
【问题描述】:

我在我的新项目中遇到了 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

Full project source code

我尝试过的

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

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

【问题讨论】:

    标签: ruby travis-ci code-climate


    【解决方案1】:

    我向 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,那么我们的排除将不会生效。在大多数情况下,您赢了'不希望包含这些目录,因为它们不代表您编写的代码。

    为了纠正这个问题,我继续分叉您的存储库,然后将我的分叉添加到 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 更改来纠正这个问题。当然,如果还有什么我可以帮忙的,请告诉我。再次为这里的混乱感到抱歉。

    谢谢,

    -乔纳森

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2015-01-13
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多