В этой главе мы создадим новый класс 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
Сохраните это в той же директории спецификации, присвоив ей имя 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, теперь вы должны увидеть вывод, который выглядит как —
.. Finished in 0.002 seconds (files took 0.11401 seconds to load) 2 examples, 0 failures
Поздравляем, примеры (тесты) в вашем спецификационном файле теперь проходят. Мы исправили ошибку в регулярном выражении, которое имеет метод гласных, но наши тесты далеки от завершения.
Было бы целесообразно добавить больше примеров, которые проверяют различные типы входных строк с помощью метода has vowels.
В следующей таблице приведены некоторые перестановки, которые можно добавить в новые примеры (блокируются).
Строка ввода | Описание | Ожидаемый результат с has_vowels? |
---|---|---|
‘ааа’, ‘э-э-э’, ‘iii’, ‘о’ | Только одна гласная и никаких других букв. | правда |
‘Abcefg’ | «По крайней мере, один гласный и несколько согласных» | правда |
‘Mnklp’ | Только согласные. | ложный |
«» | Пустая строка (без букв) | ложный |
‘Abcde55345 & ??’ | Гласные, согласные, цифры и знаки препинания. | правда |
‘423432 %%% ^ &’ | Только цифры и знаки препинания. | ложный |
‘AEIOU’ | Только верхний регистр гласных. | правда |
‘AeiOuuuA’ | Только верхний регистр и нижние гласные. | правда |
‘ABCDEFGHI’ | Верхний и нижний регистр гласных и согласных. | правда |
‘BCDFG’ | Только в верхнем регистре. | ложный |
» | Только пробельные символы. | ложный |
Вам решать, какие примеры добавить в ваш файл спецификаций. Есть много условий для тестирования, вам нужно определить, какое подмножество условий является наиболее важным и тестирует ваш код лучше всего.
Команда rspec предлагает много разных опций, чтобы увидеть их все, наберите rspec -help. В следующей таблице перечислены наиболее популярные варианты и описано, что они делают.
-Я ПУТЬ
Добавляет PATH к пути загрузки (требуется), который rspec использует при поиске исходных файлов Ruby.
-r, -require PATH
Добавляет определенный исходный файл, который требуется в вашей спецификации. файл (ы).
—fail-быстро
С этой опцией rspec прекратит запуск спецификаций после сбоя первого примера. По умолчанию rspec запускает все указанные файлы спецификаций, независимо от количества сбоев.
-f, —формат FORMATTER
Эта опция позволяет вам указать разные выходные форматы. См. Раздел «Форматтеры» для более подробной информации о форматах вывода.
-о, -из ФАЙЛА
Эта опция указывает rspec записывать результаты теста в выходной файл FILE вместо стандартного вывода.
-c, —color
Включает цвет в выводе rspec. Успешные примеры будут отображаться зеленым цветом, ошибки — красным.
-b, —backtrace
Отображает полные ошибки в выводе rspec.
-w, — предупреждения
Отображает предупреждения Ruby в выводе rspec.
-P, —pattern PATTERN
Загрузите и запустите файлы спецификаций, которые соответствуют шаблону PATTERN. Например, если вы передадите -p «* .rb», rspec запустит все файлы Ruby, а не только те, которые заканчиваются на «_spec.rb».
-e, — пример STRING
Эта опция указывает rspec запускать все Примеры, которые содержат текст STRING в своих описаниях.
-t, —tag TAG
С этой опцией rspec будет запускать только примеры, содержащие тег TAG. Обратите внимание, что TAG указан как символ Ruby. См. Раздел «Теги RSpec» для более подробной информации.