2012-02-29 31 views
4

我试图设置SimpleCov为3个应用程序生成报告,这些应用程序从当地gem共享大部分代码(模型,控制器),但每个应用程序使用的代码的规格都在每个./spec内部,而不是宝石本身。SimpleCov有多个应用程序 - 或者简而言之,Simplecov是如何工作的?

更清晰的例子。当我在app_1中运行bundle exec rspec spec时,它使用本地gem中的共享模型,我希望获得(准确)报告,了解此app_1在里面./spec中的所有规范。

本地gem在命名空间内也有一些属于app_2的模型,所以当我在app_1中运行测试套件时,我想跳过这些文件的报告。

我试图用app_1/spec/spec_helper中的以下代码来实现此目的。

# This couple of lines are needed to generate report for the models, etc. inside the local gem. 
SimpleCov.adapters.delete(:root_filter) 
SimpleCov.filters.clear 

SimpleCov.adapters.define 'my_filter' do 
    root = SimpleCov.root.split("/") 
    root.pop 
    add_filter do |src| 
    !(src.filename =~ /^#{root.join("/")}/) 
    end 

    add_filter "/app_2_namespace/" 
end 

if ENV["COVERAGE"] == "true" 
    SimpleCov.start 'rails' 
end 

这有效,直到有些问题开始出现。

为什么我对宝石内的模型有85%的覆盖率,但规格在app_2内(我正在运行app_1内的规格)。

第一次是一个问题,当我试图改善模型,所以我点击报告,看到哪些行被发现,我试图解决它们在app_2/spec/namespace上编写测试/my_model_spec.rb。

但是这并没有什么区别,我尝试了一个更积极的测试,我删除了spec文件中的所有内容,但不知何故,我仍然获得了85%的覆盖率,所以my_model_spec.rb与my_model.rb的覆盖率结果。有点意外。

但由于该文件是在APP_2我决定SimpleCov.start块上添加过滤器上APP_1 spec_helper,如:

add_filter "/app_2_name_space/" 

然后我移动到文件夹APP_2,并开始建立SimpleCov看看我会得到什么结果。他们变成了怪异的。

对于同一个模型,我得到了100%的覆盖率,我做了空白my_model_spec.rb文件的同样的测试,仍然得到了100%。所以这真的会发生,或者我不明白。

如何工作的呢?(with the Ruby 1.9 Coverage module你说,好吧,当我在本地运行的官方文档我得到不同的结果的例子,所以我觉得有一个错误或过时的文档存在)

ruby-doc: {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]} 
locally: {"foo.rb"=>[1, 1, 10, nil, nil, 1, 0, nil, 1, nil]} 

希望对于在应用程序代码某处进行评估的行,报告不会显示正面结果,而不管在哪里。

我认为预期的行为是,例如模型的结果都与这对控制器的规格,同样的事情,等

是这种情况?如果是这样,为什么我得到这个奇怪的结果。

或者你认为我的应用程序的结构可能会搞乱SimpleCov和Coverage吗?

感谢您花时间阅读本文,如果您需要更详细的信息,只需询问。

+0

有问题从@TheDeadSerious回答了你的问题? – 2012-03-12 21:22:50

回答

2

关于您对模型100%覆盖的困惑,因为我不确定自己的理解是否正确:Coverage(因此SimpleCov)无法知道您的代码是从规范中执行还是“在某处其他”。假设我有一个方法“foo”和一个调用foo的方法“bar”。如果我在我的规格中调用bar,当然foo也会显示为覆盖。

至于您的一般问题:我认为应该有可能报道的覆盖面。只是因为源代码与您的项目根目录不同,不应导致覆盖率报告的丢失。

基本配置中的两件事:删除基本适配器(第2行)是不必要的,因为适配器基本上是荣耀的配置块,此时您已经执行了它(因为它在Simplecov加载时被调用)。重置过滤器应该足够了。

此外,您定义的自定义适配器未使用。请参阅README对于如何正确设置适配器,但我认为你会是罚款只是在SimpleCov配置块使用此当您启动运行覆盖现在:

SimpleCov.start 'rails' do 
    your_custom_config 
end 

什么你”您可能希望虽然是所有应用程序的合并覆盖率报告。为此,您必须首先在您的配置块内为每个规范套件定义一个command_name,如下所示:command_name 'App1 Specs'

您还必须定义一个中心coverage_path,它将在您的应用程序套件中存储覆盖率报告。假设你有~/projects/my_project/app[1-3],那么把它写入my_project/coverage可能是有道理的。这将导致您将不同的测试套件结果合并为一个报告,就像使用SimpleCov和Cupec & RSpec一样。合并的默认超时时间约为10分钟,因此您可能需要在配置中使用merge_timeout 3600将其设置为较高的值(那些是秒)。有关这些配置选项的具体信息,请再次查阅README和SimpleCov :: Configuration文档。这些东西在那里详细列出。

所以,概括起来讲,每个应用应该看起来有点像这样:

require 'SimpleCov' 
SimpleCov.start 'rails' do 
    reset_filters! 
    command_name 'App1 Spec' 
    coverage_path File.dirname(__FILE__) + '../../coverage' # Assuming this is in my_project/app1/spec/spec_helper.rb 
    merge_timeout 3600 
end 

接下来的事情你可能想加入滤光片来拒绝通过路径的所有非项目宝石,你应该运行&。

+0

很抱歉,对于迟到的答案。 您提出的解决方案听起来不错,我现在正在尝试它,让我们看看我得到了什么。 和我做在问题的错误,我的过滤器使用这样 SimpleCov.start“轨道”做 load_adapter“my_filter” 结束 – danroux 2012-03-14 15:37:09

相关问题