44
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 – 1 er Décembre 2008

Tests Interfaces Web avec Rails

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Tests Interfaces Web avec Rails

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

Page 2: Tests Interfaces Web avec Rails

2

Page 3: Tests Interfaces Web avec Rails

3

Tests unitairesVues, Helpers, js

Page 4: Tests Interfaces Web avec Rails

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:

Page 5: Tests Interfaces Web avec Rails

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

Page 6: Tests Interfaces Web avec Rails

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

Page 7: Tests Interfaces Web avec Rails

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!"); }); }); ...

Page 8: Tests Interfaces Web avec Rails

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

Page 9: Tests Interfaces Web avec Rails

9

Tests Acceptance Utilisateur avec cucumber

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

Page 10: Tests Interfaces Web avec Rails

10

Fonctionnalités utilisées

Source:Aslak HellesøyCHAOS report

Page 11: Tests Interfaces Web avec Rails

11

Origine des erreurs

Source:Aslak HellesøyCHAOS report

Page 12: Tests Interfaces Web avec Rails

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

Page 13: Tests Interfaces Web avec Rails

13

Le dernier joujou des alpha geeks?

Page 14: Tests Interfaces Web avec Rails

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

Page 15: Tests Interfaces Web avec Rails

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

Page 16: Tests Interfaces Web avec Rails

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

Page 17: Tests Interfaces Web avec Rails

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

Page 18: Tests Interfaces Web avec Rails

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

Page 19: Tests Interfaces Web avec Rails

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

Page 20: Tests Interfaces Web avec Rails

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

Exécution: rake features

Page 21: Tests Interfaces Web avec Rails

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

Documentation à jour + exécutable

Page 22: Tests Interfaces Web avec Rails

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 |

Page 23: Tests Interfaces Web avec Rails

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

rake features

Page 24: Tests Interfaces Web avec Rails

24

Tests AcceptanceUtilisateur

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

Page 25: Tests Interfaces Web avec Rails

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

Web Application Ruby Acceptance Testing

Page 26: Tests Interfaces Web avec Rails

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

Page 27: Tests Interfaces Web avec Rails

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 :-(

Page 28: Tests Interfaces Web avec Rails

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 :-(

Page 29: Tests Interfaces Web avec Rails

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

Page 30: Tests Interfaces Web avec Rails

30

Tester Ajaxavec cucumber + webrat +

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

Page 31: Tests Interfaces Web avec Rails

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

La newsletter de lecool

Page 32: Tests Interfaces Web avec Rails

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

Page 33: Tests Interfaces Web avec Rails

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 => "[email protected]") fills_in("Password", :with => "12345678") clicks_button("Sign in")end

Log:

Page 34: Tests Interfaces Web avec Rails

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

Page 35: Tests Interfaces Web avec Rails

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

Page 36: Tests Interfaces Web avec Rails

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

Page 37: Tests Interfaces Web avec Rails

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"

Page 38: Tests Interfaces Web avec Rails

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!

Page 39: Tests Interfaces Web avec Rails

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

Page 40: Tests Interfaces Web avec Rails

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

Page 41: Tests Interfaces Web avec Rails

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

Selenium IDE à la rescousse

Page 42: Tests Interfaces Web avec Rails

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

Ouvre l'éditeur / Debugging

Page 43: Tests Interfaces Web avec Rails

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/

Page 44: Tests Interfaces Web avec Rails

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

Merci de votre attention!

Questions - Réponses