Top Banner
Cucumber Hussein Morsy und Tanja Otto 30.06.2009 Heinrich-Heine-Universität Düsseldorf Rails User Group Düsseldorf
68

Einführung in Cucumber mit Rails

May 15, 2015

Download

Technology

Hussein Morsy

Einführung in Cucumber mit Rails. Vortrag wurde am 30.06.2009 an der
Heinrich-Heine-Universität Düsseldorf im Rahmen der Rails User Group Düsseldorf von Tanja Otto und Hussein Morsy gehalten
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Einführung in Cucumber mit Rails

CucumberHussein Morsy und Tanja Otto

30.06.2009 Heinrich-Heine-Universität Düsseldorf

Rails User Group Düsseldorf

Page 2: Einführung in Cucumber mit Rails

Über uns

• internes Entwicklerteam von Sales-Lentz

• IBEs für Reisen, Bustickets, Eventtickets

• seit 2006 entwickeln wir mit Ruby on Rails

• Buch Ruby on Rails 2 Galileo Press

http://www.railsbuch.de

Page 3: Einführung in Cucumber mit Rails

Wer setzt Cucumber in seinen Projekten ein?

Page 4: Einführung in Cucumber mit Rails

Aufbau

• Philosophie

• Cucumber Features erstellen

• Cucumber Features automatisieren

• Tabellen, Outlines und weitere Helferleins

• Cucumber installieren und konfigurieren

• Demo

Page 5: Einführung in Cucumber mit Rails

Philosophie

Page 6: Einführung in Cucumber mit Rails

Was ist TDD

• Hauptmerkmal: Test First

• Von Innen nach Aussen

• Red => Green => Refactor “Make it green than make it clean”

• TDD ist kein Test-Tool, sondern eine Technik für Entwickler

Page 7: Einführung in Cucumber mit Rails

Units

Model Model Model Model

Controller Controller Controller

Views Views Views Views

Model

Page 8: Einführung in Cucumber mit Rails

TDD-Tools

• Unit-Test-Frameworks in Ruby

• Test::Unit

• Shoulda

• RSpec

• ...

Page 9: Einführung in Cucumber mit Rails

Ziel von BDD

writing software that matters

Page 10: Einführung in Cucumber mit Rails

Was ist BDD

• BDD ist kein Ersatz für TDD

• TDD ist ein Bestandteil von BDD

• BDD bedeutet outside-in Entwicklung

• Wie ein User mit der App arbeiten möchte beeinflusst die Implementierung

• Kundenwünsche stehen an erster Stelle

Page 11: Einführung in Cucumber mit Rails

Outside-In

Model Model Model Model

Controller Controller Controller

Views Views Views Views

Model

Page 12: Einführung in Cucumber mit Rails

Cucumber

Page 13: Einführung in Cucumber mit Rails

Cucumber

Applikation

Page 14: Einführung in Cucumber mit Rails

Planung

• Beschreibung der Features bzw. Akzeptanzkritieren

• Beschreibung einer Story aus Anwendersicht

• Zusammen mit dem Kunden

• Business Value steht an erster Stelle

• Wenn Kritieren erfüllt => Akzeptiert

Page 15: Einführung in Cucumber mit Rails

Merkmale

• Beschreibung der Features/Akzeptanzkriterien in Prosaform

• Automatisiertes ausführen der Features

• Unterstützung von mehreren Sprachen

• Nicht nur für Rails (Java, .Net, Erlang, ... )

Page 16: Einführung in Cucumber mit Rails

Features

Page 17: Einführung in Cucumber mit Rails

Aufbau von Features

• Titel & Kurzbeschreibung

• Ein oder mehrere Szenarien (die die Akzeptanzkriterien darstellen)

Page 18: Einführung in Cucumber mit Rails

Titel und Kurzbeschreibung

Page 19: Einführung in Cucumber mit Rails

Feature: Booking As a Customer I want to book a travel So that I can spend my holidays with Sales-Lentz

Scenario:....

Page 20: Einführung in Cucumber mit Rails

Feature: Booking As a .... (Role) I want to .... (Action) So that ... (Buisniss value/ Outcome)

Page 21: Einführung in Cucumber mit Rails

Szenarien

Page 22: Einführung in Cucumber mit Rails

Scenario: booking a Travel Given a travel “Rhein in Flammen” for 137.40 When I go to the detail page of Rhein in Flammen When I follow "buchen" When I select "Herr" from "Anrede" When I fill in "Nachname" with "Mustermann" When I fill in "E-Mail" with "[email protected]" When I check "Versicherung" When I press "buchen" Then I should see "Ihre Buchung" Then I should see "Herr" Then I should see "Mustermann" Then I should see "[email protected]" Then I should see "137,40 EUR" Then I should not see "Ausgebucht"

Page 23: Einführung in Cucumber mit Rails

