加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 具有多个应用程序的SimpleCov – 或者简而言之

发布时间:2020-12-17 02:12:54 所属栏目:百科 来源:网络整理
导读:我正在尝试设置SimpleCov来为3个应用程序生成报告,这些应用程序从本地gem共享大部分代码(模型,控制器),但每个应用程序使用的代码的规范都在每个./spec内,而不是在gem本身. 更清楚的例子.当我在app_1中运行bundle exec rspec spec时,使用本地gem中的共享模型,
我正在尝试设置SimpleCov来为3个应用程序生成报告,这些应用程序从本地gem共享大部分代码(模型,控制器),但每个应用程序使用的代码的规范都在每个./spec内,而不是在gem本身.

更清楚的例子.当我在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上为它们编写测试.

但这没有任何区别,我尝试了一个更激进的测试,我删除了规范文件中的所有内容,但不知何故,我仍然得到85%的覆盖率,所以my_model_spec.rb与覆盖率结果无关my_model.rb.有点出乎意料.

但由于此文件位于app_2,我决定在app_1 spec_helper上的SimpleCov.start块上添加一个过滤器,如:

add_filter "/app_2_name_space/"

然后我移动到app_2文件夹并开始设置SimpleCov,看看我会得到什么结果.结果他们变得怪异了.

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

这是怎么回事?(with the Ruby 1.9 Coverage module你说,当我在本地运行官方文档的例子我得到不同的结果,所以我认为那里有一个bug或过时的文档)

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

我希望报告不会显示在应用程序代码的某处进行评估的行的正面结果,无论在何处.

我认为预期的行为是模型的结果与其规格有关,对于控制器也是如此.

是这样的吗?如果是这样,为什么我会得到这个奇怪的结果.

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

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

解决方法

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

至于你的一般问题:我认为应该可以报告覆盖范围.仅仅因为源代码与项目根目录不同,不应导致覆盖率报告的丢失.

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

此外,不使用您定义的自定义适配器.有关如何正确设置适配器的信息,请参阅自述文件,但我认为你现在开始覆盖运行时只需在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 with Cucumber&例如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

接下来你可能想要添加过滤器以按路径拒绝所有非项目宝石,你应该起来&运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读