首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个应用程序的SimpleCov -或者简而言之,Simplecov是如何工作的?

使用多个应用程序的SimpleCov -或者简而言之,Simplecov是如何工作的?
EN

Stack Overflow用户
提问于 2012-02-29 23:11:50
回答 1查看 1.7K关注 0票数 5

我正在尝试设置SimpleCov为3个应用程序生成报告,这些应用程序共享本地gem中的大部分代码(模型、控制器),但每个应用程序使用的代码的规范都在每个./spec中,而不是在gem本身上。

获取更清晰的示例。当我在使用来自本地gem的共享模型的app_1中运行bundle exec rspec spec时,我希望获得(准确的)此app_1包含的所有规范的报告。/spec。

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

我试图通过app_1/spec/spec_helper中的以下代码来实现这一点。

代码语言:javascript
复制
# 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

这是可行的,直到一些问题开始出现。

为什么我在gem中的模型得到了85%的覆盖率,但是规范在app_2中(我在app_1中运行规范)。

第一次这是一个问题,当我试图改进这个模型时,我点击了它的报告,查看哪些行被发现,并试图修复它们在app_2/spec/namespace/my_ model _spec.rb上为它们编写测试。

但这并没有什么不同,我尝试了一个更激进的测试,我删除了spec文件上的所有内容,但不知何故我仍然获得了85%的覆盖率,所以my_model_spec.rb与my_model.rb的覆盖率结果无关。有点出乎意料。

但是因为这个文件在app_2上,所以我决定在app_1 spec_helper上的SimpleCov.start块上添加一个过滤器,如下所示:

代码语言:javascript
复制
add_filter "/app_2_name_space/"

然后我移动到app_2文件夹,并开始设置SimpleCov,看看我会在这里得到什么结果。结果他们变得更加怪异。

对于相同的模型,我得到了100%的覆盖率,我做了同样的测试,清空my_model_spec.rb文件,仍然得到了100%。所以这真的搞错了,或者我不明白什么。

这是如何工作的?(with the Ruby 1.9 Coverage module你会说,当我在本地运行官方文档上的示例时,我得到了不同的结果,所以我认为那里有一个bug或过时的文档)

代码语言:javascript
复制
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和覆盖范围?

感谢您抽出时间阅读这篇文章,如果您需要更详细的信息,请尽管问。

EN

回答 1

Stack Overflow用户

发布于 2012-03-08 01:08:44

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

至于你的一般问题:我认为应该可以报告覆盖范围。仅仅因为源代码与您的项目根在某个不同的点上,就不应该导致覆盖报告的丢失。

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

此外,不使用您定义的自定义适配器。有关如何正确设置适配器的信息,请参阅自述文件,但我认为,当您现在开始运行覆盖范围时,只需在SimpleCov配置块中使用以下代码就可以了:

代码语言:javascript
复制
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和Cucumber & RSpec一样。合并的默认超时时间约为10分钟,因此您可能需要在配置中使用merge_timeout 3600将其设置为更高的值(这些值是秒)。有关这些配置选项的详细信息,请再次查看自述文件和SimpleCov::Configuration文档。这些东西在那里有相当详细的概述。

因此,总而言之,您的每个应用程序应该看起来如下所示:

代码语言:javascript
复制
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

接下来,您可能想要添加过滤器来按路径拒绝所有非项目gem,并且您应该启动并运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9501607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档