Учебники

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

Сохраните это в той же директории спецификации, присвоив ей имя 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» для более подробной информации.