RSpec - Написание спецификаций
В этой главе мы создадим новый класс Ruby, сохраним его в отдельном файле и создадим отдельный файл спецификации для тестирования этого класса.
Во-первых, в нашем новом классе он называется StringAnalyzer. Это простой класс, который, как вы уже догадались, анализирует строки. У нашего класса всего один методhas_vowels?который, как следует из названия, возвращает true, если строка содержит гласные, и false, если нет. Вот реализация дляStringAnalyzer -
class StringAnalyzer
def has_vowels?(str)
!!(str =~ /[aeio]+/i)
end
end
Если вы следили за разделом HelloWorld, вы создали папку под названием C: \ rspec_tutorial \ spec.
Удалите файл hello_world.rb, если он у вас есть, и сохраните приведенный выше код StringAnalyzer в файл с именем string_analyzer.rb в папке C: \ rspec_tutorial \ spec.
Вот источник нашего файла спецификации для тестирования StringAnalyzer -
require 'string_analyzer'
describe StringAnalyzer do
context "With valid input" do
it "should detect when a string contains vowels" do
sa = StringAnalyzer.new
test_string = 'uuu'
expect(sa.has_vowels? test_string).to be true
end
it "should detect when a string doesn't contain vowels" do
sa = StringAnalyzer.new
test_string = 'bcdfg'
expect(sa.has_vowels? test_string).to be false
end
end
end
Сохраните его в том же каталоге spec, присвоив ему имя string_analyzer_test.rb.
В окне cmd.exe перейдите в папку C: \ rspec_tutorial и выполните эту команду: dir spec
Вы должны увидеть следующее -
Каталог C: \ rspec_tutorial \ spec
09/13/2015 08:22 AM <DIR> .
09/13/2015 08:22 AM <DIR> ..
09/12/2015 11:44 PM 81 string_analyzer.rb
09/12/2015 11:46 PM 451 string_analyzer_test.rb
Теперь мы собираемся запустить наши тесты, запустим эту команду: rspec spec
Когда вы передаете имя папки в rspec, он запускает все файлы спецификаций внутри папки. Вы должны увидеть этот результат -
No examples found.
Finished in 0 seconds (files took 0.068 seconds to load)
0 examples, 0 failures
Причина этого в том, что по умолчанию rspecзапускает только файлы, имена которых заканчиваются на «_spec.rb». Переименуйте string_analyzer_test.rb в string_analyzer_spec.rb. Вы можете легко сделать это, выполнив эту команду -
ren spec\string_analyzer_test.rb string_analyzer_spec.rb
Теперь беги rspec spec снова, вы должны увидеть результат, который выглядит следующим образом -
F.
Failures:
1) StringAnalyzer With valid input should detect when a string contains vowels
Failure/Error: expect(sa.has_vowels? test_string).to be true
expected true
got false
# ./spec/string_analyzer_spec.rb:9:in `block (3 levels) in <top (required)>'
Finished in 0.015 seconds (files took 0.12201 seconds to load)
2 examples, 1 failure
Failed examples:
rspec ./spec/string_analyzer_spec.rb:6 # StringAnalyzer With valid
input should detect when a string contains vowels
Do you see what just happened? Our spec failed because we have a bug in
StringAnalyzer. The bug is simple to fix, open up string_analyzer.rb
in a text editor and change this line:
!!(str =~ /[aeio]+/i)
to this:
!!(str =~ /[aeiou]+/i)
Теперь сохраните изменения, которые вы только что внесли в string_analyizer.rb, и снова запустите команду rspec spec, теперь вы должны увидеть результат, который выглядит так:
..
Finished in 0.002 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures
Поздравляем, примеры (тесты) в вашем файле спецификации теперь проходят. Мы исправили ошибку в регулярном выражении с методом гласных, но наши тесты далеки от завершения.
Имеет смысл добавить больше примеров, которые проверяют различные типы входных строк с помощью метода has vowels.
В следующей таблице показаны некоторые перестановки, которые могут быть добавлены в новые Примеры (он блокирует)
Строка ввода | Описание | Ожидаемый результат с has_vowels? |
---|---|---|
'aaa', 'eee', 'iii', 'o' | Только одна гласная и никаких других букв. | правда |
'abcefg' | 'Как минимум одна гласная и несколько согласных' | правда |
'mnklp' | Только согласные. | ложный |
'' | Пустая строка (без букв) | ложный |
'abcde55345 & ??' | Гласные, согласные, цифры и знаки препинания. | правда |
'423432 %%% ^ &' | Только цифры и знаки препинания. | ложный |
'AEIOU' | Только гласные верхнего регистра. | правда |
'AeiOuuuA' | Только верхний регистр и нижние гласные. | правда |
'AbCdEfghI' | Гласные и согласные буквы верхнего и нижнего регистра. | правда |
'BCDFG' | Только согласные в верхнем регистре. | ложный |
'' | Только символы пробела. | ложный |
Вам решать, какие примеры добавить в свой файл спецификации. Есть много условий, которые нужно проверить, вам нужно определить, какое подмножество условий наиболее важно, и лучше всего протестировать ваш код.
В rspec команда предлагает множество различных опций, чтобы увидеть их все, введите rspec-Помогите. В следующей таблице перечислены наиболее популярные варианты и описано их назначение.
Sr.No. | Параметр / флаг и описание |
---|---|
1 | -I PATH Добавляет PATH к пути загрузки (требуется), который rspec используется при поиске исходных файлов Ruby. |
2 | -r, --require PATH Добавляет определенный исходный файл, который требуется в вашей спецификации. файл (ы). |
3 | --fail-fast С этой опцией rspec перестанет запускать спецификации после сбоя первого примера. По умолчанию rspec запускает все указанные файлы спецификаций, независимо от количества сбоев. |
4 | -f, --format FORMATTER Этот параметр позволяет указать различные форматы вывода. См. Раздел «Средства форматирования» для получения более подробной информации о форматах вывода. |
5 | -o, --out FILE Эта опция указывает rspec записывать результаты теста в выходной файл FILE, а не в стандартный файл. |
6 | -c, --color Включает цвет в выводе rspec. Успешные результаты примера будут отображаться зеленым текстом, а неудачные - красным. |
7 | -b, --backtrace Отображает полную трассировку ошибок в выводе rspec. |
8 | -w, --warnings Отображает предупреждения Ruby в выводе rspec. |
9 | -P, --pattern PATTERN Загрузите и запустите файлы спецификации, соответствующие шаблону PATTERN. Например, если вы передадите -p «* .rb», rspec запустит все файлы Ruby, а не только те, которые заканчиваются на «_spec.rb». |
10 | -e, --example STRING Эта опция указывает rspec запускать все Примеры, содержащие текст STRING в своих описаниях. |
11 | -t, --tag TAG С этой опцией rspec будет запускать только примеры, содержащие тег TAG. Обратите внимание, что TAG указан как символ Ruby. См. Раздел «Теги RSpec» для получения более подробной информации. |