CodeTraimate覆盖率分析在Travis CI上是错误的

时间:2015-04-16 14:53:48

标签: ruby travis-ci code-climate

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

我尝试了什么

我已经确认代码完全相同,并且这些结果对于每个测试的红宝石都是相同的(本地和Travis CI,> = 1.9.3 MRI)。我尝试将其限制为Travis的一个ruby版本,但结果是一样的。我已经尝试过搜索类似的问题,但到目前为止,我只在他们的回购中发现了一个开放/未回复的GitHub问题。

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

1 个答案:

答案 0 :(得分: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运行您的构建和POST代码气候覆盖数据时如何排除这些目录。

     

为了解决这个问题,我首先在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

     

My Travis build发布了您的Code Climate实例覆盖率数据,因此您现在也可以100%覆盖:https://codeclimate.com/github/leesharma/rescuetime

     

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

     

您应该能够进行上面提到的spec_helper.rb更改以更正此问题。当然,如果还有其他任何我可以提供的帮助,请告诉我。对不起再次抱歉。

     

谢谢,

     

-Jonathan