пятница, 5 октября 2012 г.

BDD

BDD (Bihavior-Driven Development) — разработка с опережающим описанием поведения программы. Другими словами сначала мы описываем в спецификации то, как должна себя вести программа, а затем пишем саму программу. 


На cucumber мы пишет наши тесты простым языком, а сами шаги реализуем с испльзованием Capybara. А Capybara уже взаимодействует с webdriver'ом

Gem файлы:
cucumber
capybara 
capybara-mechanize
selenium-webdriver 
Браузер + селениум IDE + firebug


Структура:

current\
    features\
            user.feature
        step_definitions\
            user_steps.rb
        support\
            env.rb

в папке «features» находятся наши «фичи» написанные по правилам Cucumber. В папке «step_definitions» шаги для реализации задуманного функционала. В папке «support» какие-нибудь конфигурационные файлы, библиотеки. А так же файл env.rb — к которому обращается Cucmber сразу после запуска (где происходит инициализация драйвера; первоначальная настройка).

Cucumber

Итак,  Cucumber. Он позволяет описать поведение системы с позиции внешнего наблюдателя ( «заказчика, конечного пользователя»). При этом описание дается на естественно языке, никаких вам begin end. Каждый вариант использования системы в огурце называется «фичей» (feature). Все они лежат в одноименной папочке features с  расширением файла *.feature
В каждом файле описывается один или несколько «сценариев» (scenario), характеризующих фичу. Сценарии состоят из ряда шагов, объявленных в файлах из папки features/step_definitions/*_steps.rb

Шаги бывают трех типов:
Given (что-то данное, некоторое предварительное условие), 
When (что-то, что происходит, какие-то действия пользователя) 
Then (результат, реакция, отклик)
Одна из  фич :

Feature: A user sees who is online
In order know that the portal is alive
As a regular user
I want to see who is online 

Background:
Given the section "Personal profiles" exists 

Scenario Outline: See a special label next to the name of a user who is online
Given nobody has been on the portal for a lot time
And a user exists with name: "<name>"
When the user "<name>" <user action> the portal
And I go to the profile of the user "<name>"
Then I should <my action> the online label for the user "<name>"
When I go to the section "Personal profiles"
Then I should <my action> the online label for the user "<name>" 

Examples:
| name | user action | my action |
| Victoria | visits | see |
| Michael | does not visit | not see |


Ключевое слово "Feature" предшествует имени фичи, по правилам должно кратко и ясно описывать действия пользователя. Три строчки под ним говорят, для чего, кто и что хочет. Раздел "Background" по желанию, задает общие шаги для всех сценариев фичи. Далее идут либо "Scenario", либо "Scenario Outline". Первое описывает сценарий без параметров, второе — с параметрами, идущими после ключевого слова "Examples" снизу. Через собачку (@) расставляются метки, позволяющие наложить дополнительные условия на всю фичу или конкретный сценарий, а так же выборочно выполнить тест. В принципе все читабельно. В идеале должно быть так, чтобы заказчик взял этот файл, открыл простым текстовым редактором и не напрягаясь прочел, все понял, осознал и подтвердил: «Оно!»
Что касается настройки огурца, то она проводится в сгенерированном файле features/support/env.rb. Там добавляются необходимые строчки кода для подключения всего, что необходимо для тестирования.

Устанавливаем Gem

После того как установлены Ruby and RubyGems,  Cucumber устанавливается следующей командой:
gem install cucumber
Начнем знакомство при помощи команды --help
cucumber --help

Запускаем 

cucumber features/user.feature

RSpec

RSpec тоже используется для описания внешнего поведения системы, однако больше подходит для копания в ее внутренностях. Каждый файл у RSpec в простонародье называется «спекой» (spec, от specification), находится в папке spec и заканчивается на*_spec.rb. Принято файлы в папке spec разбивать по вложенным папкам, чтобы они отражали структуру рельсового проекта (modelscontrollershelpers, etc.). Вот пример:
describe User do
  it { should ensure_length_of(:email).is_at_least(6).is_at_most(100) }
  it { should validate_format_of(:email).with('ma1f0rmed emai1 address') }

  subject { Factory :user }
  it { should validate_uniqueness_of :email }
  it { should validate_uniqueness_of :address }
end

Конфигурация RSpec сконцентрирована в файле spec/spec_helper.rb. Аналогично env.rb у Cucumber сюда идут все вспомогательные require и прочее.

Подробненькая статья про мачеры

Устанавливаем Gem

Устанавливается следующей командой:
gem install rspec
Начнем знакомство при помощи команды --help
rspec --help

Запускаем 

rspec feature/step_defenitions/user_steps.rb

Capybara

Capybara — это удобная штука для автоматизации «браузерного» тестирования приложения. Джем дает множество вспомогательных методов в тестовое окружение, в результате чего с легкостью можно проверить такие вещи как, например, переход по ссылкам, заполнение форм (поля ввода, выпадающие списки, чекбоксы и так далее), наличие какого-либо элемента на странице. Более того, при подключении к нему Selenium, позволяет проходить шаги тестового сценария прямо в браузере. У вас откроется браузер и странички будут бегать одна за другой. В случае Cucumber для этого достаточно открыть файл env.rb и добавить следующий код с указанием нужного браузера (список доступных смотрим в документации по Selenium):

Capybara.register_driver :selenium do |app|
  Capybara::Driver::Selenium.new app, :browser => :chrome
end

Factory Girl Rails

Эту библиотеку используют для удобного создания экземпляров моделей. Другими словами, нужно же на примере чего-то тестировать. Нам нужны и пользователи (User) какие-нибудь, и статьи (Article), и проекты (Project) с задачами (Task). Не создавать же каждый раз объекты с заполнением всех обязательных полей. Вот тут-то на помощь и приходят подобные фабрики. Достаточно один раз определить шаблон и далее генерировать новые сущности на его основе. В связке с RSpec фабрики обычно хранятся в папке spec/factories или напрямую в spec/factories.rb. Например, вот такая:
Factory.define :user do |factory|
  factory.sequence(:email) { |i| "user#{ i }@example.org" }
  factory.password 'password'
  factory.password_confirmation { |user| user.password }
  factory.confirmed_at Time.now
end
Все, теперь в тестах достаточно Factory(:user) и у нас валидный юзер.

1 комментарий: