Учебники

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 Filters. Измените приведенный выше код на это —

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

Ожидаемое ожидание (1 + 1). Уравнение (1) должно потерпеть неудачу. Сохраните свои изменения и повторно запустите вышеупомянутые команды —

rspec — отформатируйте прогресс 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 formatter, запустим эту команду —

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 при выполнении некоторых тестов, тест обычно вызывает метод hope () хотя бы один раз.

Форматеры RSpec предоставляют возможность изменить способ отображения результатов теста, даже возможно создать собственный форматтер, но это более сложная тема.