On vous demande pour la 3459eme fois de tester votre application web. Vous entendez déjà votre patron “Pourtant quand j’appuie sur SAVE, ça devrait sauvegarder ! C’est si dûr que ça ? Hein ? Non mais ! Jte paye a faire quoi ?!? A écrire des billets débiles pendant tes pauses sur ton blog ?!?”
On sent le vécu hein ?
. Non bon serieusement, on va essayer de rendre ça “FUN” avec un cocombre et un renard de feux. Déjà on va définir notre vocabulaire.
Et si comme Dave Hoover, on combine les 2, ça donne quoi ?
Simple. Après avoir installé gem (le systeme de packaging de ruby) on tape
gem install cucumber gem install firewatir
Vous aurez aussi besoin d’un petit plugin firefox disponible ici
On nomme les test de cucumber “feature”. La syntaxe d’une feature de cucumber est assez libre mais se base essentiellemet sur 3 mots clé “When”, “Given” et “Then”. On peut assimiler ça a “Hypothèse, developpement et conclusion”.
Ici j’utilise Cucumber en anglais (car les clients que l’on a sont essentiellement anglais) mais il existe une version française de cucumber.
Feature: "lab" section Menu In order to ensure that the lab menu Verify that the "lab" menu entry exist on lo2k websites Scenario: Check if "lab" menu exist Given I am on website "http://www.lo2k.net" Then "lab" is present in the menu
Voici le contenu du fichier “lab.feature”
Si je lance cucumber avec la commande “cucumber lab.feature” j’ai le resultat suivant.
Feature: "lab" section Menu # features/lab.feature
In order to ensure that the lab menu
Verify that the "lab" menu entry exist on lo2k websites
Scenario: Check if "lab" menu exist # features/lab.feature:5
Given I'm on website "http://www.lo2k.net" # features/lab.feature:6
Then "lab" is present in the menu # features/lab.feature:7
1 scenario
2 steps pending (2 with no step definition)
You can use these snippets to implement pending steps which have no step definit
ion:
Given /^I am on website "http:\/\/www\.lo2k\.net"$/ do
end
Then /^"lab" is present in the menu$/ do
end
Sympa, il me definie des templates pour mes “steps”. Comme vous pouvez le voir, les steps sont definis par des expressions regulières. COOL !!! On va donc ecrire nos “steps” dans un repertoire que nous allons nommer “step_definitions”.
Nous allons a l’interieur nous constituer une “bibliotheque” de “step”. Peut importe le nom du fichier ici.
Je définis donc un fichier “bootstrap.rb”
#Include the FireWatir file. require 'firewatir' #include the FireWatir Module. include FireWatir Before do @browser = Firefox.new end After do @browser.close end
Puis mes steps.
Given /^I am on website "(.*)"$/ do |url| @browser.goto(url) end Then /^"(.*)" is present in the menu$/ do |menu| @browser.link( :text, 'lab').exists? end
J’ai profité ici de redefinir avec des parenthèses les elements succeptible de changer.
Bingo, le scenario passe sans aucun soucis
Maintenant je peux réecrire mon script comme suit.
Feature: "lab" section Menu In order to ensure that the lab menu Verify that the "lab" menu entry exist on lo2k websites Scenario: Check if "lab" menu exist Given I am on website "http://www.lo2k.net" Then "lab" is present in the menu And "timeline" is present in the menu
Et avoir le resultat directement car ayant définis un pattern qui match, il ne me demande même pas de réecrire un bout de code
Feature: "lab" section Menu # features/lab.feature
In order to ensure that the lab menu
Verify that the "lab" menu entry exist on lo2k websites
Scenario: Check if "lab" menu exist # features/lab.feature:5
Given I am on website "http://www.lo2k.net" # features/step_definitions/step1.rb:27
Then "lab" is present in the menu # features/step_definitions/step1.rb:31
And "timeline" is present in the menu # features/step_definitions/step1.rb:31
1 scenario
3 steps passed
Vous remarquerez déjà quelques erreurs dans mon test que j’ai fait précipitement.
Vous pouvez facilement mettre des informations dans des champs, simuler des clicks sur des boutons. Voici un exemple de code ci dessous.
When /^with password "(.*)"$/ do |password| @browser.text_field(:name,"passw").set(password) end Given /^I press the "(.*)" button$/ do |button_name| @browser.button(:value,button_name).click end
Watir est assez exhaustif et montre une flexibilité très interessante qui couvre la plupart des cas, vous n’aurez pas trop de soucis a lui faire ce que vous voulez.
Enfin quelque chose de clair a montrer a votre client et quelque chose d’assez simple a mettre en place.
Quelques idées en vrac que j’ai dans mon cerveau bouillonant:
Enfin bref… ya du “potentiel” (et du boulot)
.
1 réponse sur “Faire des tests unitaires FUN avec Cucumber et Watir”
Par nathalie le 10/03/2009
n hesitez pas a vous equiper d un lexique wow, j ai du maal a comprendre, j avoue en tout cas merci pour ce billlet interessant ! c ets toujours sympathique de paqser sur ce blog