Начало работы с RSpec

февраля 6, 2011  |  Published in BDD, Тестирование  |  12 Comments

toolkit rspecТребования:

Ruby >= 1.8.6
Rubygems >= 1.3.7

Установка RSpec

Для установки RSpec воспользуйтесь следующей консольной командой:

$ gem install rspec

Благодаря этой команде Rubygems установит следующие gem’ы:

rspec
rspec-core
rspec-expectations
rspec-mocks

Gem rspec-core устанавливает консольную команду rspec. Запустите команду rspec с параметром —help чтобы увидеть доступные опции:

$ rspec —help

С места в карьер!

Напишем простой пример, который описывает желаемое поведение программы:


# bowling_spec.rb

describe Bowling do
  describe "#score" do
    it "returns 0 for all gutter game" do
      bowling = Bowling.new
      20.times { bowling.hit(0) }
      bowling.score.should == 0
    end
  end
end

Запускаем пример и видим фейл (fail) потому, что объект покрываемый примером отсутствует. Чтобы избавится от этой ошибки следует просто включить в файл спецификации с помощью require файл, для которого эта спецификация предназначалась:

$ rspec bowling_spec.rb 
   uninitialized constant Object::Bowling (NameError)

# bowling_spec.rb
require './bowling'
...

И создать сам тестируемый файл:


# bowling.rb

class Bowling
  def hit(pins)
  end

  def score
    0
  end
end

Снова запускаем rspec и радуемся, что тест не возвращает фейл потому, что тестируемый код выполняет все описанные в спецификации функции!

$ rspec bowling_spec.rb —color —format doc

Bowling
     #score
         returns 0 for all gutter game

Finished in 0.00057 seconds
1 example, 0 failures

Что собой представляет BDD?

Разработка через поведение (Behavior-Driven Development (BDD), дословно: разработка управляемая поведением) представляет собой гибкую методику разработки основанную на том, что первичным является «поведение», то есть спецификации описывающие поведение программы, а затем по этим спецификациям разрабатывается собственно сам программный код. Спецификация выполняется в виде теста функциональности и проверяет все ли функции выполняются в тестируемом коде и правильно ли они выполняются. Спецификация также является отличной «документацией», которая предоставляет разработчику возможность более быстро разобраться в чужом коде.

Очень часто спецификацию приложения пишут совместно с клиентов, в таких случаях, когда клиент не знаком с разработкой, спецификации пишутся на специальном DSL — Cucumber, который предоставляет писать на понятном человеку языке спецификации. Такая методика разработки спецификаций позволяет разработчикам получить полное представление о том, чего хочет клиент, а клиенту представление того, что он получит.

Многие люди не различают BDD и TDD (Test-Driven Development — разработку через тестирование) и честно говоря разница действительно не очень значительна, как по мне. При TDD мы сначала пишем тест для какого-то незначительного куска кода, а затем пишем этот кусок кода, запускаем тест, проверяем правильно ли работает код, а затем занимаемся рефакторингом написанного кода, после чего опять запускаем тест, чтобы проверить ничего ли мы не испортили. рабочие циклы или итерации при TDD малы в силу написани тестов для относительно небольших фрагментов кода. В BDD существоет иной подход к делу, хотя мы также пишем тесты, которые называем спецификациями, эти тесты не просто проверяют правильно ли работает код, но и описывают как он должен работать, а главное — на этапе написания спецификаций мы проектируем архитектуру приложения!

Что такое RSpec?
RSpec — это инструмент BDD, фреймворк, DSL для разработки спецификаций, который предоставляет язык для написания спецификаций и производит тестирование кода на соответствие спецификации.

Терминология

Спеком (жарг. от спецификация) называется файл спецификации, который покрывает описанием поведения определенную единицу программы, чаще всего модуль или класс. При написании спеков для приложений на Ruby on Rails вам следует описать функционал (создать спеки) моделей, контроллеров, хелперов и представлений.

Описанием (describe) называется контейнер — блок кода, который содержит в себе примеры, а также разные дополнительные методы. Описание также содержит информацию о том, какой именно кусок кода покрывается спецификацией. Пример:


describe SomeClass do
  describe "#d_square"
    # it ...
  end
end

Выше показано два вложенных описания. Первое содержит описание класса, а вложенное описание метода d_square.

