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