dan*_*oux 5 testing code-coverage ruby-on-rails ruby-on-rails-3
我正在尝试设置 SimpleCov 为 3 个应用程序生成报告,这些应用程序从本地 gem 共享大部分代码(模型、控制器),但每个应用程序使用的代码的规范位于每个 ./spec 内,而不是在 gem 本身上。
举个更清楚的例子。当我在 app_1 中运行使用来自本地 gem 的共享模型的 bundle exec rspec spec 时,我想获得此 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
Run Code Online (Sandbox Code Playgroud)
这是有效的,直到一些问题开始出现。
为什么我在 gem 内部的模型获得 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/"
Run Code Online (Sandbox Code Playgroud)
然后我移动到 app_2 文件夹并开始设置 SimpleCov 并看看我会在这里得到什么结果。结果他们变得更奇怪了。
对于同一模型,我获得了 100% 的覆盖率,我对 my_model_spec.rb 文件进行了相同的清空测试,但仍然获得了 100% 的覆盖率。所以这真的很糟糕,或者我不明白一些事情。
这是如何工作的?(使用你所说的 Ruby 1.9 Coverage 模块,当我在本地运行官方文档上的示例时,我得到不同的结果,所以我认为那里存在错误或过时的文档)
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]}
Run Code Online (Sandbox Code Playgroud)
我希望报告不会显示在应用程序代码中某处评估的行的积极结果,无论在哪里。
我认为预期的行为是模型的结果与其规格相关,控制器的结果也是如此。
是这样吗?如果是这样,为什么我会得到这个奇怪的结果。
或者您认为我的应用程序的结构可能会与 SimpleCov 和 Coverage 混淆吗?
感谢您花时间阅读本文,如果您需要更多详细信息,请询问。
关于您对模型 100% 覆盖的困惑,因为我不确定我是否理解正确:Coverage(因此 SimpleCov)无法知道您的代码是从规范还是“其他地方”执行的。假设我有一个方法“foo”和一个调用 foo 的方法“bar”。如果我在规范中调用 bar,当然 foo 也会显示为被覆盖。
至于你的普遍问题:我认为应该可以报告报道情况。仅仅因为源代码与项目根目录处于不同的位置,不应导致覆盖率报告丢失。
基本配置中有两件事:删除基本适配器(第 2 行)是不必要的,因为适配器基本上是美化的配置块,此时您将已经执行它(因为加载 Simplecov 时会调用它)。重置过滤器就足够了。
此外,您定义的自定义适配器也不会被使用。请参阅自述文件了解如何正确设置适配器,但我认为当您现在开始覆盖运行时,只需在 SimpleCov 配置块中使用它就可以了:
SimpleCov.start 'rails' do
your_custom_config
end
Run Code Online (Sandbox Code Playgroud)
不过,您可能想要的是所有应用程序的合并覆盖率报告。为此,您必须首先在配置块内为每个规范套件定义一个 command_name,如下所示:command_name 'App1 Specs'。
您还必须定义一个central coverage_path,它将存储您的应用程序套件中的覆盖率报告。假设你有~/projects/my_project/app[1-3],那么将其放入my_project/coverage可能有意义。这将导致您的不同测试套件结果合并到一份报告中,就像将 SimpleCov 与 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
Run Code Online (Sandbox Code Playgroud)
接下来,您可能想要添加过滤器以按路径拒绝所有非项目 gem,并且您应该启动并运行。
| 归档时间: |
|
| 查看次数: |
2003 次 |
| 最近记录: |