RSpec – 过滤

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

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

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

现在,让我们试试 doc 格式化程序,运行这个命令 –

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 Formatters 在运行某些测试时如何工作,该测试通常至少调用一次 expect() 方法。

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