RSpec - 过滤


在阅读本节之前,您可能需要阅读有关 RSpec 元数据的部分,因为事实证明,RSpec 过滤是基于 RSpec 元数据的。

想象一下,您有一个规范文件,它包含两种类型的测试(示例):正面功能测试和负面(错误)测试。让我们这样定义它们 -

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations' do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected' do
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

现在,将上述文本保存为名为“filter_spec.rb”的文件,然后使用以下命令运行它 -

rspec filter_spec.rb

您将看到类似这样的输出 -

.. 
Finished in 0.003 seconds (files took 0.11201 seconds to load) 
2 examples, 0 failures

现在,如果我们只想重新运行此文件中的阳性测试怎么办?还是只有阴性测试?我们可以使用 RSpec 过滤器轻松做到这一点。将上面的代码更改为:

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations', positive: true do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected', negative: true do 
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

保存对 filter_spec.rb 的更改并运行这个略有不同的命令 -

rspec --tag positive filter_spec.rb

现在,您将看到如下所示的输出 -

Run options: include {:positive=>true} 
. 
Finished in 0.001 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

通过指定 --tag Positive,我们告诉 RSpec 仅运行定义了 Positive 元数据变量的示例。我们可以通过运行这样的命令来对负面测试做同样的事情 -

rspec --tag negative filter_spec.rb

请记住,这些只是示例,您可以使用任何您想要的名称指定过滤器。

RSpec 格式化程序

格式化程序允许 RSpec 以不同的方式显示测试的输出。让我们创建一个包含此代码的新 RSpec 文件 -

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(2) 
      end
      
   end 
end

现在,将其保存到名为 formatter_spec.rb 的文件并运行此 RSpec 命令 -

rspec formatter_spec.rb

您应该看到如下所示的输出 -

. 
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

现在运行相同的命令,但这次指定一个格式化程序,如下所示 -

rspec --format progress formatter_spec.rb

这次你应该看到相同的输出 -

. 
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

原因是“progress”格式化程序是默认格式化程序。接下来让我们尝试不同的格式化程序,尝试运行此命令 -

rspec --format doc formatter_spec.rb

现在你应该看到这个输出 -

A spec file to demonstrate how RSpec Formatters work 
   when running some tests 
      the test usually calls the expect() method at least once
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

正如您所看到的,“doc”格式化程序的输出完全不同。该格式化程序以类似文档的风格呈现输出。您可能想知道当测试失败时这些选项是什么样的(示例)。让我们将formatter_spec.rb中的代码更改为如下所示 -

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(1) 
      end
      
   end 
end

期望expect(1 + 1).to eq(1)应该失败。保存您的更改并重新运行上述命令 -

rspec --format Progress formatter_spec.rb并记住,由于“progress”格式化程序是默认的,因此您可以运行:rspec formatter_spec.rb。你应该看到这个输出 -

F 
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some tests 
the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
      expected: 1
         got: 2
			  
      (compared using ==)			  
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'

Finished in 0.016 seconds (files took 0.11201 seconds to load)
1 example, 1 failure
Failed examples:

rspec ./formatter_spec.rb:3 # A spec file to demonstrate how RSpec 
   Formatters work when running some tests the test usually calls 
   the expect() method at least once

现在,让我们尝试一下文档格式化程序,运行以下命令 -

rspec --format doc formatter_spec.rb

现在,由于测试失败,您应该看到以下输出 -

A spec file to demonstrate how RSpec Formatters work
   when running some tests
      the test usually calls the expect() method at least once (FAILED - 1)
		
Failures:

1) A spec file to demonstrate how RSpec Formatters work when running some
   tests the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
   expected: 1
        got: 2
		  
   (compared using ==)
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'
	
Finished in 0.015 seconds (files took 0.11401 seconds to load) 
1 example, 1 failure

失败的例子

rspec ./formatter_spec.rb:3 # 一个规范文件,用于演示 RSpec 格式化程序在运行某些测试时如何工作,测试通常至少调用一次 Expect() 方法。

RSpec 格式化程序提供了更改测试结果显示方式的能力,甚至可以创建您自己的自定义格式化程序,但这是一个更高级的主题。