SimpleCov有多个应用程序 – 或者简而言之,Simplecov如何工作?

我正在尝试设置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块上添加一个filter,如:

 add_filter "/app_2_name_space/" 

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

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

这是如何工作的?( 使用Ruby 1.9 Coverage模块 ,当我在本地运行官方文档中的示例时,我得到不同的结果,所以我认为那里有一个bug或过时的文档)

 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?

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

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

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

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

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

接下来你可能想要添加filter以按路径拒绝所有非项目gem,你应该启动并运行。