Scenario: booking a Travel Given a travel “Rhein in Flammen” for 137.40 When I go to the detail page of Rhein in Flammen And I follow "buchen" And I select "Herr" from "Anrede" And I fill in "Nachname" with "Mustermann" And I fill in "E-Mail" with "[email protected]" And I check "Versicherung" And I press "buchen" Then I should see "Ihre Buchung" And I should see "Herr" And I should see "Mustermann" And I should see "[email protected]" And I should see "137,40 EUR" But I should not see "Ausgebucht"

Page 24: Einführung in Cucumber mit Rails

Aufbau eines Szenarios

• Titel (Scenario:)

• Steps

• Vorbedingungen (Given)

• Aktionen (When)

• Erwartungen (Then)

Page 25: Einführung in Cucumber mit Rails

Features auf Deutsch

Page 26: Einführung in Cucumber mit Rails

Feature: Administrationsbereich Als ein angemeldeter Administrator Möchte ich die Admin-Seiten besuchen So dass ich die Seiten leicht aktualisieren kann.

Szenario: Zugang für Admin-Seite beschränken Gegeben sei ein Admin-User Wenn ich nicht eingelogged bin Und ich die Admin-Seite besuche Dann sollte mir der Zugang verweigert werden

Szenario: Zugang für für autorisierten User Gegeben sei ein Admin-User Und ich bin eingelogged als Admin-User Wenn ich die Admin-Seite besuche Dann sollte ich "Admin-Bereich" sehen

Page 27: Einführung in Cucumber mit Rails

Automatisieren von Features

Page 28: Einführung in Cucumber mit Rails

Ziel

Automatisiertes ausführen der Features

auf der Applikation

wie in einem Webbrowser

Page 29: Einführung in Cucumber mit Rails

Step-Definition

Ruby Code, der die Steps in den Szenarien ausführbar macht

Page 30: Einführung in Cucumber mit Rails

Given a travel “Rhein in Flammen” for 137.40

Step

Given-Step mit Definition

Given /̂ a travel "([̂ \"]*)" for ([0-9.]*)$/ do |title, price| Travel.create(:title => title, :price => price.to_f)end

Step-Definition

Page 31: Einführung in Cucumber mit Rails

Given Step-Definition

• Hier werden meist die Daten vorbereitet

• Implementierung meist mit ActiveRecord

Given /̂ a travel "([̂ \"]*)" for ([0-9.]*)$/ do |title, price| Travel.create(:title => title, :price => price.to_f)end

Page 32: Einführung in Cucumber mit Rails

When-Step mit Definition

When /̂ I press "([̂ \"]*)"$/ do |button| click_button(button)end

When I press “buchen”

Step

Step-Definition

Page 33: Einführung in Cucumber mit Rails

When Step-Definition

• Hier findet die Interaktion statt

• Simulation des Browsers

• Implementierung z.B. mit Webrat

When /̂ I press "([̂ \"]*)"$/ do |button| click_button(button)end

Page 34: Einführung in Cucumber mit Rails

Then-Step mit Definition

Then /̂ I should see "([̂ \"]*)"$/ do |text| response.should contain(text)end

Then I should see "Ihre Buchung"

Step

Step-Definition

Page 35: Einführung in Cucumber mit Rails

Then Step-Definition

• Hier wird geprüft, ob eine bestimmte Zeichenkette in der Ausgabe vorkommt

• Implementierung z.B. mit RSpec

Then /̂ I should see "([̂ \"]*)"$/ do |text| response.should contain(text)end

Page 36: Einführung in Cucumber mit Rails

Given /^a travel "([^\"]*)" for ([0-9.]*)$/ do |title, price| Travel.create(:title => title, :price => price.to_f)end

When /^I press "([^\"]*)"$/ do |button| click_button(button)end

When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value| fill_in(field, :with => value) end

Then /^I should see "([^\"]*)"$/ do |text| response.should contain(text)end

features/step_definitions/booking_steps.rb

Page 37: Einführung in Cucumber mit Rails

Techniken zur Step-Definition

• Direct Model Access (z.B. mit ActiveRecord)

• Simulated Browser (Webrat)

• Automated Browser (Selenium)

• RSpec-Befehle

Page 38: Einführung in Cucumber mit Rails

Webrat

• Simuliert Browser

• DSL zum steuern des Browsers

• Webrat kann auch ohne Cucumber eingesetzt werden (z.B. RSpec, Test::Unit,...)

• Schnell

• kein JavaScript

Page 39: Einführung in Cucumber mit Rails

visit home_path

click_link "Sign up"

fill_in "Email", :with => "[email protected]"

select "Free account"

click_button "Register"

Page 40: Einführung in Cucumber mit Rails

Selenium

• Wird im Firefox-Browser ausgeführt

• Führt JavaScript aus

• Langsam

Page 41: Einführung in Cucumber mit Rails

Tabellen, Outlines und weitere Helferleins

Page 42: Einführung in Cucumber mit Rails

Tabellen

Page 43: Einführung in Cucumber mit Rails

Ohne Tabellen

