Tests Interfaces Web avec Rails

Preview:

DESCRIPTION

Presentation made a Paris on Rails 2008 about User Acceptance Testing with cucumber + webrat & selenium

Citation preview

Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

http://www.21croissants.com

Les Tests d'Interface Web avec Rails

PARIS ON RAILS – 1er Décembre 2008

2

3

Tests unitairesVues, Helpers, js

4Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

test/functional/assert_selectassert_select_RJS

specs/helpersspec/views

OU

Test::Unit

RSpec

2 frameworks de test:

5Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

RSpec minimaliste des Vues

describe "/events/show" do

before(:each) do @event = stub_event_in_barcelona assigns[:event] = @event render('/events/show') end

it "should render correctly an event" do response.should include_text( @event.name ) end

end

6Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

TDD javascript avec ScrewUnit

/!\ Ne pas tester jQuery ou Prototype /!\

http://pivotallabs.com/users/nick/blog/articles/447-screw-unit-0-3

script/plugin install git://github.com/pivotal/screw-unit-server.git

7Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

// RAILS_ROOT/public/javascripts/application.jsrequire("/implementations/application");

Screw.Unit(function() { describe('HelloWorldExampleClass', function() { var hello; describe('#helloWorld', function() { describe('when running ...', function() { before(function() { hello = new HelloWorldExample({}); }); it("should say 'Hello World!'", function() { expect(hello.sayHelloWorld()).to(equal,"Hello World!"); }); }); ...

8Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

script/screw_unit_server http://0.0.0.0:8080/specs

Onclick: lance le test

9

Tests Acceptance Utilisateur avec cucumber

http://github.com/aslakhellesoy/cucumber/wikis/ruby-on-rails

10

Fonctionnalités utilisées

Source:Aslak HellesøyCHAOS report

11

Origine des erreurs

Source:Aslak HellesøyCHAOS report

12Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Août 2008 : cucumber

Aslak Hellesøy

Fonctionnalité.txt

+ cucumber= Spec exécutable

13

Le dernier joujou des alpha geeks?

14

Fonctionnalité: Addition

Afin de financer mon bonus avec l'argent des pigeons

En tant que trader Je souhaite pouvoir additionner 2 chiffres

Valeur

Rôle

Fonctionnalité

/features/calculatrice.feature

15Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Scénario: Addition de produits dérivés

Étant donné que je tape 55000000000000

Et que je tape 2

Lorsque je tape additionner

Alors le résultat doit être 5500000000002

GIVEN: contexte, pré-conditions

GIVEN

16Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Scénario: Addition de produits dérivés

Étant donné que je tape 55000000000000

Et que je tape 2

Lorsque je tape additionner

Alors le résultat doit être 5500000000002

WHEN: événement, action

WHEN

17Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Boulot du développeur

Aider le client à rédiger des critères d'acceptance

Ecrire le code ruby de chaque « step » pour que les fonctionnalités soient exécutées

18Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Scénario: Addition de produits dérivés

Étant donné que je tape 55000000000000

Et que je tape 2

Lorsque je tape additionner

Alors le résultat doit être 5500000000002

THEN: résultat, post-conditions

THEN

19Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Before do @calc = Calcu lat r i ce .newend

# Etant donné que je tape / Et que je tapeGiven /que je tape (\d+)/ do |n| @calc.push n.to_iend

# Lorsque je tape additionnerWhen 'je tape additionner' do @result = @calc.additionnerend

# Alors le résultat doit être ...Then /le résultat doit être (\d*)/ do |expected| @result.should == expected.to_iend

/features/step_definitions/calculatrice.rb

20Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Exécution: rake features

21Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Documentation à jour + exécutable

22Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Le format de Tables à la FIT

Etant donné que je tape 2

Et que je tape 1

Lorsque je tape additionner

Alors le résultat doit être 3

Plus d'exemples:

| a | b | somme |

| 2 | 2 | 4 |

| 2 | 3 | 5 |

23Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

rake features

24

Tests AcceptanceUtilisateur

avec cucumber + webrathttp://github.com/brynary/webrat

25Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Web Application Ruby Acceptance Testing

26Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Cucumber /features/step_definitions/common_webrat_steps .fr

Given /^que je suis dans la page de "(.*)"$/ do |url| visits urlend

When /^je tape "(.*)" dans le champ "(.*)"$/ do |value, field| fills_in(field, :with => value)end

When /^je clique sur le bouton "(.*)"$/ do |button| clicks_button(button)end

Then /^je devrais voir le texte "(.*)"$/ do |text| response_body.should contain(text)end

27Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Limitation de Webrat::RailsSession

« simule » le butineur, pas de render de la page

=> Rapide :-)

=> Pas de support de javascript :-(

28Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Webrat::CeleritySession

1.1.4 et 6 ou

Basé sur la librarie java HtmlUnit jgem install celerity + toutes tes gems du

projet jruby -S rake features

Prototype Ajax.update ne fonctionne pas :-(

29Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Webrat::SeleniumSession rocks!

Vidéo Selenium User group (fev 2008) http://www.youtube.com/watch?v=EDb8yOM3Vpw

« Fermes » selenium de google:

50 équipes & 51 000 tests Phillipe Hanrigou:

gem install selenium-client Voir les /examples/ruby de

30

Tester Ajaxavec cucumber + webrat +

seleniumhttp://github.com/ph7/selenium-client/

31Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

La newsletter de lecool

32Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Fonctionnalité: Programmation d'une journée de la newsletter Afin de gagner du temps dans la programmation de la Newsletter En tant qu'éditeur de lecool, je souhaite pouvoir changer l'ordre des événements par glisser-déposer

Scénario: Etant donné que je suis logged in en tant qu'administrateur Lorsque j'édite la newsletter "Barcelona Selected * 256" Et que je clique sur l'événement "Los buenos muñecos viven para siempre" pour le déposer sur l'événement "La Leyenda de Los Planetas" Alors l'évenement "Los buenos muñecos viven para siempre" devrait être en position 2

33Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

# Etant donné que je suis logged in en tant qu'administrateurGiven /que je suis logged in en tant qu'administrateur/ do user = User.find_by_nickname(...) visits "/admin/login" fills_in("Email", :with => "jm@lecool.com") fills_in("Password", :with => "12345678") clicks_button("Sign in")end

Log:

34Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

# Lorsque j'édite la newsletter "Barcelona Selected * 256"When /^j'édite la newsletter "(.*)"$/ do |name| @newsletter = News le t ter.find_by_title(name) visits"/admin/newsletters/#{@newsletter.id}/edit_newsletter"end

35Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

# Et que je clique sur l'évenement "Los buenos muñecos viven parasiempre" pour le déposer sur l'évenement "La Leyenda de Los Planetas"

When /^que je clique sur l'évenement "(.*)" pour ledéposer sur l'évenement "(.*)"/ do |from_event_name,to_event_name| drag_and_drop_to_object xpath_event(from_event_name),

xpath_event(to_event_name) wait_for_ajaxend

36Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

# Alors l'évenement "Los buenos muñecos viven para siempre"devrait être en position 2

Then /^l'évenement "(.*)" devrait être en position(\d+)/ do |event_name, position| Event.find_by_name(event_name).position_in_newsletter.should == position.to_iend

37Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Fonctionnalité: Google map

Afin de pouvoir trouver plus facilement le lieu de l'événement En tant que lecteur de lecool, je souhaite pouvoir visualiser une google map Scénario: Voir la carte d'un événement

Etant donné que je suis dans la page de "/cities/barcelona/" Lorsque je clique sur "VIEW MAP" de l'événement "Lube Magazine" Et que je clique sur l'icône de l'événement Alors je devrais voir le texte "Barcelona"

38Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

# Etant donné que je suis dans la page de "/cities/barcelona"Given /^que je suis dans la page de "(.*)"$/ do |url| visits urlend

CENSURE!

39Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Lorsque je clique sur "VIEW MAP" de l'événement "Lube Magazine"

When /^je clique sur "VIEW MAP" de l'évenement"(.*)"/ do|event_name| event =Event.find_by_name(event_name) clicks "//a[@id=view_map-#{event_id}']" wait_for_ajax end

40

# Et que je clique sur l'icône de l'événementWhen /^que je clique sur l'icône de l'évenement$/ do clicks "mtgt_unnamed_0" # google map iconend

41Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Selenium IDE à la rescousse

42Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Ouvre l'éditeur / Debugging

Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Intégration Continue

http://cruisecontrolrb.thoughtworks.com

cruise add <name> -u <url>cruise start

Hudson http://blog.huikau.com/2008/01/09/jruby-ruby-continuous-integration-with-hudson/

44Paris On Rail 2008 – Copyright (c) Garnier Jean-Michel. Licence: Creative Commons.

Merci de votre attention!

Questions - Réponses

Recommended