Возможно, вы захотите прочитать раздел о метаданных 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 предоставляют возможность изменить способ отображения результатов теста, даже возможно создать собственный форматтер, но это более сложная тема.