Ruby testing tools

Preview:

DESCRIPTION

Some of the tools available with a small usage example

Citation preview

Rails testing tools

Agile - the Rails Way

Testing

•Test::Unit•Shoulda•webrat•RSpec•Cucumber

The base tool used for testing in Rails

Makes tests easier on the eyes & fingersExpressive acceptance test libraryBehavior driven testing frameworkPlain text based BDD testing tool

An example featureFeature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

The feature nameFeature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

The feature definitionFeature: Find love In order to find love I want to search the internet

Scenario: Searching for JS.Class docs Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

An example scenarioFeature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

The scenario nameFeature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

Given . . .Feature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

When . . .Feature: Fidn love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

Then . . .Feature: Find love In order to find love I want to search the internet

Scenario: looking (in all the wrong places) Given I have opened "http://www.google.com/" When I search for "love" Then I should see a link to "http://zombieharmony.com/" -> with text "Yes, even you can find love!"

The step definitionsGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

Given definitionGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

When definitionGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

Then definitionGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

CucumberGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

webratGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

RSpecGiven /^I have opened "([^\"]*)"$/ do |url| visit urlend

When /^I search for "([^\"]*)"$/ do |query| fill_in 'q', :with => query click_button 'Google Search'end

Then /^I should see a link to "([^\"]*)" with text "([^\"]*)"$/ do |url, text| response_body.should have_selector("a[href='#{ url }']") do |element| element.should contain(text) endend

Controller testdescribe LoveController do

it { should route(:get, 'search').to(:action => :find) }

describe 'lookin for love' do before { get :find, :q => 'someone to hold me - ever so gently' } it { should respond_with 404 } it { should respond_with_content_type 'text/html' } end

end

RSpecdescribe LoveController do

it { should route(:get, 'search').to(:action => :find) }

describe 'lookin for love' do before { get :find, :q => 'someone to hold me - ever so gently' } it { should respond_with 404 } it { should respond_with_content_type 'text/html' } end

end

Shouldadescribe LoveController do

it { should route(:get, 'search').to(:action => :find) }

describe 'lookin for love' do before { get :find, :q => 'someone to hold me - ever so gently' } it { should respond_with 404 } it { should respond_with_content_type 'text/html' } end

end

When to use whatFor user acceptance (view) testing:

•Cucumber•webrat•RSpec

For functional (controller) testing:•Rspec•Shoulda•Factory Girl (not covered here)

For unit (model) testing:•Shoulda•Test::Unit

Pimp my projectPimp my data:

•Factory Girl•Mocha•Fixtures

Pimp my code:•Autotest (part of ZenTest)•RCov (code coverage tool)•metric_fu (if ninjas created reports)

Comparing Java & RubyRuby

Community driven Surgical tools Duck typing Wild west 15 years old

JavaCommittee driven Swiss Army Knife

Static typing JCP

14 years old