Scenario: booking a Travel Given a travel “New York” for 2137.40 And a travel “San Francisco” for 2137.40 And a travel “Las Vegas” for 1134.40 And a travel “Dubai” for 3135.40 And a travel “London” for 637.40 And a travel “Berlin” for 337.40 And a travel “Hamburg” for 437.40 And a travel “München” for 1137.40 . . .

Page 44: Einführung in Cucumber mit Rails

Mit Tabellen

Scenario: booking a Travel Given the following travels | title | price | | New York | 2137.40 | | San Francisco | 2137.40 | | Las Vegas | 1134.40 | | Dubai | 3135.40 | | London | 637.40 | | Berlin | 337.40 | | Hamburg | 437.40 | | München | 1137.40 |

Page 45: Einführung in Cucumber mit Rails

Step Definition

Given /̂ the following travels$/ do |travels| Travel.create(travels.hashes)end

travels.class == Cucumber::Ast::Tabletravels.hashes ==[ {:title => “New York”, :price => 2137.40}, {:title => “San Francisco”, :price => 2137.40},]

Page 46: Einführung in Cucumber mit Rails

Background

Page 47: Einführung in Cucumber mit Rails

Ohne Background

Scenario: booking a Travel Given a travel “New York” for 2137.40 And a travel “San Francisco” for 2137.40 And a travel “Las Vegas” for 1134.40 .... Scenario: booking a Travel for less than 2000 Given a travel “New York” for 2137.40 And a travel “San Francisco” for 2137.40 And a travel “Las Vegas” for 1134.40 ....

Page 48: Einführung in Cucumber mit Rails

Don’t repeat yourself

Page 49: Einführung in Cucumber mit Rails

Mit Background

Background: Given the following travels | title | price | | New York | 2137.40 | | San Francisco | 2137.40 | ...Scenario: booking a Travel...

Scenario: booking a Travel for less than 2000...

Page 50: Einführung in Cucumber mit Rails

Step Definition

Given /̂ the following travels$/ do |travels| Travel.create(travels.hashes)end

travels.class == Cucumber::Ast::Tabletravels.hashes ==[ {:title => “New York”, :price => 2137.40}, {:title => “San Francisco”, :price => 2137.40},]

Page 51: Einführung in Cucumber mit Rails

Scenario Outlines

Page 52: Einführung in Cucumber mit Rails

Ohne Scenario OutlineScenario: login with correct user/password Given a User “hans” with password “geheim” When I visit the login-page And I fill in “username” with “hans” And I fill in “password” with “geheim” Then I should see “Login erfolgreich”

Scenario: login with wrong password Given a User “hans” with password “geheim” When I visit the login-page And I fill in “username” with “hans” And I fill in “password” with “blub” Then I should see “Login fehlgeschlagen”

Page 53: Einführung in Cucumber mit Rails

Don’t repeat yourself

Page 54: Einführung in Cucumber mit Rails

Mit Scenario Outline

Scenario Outline: login Given a User “hans” with password “geheim” When I visit the login-page And I fill in “username” with <username> And I fill in “password” with <password> Then I should see <response>

Examples: | username | password | response | | hans | geheim | Login erfolgreich | | hans | blub | Login fehlgeschlagen |

Page 55: Einführung in Cucumber mit Rails

Tags

Page 56: Einführung in Cucumber mit Rails

@iteration2 Scenario: booking a Travel Given a travel “New York” for 2137.40 And a travel “San Francisco” for 2137.40 And a travel “Las Vegas” for 1134.40 .... Scenario: booking a Travel for less than 2000 Given a travel “New York” for 2137.40 And a travel “San Francisco” for 2137.40 And a travel “Las Vegas” for 1134.40 ....

Page 57: Einführung in Cucumber mit Rails

Aufruf

# Alle Szenarien ausführen mit dem Tag “iteration2”cucumber - - tags iteration2 features/booking.feature

# Alle Szenarien ausführen ohne den Tag “iteration2”cucumber --tags ~iteration2 features/booking.feature

Page 58: Einführung in Cucumber mit Rails

Cucumber installieren und konfigurieren

Page 59: Einführung in Cucumber mit Rails

Installation

[sudo] gem install rspec rspec-rails cucumber webrat

Gems installieren:

script/generate cucumber

Verzeichnisse und Konfigurationsdateien generieren

Page 60: Einführung in Cucumber mit Rails
Page 61: Einführung in Cucumber mit Rails

Ausführen von Cucumber

rake features

Alle Features ausführen (mit rake)

cucumber features/booking.feature

Einzelnes Feature ausführen:

cucumber features/booking.feature:24

Einzelnes Szenario ausführen:

cucumber features # vorher ggf. rake db:test:prepare

Alle Features ausführen (ohne rake)

Page 62: Einführung in Cucumber mit Rails
Page 63: Einführung in Cucumber mit Rails

Demo

Page 64: Einführung in Cucumber mit Rails

Links

Page 68: Einführung in Cucumber mit Rails

Download der Präsentationhttp://devteam.sales-lentz.lu

Follow us on twitter:

https://twitter.com/HusseinMorsy

https://twitter.com/ajnato