过滤
RSpec 支持通过多种方式过滤示例和示例组,允许您运行当前感兴趣的测试套件的子集。
按标签过滤
示例和组可以通过匹配命令行或选项文件上声明的标签,或通过 RSpec.configure
声明的过滤器进行过滤,并将哈希键/值提交到示例组和/或示例声明中。例如,给定以下声明
RSpec.describe Thing, :awesome => true do
it "does something" do
# ...
end
end
该组(或任何其他具有 :awesome => true
的组)将通过以下任何命令进行过滤
rspec --tag awesome:true
rspec --tag awesome
rspec -t awesome:true
rspec -t awesome
在标签名前添加 ~
会否定标签,从而通过以下任何命令排除该组
rspec --tag ~awesome:true
rspec --tag ~awesome
rspec -t ~awesome:true
rspec -t ~awesome
按示例描述过滤
RSpec 提供了 --example
(简写形式:-e
)选项,允许您通过示例或组的描述来选择它们。所有加载的示例,其完整描述(基于示例的描述及其所有祖先组的描述计算得出)包含提供的参数,都将被执行。
rspec --example "Homepage when logged in"
rspec -e "Homepage when logged in"
您可以多次指定此选项以选择多个示例集
rspec -e "Homepage when logged in" -e "User"
请注意,RSpec 会在这些情况下加载所有规格文件,这可能会产生相当大的启动成本(尤其是对于 Rails 应用程序)。如果您知道目标示例位于特定文件,您也可以传递文件或目录名称,以便 RSpec 只加载这些规格文件,从而加快速度
rspec spec/homepage_spec.rb -e "Homepage when logged in"
rspec -e "Homepage when logged in" spec/homepage_spec.rb
还要注意,没有描述的示例(在使用单行语法时通常会生成描述)无法直接使用此选项进行过滤,因为需要执行示例才能生成描述,因此 RSpec 无法使用尚未生成的描述来决定是否执行示例。当然,您可以传递组描述的一部分来选择组中定义的所有示例(包括那些没有描述的示例)。
按示例位置过滤
可以通过传递定义示例和组的文件和行号(用冒号分隔)来从命令行选择示例和组
rspec spec/homepage_spec.rb:14 spec/widgets_spec.rb:40 spec/users_spec.rb
此命令将运行在 spec/homepage_spec.rb
的第 14 行定义的示例或组,在 spec/widgets_spec.rb
的第 40 行定义的示例或组,以及在 spec/users_spec.rb
中定义的所有示例和组。
如果在指定行没有定义示例或组,RSpec 将运行该行之前定义的最后一个示例或组。
聚焦
RSpec 支持配置选项,可以轻松地通过暂时调整示例来选择它们。在您的 spec_helper.rb
(或类似文件)中,添加以下配置
RSpec.configure do |config|
config.filter_run_when_matching :focus
end
此配置由 rspec --init
在推荐的注释部分生成。有了它,您可以使用 :focus
元数据标记任何示例组或示例来选择它
it "does something" do
# becomes...
it "does something", :focus do
RSpec 还附带了常用示例组定义方法(describe
、context
)和示例方法(it
、specify
、example
)的别名,这些别名带有前缀 f
,并自动包含 :focus => true
元数据,允许您轻松地将 it
更改为 fit
(想想“focused it”)、将 describe
更改为 fdescribe
等,以便临时聚焦它们。
选项文件和命令行覆盖
命令行选项声明可以存储在 .rspec
、~/.rspec
、$XDG_CONFIG_HOME/rspec/options
或自定义选项文件中。这对于存储默认值很有用。例如,假设您有一些您想要大多数时候都抑制的慢速规格。您可以像这样标记它们
RSpec.describe Something, :slow => true do
然后将它存储在 .rspec
中
--tag ~slow:true
现在,当您运行 rspec
时,该组将被排除。
覆盖
当然,您可能希望有时运行它们,因此您可以像这样在命令行上覆盖此标签
rspec --tag slow:true
优先级
位置和描述过滤器比标签过滤器具有更高的优先级,因为它们表达了用户运行特定示例的愿望。因此,如果您使用上面的配置,您可以在命令行上指定一个位置或描述来运行一个示例或示例组,该示例或示例组通常由于 :slow
标签而被排除。
RSpec.configure
您还可以使用 RSpec.configure
存储默认标签。我们在命令行(以及在 .rspec
等选项文件中)使用 tag
,但出于历史原因,我们在 RSpec.configure
中使用术语 filter
RSpec.configure do |c|
c.filter_run_including :foo => :bar
c.filter_run_excluding :foo => :bar
end
这些声明也可以从命令行覆盖。
静默过滤器公告
默认情况下,RSpec 会在您的规格运行之前打印一条消息,指示配置了哪些过滤器,例如,如果您设置了 config.filter_run_including :focus => true
,它可能会打印“运行选项:include :focus=>true”。
如果您希望阻止这些消息出现在您的规格输出中,您可以将 silence_filter_announcements
配置设置设置为 true
,如下所示
RSpec.configure do |c|
c.filter_run_including :foo => :bar
c.silence_filter_announcements = true
end