Acceptance Testing: RSpec vs Cucumber

Levinumad acceptance testide loomise vahendid Behavior-Driven Development metoodikas on RSpec (Ruby jaoks) ja Cucumber (universaalsem). Olles mõlemat mõnevõrra pruukinud, tekkis küsimus, et kumb siis on lõpuks acceptance testimiseks parem. BDD põhitõdesid ei hakkaks ehk siinkohal kordama, vaataks hoopis Cucumberis ja RSpec’is testide kirjutamist hüpoteetilise Rubys kirjutatud veebirakenduse jaoks.

Mõlemad tööriistad kasutavad brauseri käitamiseks Capybara-nimelist veebirakenduste testimise raamistikku. RSpec’i ja Cucumberi erinevus seisneb peamiselt testi loetavuses ning kirjelduse nö. tasemes. Lihtne näide esmalt Cucumberi stsenaariumina:

Feature: Blog articles
  In order to have an awesome blog
  As an author
  I want to create and manage articles

  Scenario: Article index
    Given there are 2 articles
    When I go to the articles page
    Then I should see the following articles:
    | Article title |
    | Article one   |
    | Article two   |

Iga sammu tähenduse Cucumberile arusaadavaks tegemiseks tuleb need defineerida:

Given /there are (.*) articles/ do |number|
  number.times { |n| Article.create! }
end

Nagu näha, kasutab Cucumber testide kirjeldamiseks loomulikku keelt ja seetõttu on sellised testid väga hästi loetavad, samuti aitab kõrgema taseme funktsionaalsusele keskendumine kergemini vastata küsimusele “Mida meie rakendus õigupoolest tegema pidi?“. Teisalt on antud juhul vajalik kirjutada ka sammudefinitsioonid, et Cucumber teaks, mida meie loomulikus keeles kirjeldatud stsenaariumitega peale hakata, seega tekib testidesse üks lisakiht, mis samuti vajab ülalpidamist.

RSpec seevastu tegutseb madalamal, detailsemal, tasemel. Ülaltoodud stsenaarium üks-ühele RSpec’i ümber kirjutatuna võiks välja näha umbes selline:

describe "Article index" do
  it "by title" do
    2.times { Article.create! }
    visit articles_path
    page.should have_content "Article one"
    page.should have_content "Article two"
  end
end

Selline test küll teeb täpselt sama, mis eeltoodud Cucumberi stsenaarium, kuid ei ole nii hästi loetav. Võtame kasutusele Capybara RSpec helperi ja kirjutame testi paremaks:

require 'capybara/rspec'

feature "Articles", %q{
  In order to have an awesome blog
  As an author
  I want to create and manage articles
} do

  background do
    Article.create!(:title => 'Article one')
    Article.create!(:title => 'Article two')
  end

  scenario "Article index" do
    visit articles_path
    page.should have_content('Article one')
    page.should have_content('Article two')
  end
end

Loetavus paranes märgatavalt ja ka test näeb üsna sarnane välja Cucumberi stsenaariumile, millel ta põhineb.

 

Lõpetuseks

RSpec’il on tugev eelis Ruby arendajate jaoks, kes saavad nii unit kui acceptance testid kirjutada ühe vahendiga. Cucumber jällegi võimaldab olemasolevaid teste ilma olulise lisatööta kasutada spetsifikatsiooni dokumendina, mis on ka keskmisele kliendile loetav. Ja lõppude lõpuks on testide kvaliteedi seisukohalt hoopis olulisem järgida ka testide kirjutamisel üldiseid tarkvaraarenduse häid põhimõtteid.

Leave a Reply

Your email address will not be published. Required fields are marked *