Примером (example) называют единицу спецификации — блок кода между it «…» do и end. Пример создает экземпляр тестируемого класса, описывает поведение, например какого-нибудь метода, и внутри блока кода выполняет собственно сам тест. Допустим, метод возвращает нам удвоенный квадрат числа и мы знаем, что удроенный квадрат 5 равен 50, проверяем:

describe SomeClass do
  describe "#d_square" do
    it "should return 50 for 5" do
      SomeClass.new.d_square(5).should == 0
    end
  end
end

Красный и зеленый режимы — так называют ответ теста соответственно при обнаружении фейла или когда все работает корректно. Это название связано с тем, что когда вы активируете подсветку для ваших спеков в консоли, то вы увидите, что текст отчета о тестировании будет красным в случае фейлов, и зеленым в случае, когда для всех описаный и примеров реализован код и он работает корректно.

Фейл (fail). Переводя на русский так и хочется перевести «ошибка тестов», но ведь ошибка не в тестах! Фейл — это «падение» тестов, не «грехопадение», а ситуация, когда тестируемый код для примера или для примеров не реализован, или когда реализован, но возвращает неправильные значения.

Это ока все, с чем я разобрался. Ждите следующих статей, возможно всеэто выйдет в виде цикла статей.

первая часть статьи — перевод официального:

Лучшая благодарность автору — ваши комментарии!

Маленькая посьба к читателям блога: Плюсаните в карму на хабре этим двум аккаунтам: , .

Благодарю за помощь!

Tags: ,

Responses

  1. Frantic says:

    февраля 7, 2011 at 23:49 (#)

    Очень хорошая и информативная презентация об RSpec:

  2. admin says:

    февраля 8, 2011 at 07:36 (#)

    Frantic, спасибо за ссылку! Действительно хороший материал.

  3. alvir says:

    февраля 8, 2011 at 13:10 (#)

    Небольшое буквоедство — «Запускаем пример и видИм»

  4. admin says:

    февраля 8, 2011 at 15:02 (#)

    alvir, спаисибо за буквоедство, всегда считал проверочным словом «видЕть», а оно оказывается проверять нужно через «видИмость».

  5. Anonymous says:

    февраля 8, 2011 at 19:35 (#)

    Это просто словарное исключение, ведь очевидно, что «видеть» и «видим» — формы одного слова, а «видимость» — совсем другое слово.

  6. Валентин says:

    марта 4, 2011 at 02:17 (#)

    Вам нужно указывать источники статей, это перевод из отличной книги «The RSpec Book» авторства Davis Chelimski, 2009 года

    И если честно , мне в оригинале нравится больше изложение, тут как-то вырваны куски которые не обьясняют философии данного подхода. Просто набросано терминов, всё очень невнятно.

    Сказали бы что основное отличие BDD от ТDD в том что тестируется именно бизнес логика что, к примеру, active_model тестировать повторно незачем, она и так покрыта тестами. В общем статья не понравилась.

  7. admin says:

    марта 4, 2011 at 09:35 (#)

    Валентин, источник статьи указан и это не книга, а дока с официального сайта проекта.

  8. Валентин says:

    марта 5, 2011 at 15:53 (#)

    Простите, но я в указанной ссылке не увидел того что есть здесь, и в книге, в частности фраз вроде «С места в карьер!», которая по ссылке которую вы указали «Getting started» а в книге она дословно так записана. Впрочем авторы книги и авторы блога это одни и те же люди, но всё же, по указанной ссылке находится не английская версия этого текста.

  9. admin says:

    марта 5, 2011 at 17:19 (#)

    Getting Started я перевел как «с места в карьер». Не вижу в чем проблема? Половина поста — перевод, половина — разьяснение терминологии.

  10. says:

    августа 27, 2011 at 14:39 (#)

    На мой взгляд, хорошая статья. Самое то, для первого представления об Rspec и BDD. Респект )

  11. says:

    августа 29, 2011 at 11:06 (#)

    Привет. решил начать писать полноценные тесты для своего кода.
    и никак не могу протестировать массив на наличие в нем одного или нескольких элементов.

    search.urls.should include(«http://www.ruby-lang.org/») или как?

  12. says:

    августа 30, 2011 at 11:51 (#)

    Уже нашел

    search.urls.include?("http://www.ruby-lang.org/").should be_true
    

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.