SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
Automatiser les tests
d’acceptation :
Comment s’y prendre ?
Vincent Tencé
@testinfected
http://vtence.com
http://github.com/testinfected
Terminé ?
Livraison habituelle stress inclus
Livraison souhaitée sourire inclus
Les tests clients sont
essentiels
à une livraison réussie
Test d’acceptation de bout en bout
Persistence
Time
UserInterface
Mail
Payment
Test
Tests instables
• Échouent de façon imprévisible

• Dépendent d’un jeu unique et vivant de données de test

• Dépendent de systèmes externes hors de notre contrôle

• Gèrent mal la nature asynchrone du Web
Visez l’atomicité
• Partez d’un état initial connu minimal

• Utilisez le jeu de données minimal suffisant pour le scénario décrit

• Nettoyez avant plutôt qu’après

• Remplacez les systèmes externes par des « faux » qui sont programmables et
que vous contrôlez
Utilisez vos API
public void registerUser(String email, String password) {

HttpResponse response =
request.content(Form.urlEncoded()
.addField("email", email)

.addField("password", password)

.addField("conditions", "on"))

.post("/accounts");

// Pour améliorer le diagnostique du test

assertThat(response).hasStatusCode(303);
}

Waits
WebDriver driver = new FirefoxDriver();
driver.get(“http://some_domain/url_that_delays_login”);
WebDriverWait wait = new WebDriverWait(driver, 2, 50);
WebElement display = wait.until(presenceOfElementLocated(
By.id("some-dynamic-element")));
assertThat("display text", display.getText(), equalTo("Loaded"))
WebElement button = wait.until(elementToBeClickable(
By.id(“some-button")));
button.click();
Acceptez l’asynchronisme
BrowserDriver browser = new BrowserDriver(
new UnsynchronizedProber(2000, 50),
new FirefoxDriver());
browser.navigate().to(“http://somedomain/url_that_delays_loading");
browser.element(By.id(“some-dynamic-element")).hasText("Loaded");
browser.element(By.id(“some-button”)).click();
java.lang.AssertionError:
Tried to:
check that an element by id "some-button" is enabled
but:
it was disabled
Manque d’abstraction
DesiredCapabilities capabilities = DesiredCapabilities.firefox();

WebDriver driver = new FirefoxDriver(capabilities);



// Enter username and password

driver.findElement(By.id("username")).sendKeys("Bob");

driver.findElement(By.id("password")).sendKeys("secret");



// Click login button

driver.findElement(By.id("login")).submit();



// Wait for home page to load

WebDriverWait wait = new WebDriverWait(driver, 5000);
wait.until(ExpectedConditions.titleIs("Home"));


// Check the greeting message
String greeting = driver.findElement(By.id("greeting")).getText();

assertThat(greeting, equalTo("Welcome, Bob!"));
Trop de détails
Scenario: Successful login


Given a user "Bob" with password "secret"

And I am on the login page
# Ces lignes là vont toujours ensemble

And I fill in "Username" with "Bob"

And I fill in "Password" with "secret"
# J’ai vraiment besoin de connaître tous ces détails ?

When I press "Log In"


Then I should see "Welcome, Bob!"
Page Objects
DesiredCapabilities capabilities = DesiredCapabilities.firefox();

WebDriver driver = new FirefoxDriver(capabilities);

// Euh, vraiment ?
LogInPage loginPage = PageFactory.initElements(driver,
LogInPage.class);



// Voilà la partie intéressante
HomePage page = loginPage.loginAs("Bob", "secret");
// Et si l’affichage est asynchrone ?
assertThat(page.greetingMessage(), equalTo("Welcome, Bob!"));
Tests liés aux conditions d’acceptation
Scenario: Successful login


Given the user "Bob" has registered
When he logs in successfully
Then he should see "Welcome, Bob!"
Tests des récits utilisateurs
• Mènent à un trop grand nombre de tests

• Créent une batterie de tests difficile à maintenir

• Diminuent la valeurs des tests d’acceptation comme source de
documentation fonctionnelle

• Ne renseignent pas sur la valeur disponible aux utilisateurs
Testez les parcours utilisateurs
• Testez les interactions complètes d’un utilisateur avec le système 

en vue de l’atteinte d’un objectif donné

• Utilisez un petit nombre de tests de parcours utilisateurs seulement 

pour tester l’intégration de l’ensemble du système
Ne cherchez pas à être exhaustif
@Test

public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() {

Join registration = anonymous.signUp().as(bob());



User bob = registration.selectPayingPlan("micro")

.enterBillingDetails("5555555555554444",
"12/18",
"999");


bob.manageAccount()

.showsCurrentlyOnPlan("micro")

.seesCreditCardDetails("**** **** **** 4444", "12/18");

}

Pensez comme des utilisateurs
• Rôles : Qui ?

• Objectifs : Pour quoi ?
• Activités et tâches : Quoi ?

• Actions : Comment ?
• Évaluations : Conséquences ?
Acteurs
// Plusieurs acteurs vont collaborer
Actors actors = new Actors(config);
// Un acteur initialement anonyme, avec un rôle de visiteur

User anonymous = actors.visitor();
// Les systèmes externes aussi sont des acteurs importants

RemoteApplication api = actors.remoteApplication();

Objectifs
// Les objectifs des utilisateurs s’expriment dans les noms des
// classes de test et des scénarios de test
public class JoiningTheCommunityTest {

@Test

public void joinsToLearnMoreBySelectingAFreePlan() {
…
}
@Test

public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() {
…
}
}
Activités et tâches
// Les tâches sont groupées en activités auxquelles
// les acteurs participent
public class Join {

public Join signUp() { … }



public Join as(AccountDetails details) {
screen.enterEmail(details.email)
.enterPassword(details.password)
.acceptConditions()
.signUp();
}


public User chooseFreePlan() { … } 



public Join selectPayingPlan(String name) { … }


…
}
Actions
// Les acteurs interagissent avec des éléments de l’interface
// utilisateur pour accomplir leurs tâches
public class SignUpScreen {


public SignUpScreen enterEmail(String email) {

browser.element(
id("sign-up")).element(id("email")).type(email);
return this;
}

public SignUpScreen enterPassword(String password) {

browser.element(
id("sign-up")).element(id("password")).type(password);
return this;
}

…
}
Évaluations
// Les interactions ont des conséquences que les acteurs
// vont évaluer en posant des questions
public class BillingScreen {



public BillingScreen showsCurrentPlan(String planName) {

browser.element(By.id("plan"))
.hasText(containsStringIgnoringCase(planName));

return this;

}



public BillingScreen showsCurrentCardDetails(String description,
String validity) {

browser.element(By.id("payment"))
.hasText(containsStringIgnoringCase(description));

browser.element(By.id("payment"))
.hasText(containsStringIgnoringCase(validity));

return this;

}

}
Au final
@Test

public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() {

Join registration = anonymous.signUp().as(bob());



User bob = registration.selectPayingPlan("micro")

.enterBillingDetails("5555555555554444",
"12/18",
"999");


bob.manageAccount()

.showsCurrentlyOnPlan("micro")

.seesCreditCardDetails("**** **** **** 4444", "12/18");

}

En incluant les acteurs externes
@Test

public void joinsAndSelectsAPayingPlan() throws Exception {

Join registration = anonymous.signUp().as(bob());
paymentGateway.hasCreatedCustomerAccount(bob().email), "free");

mailServer.hasSentWelcomeEmailTo(bob().email);


User bob = registration.selectPayingPlan("micro")

.enterBillingDetails("5555555555554444",
"12/18", "999");
paymentGateway.hasCreatedCreditCard(bob().email,
"5555555555554444",
"12/18","999")

.hasUpgradedCustomerPlan(bob().email, "micro");


bob.manageAccount()

.showsCurrentlyOnPlan("micro")

.seesCreditCardDetails("**** **** **** 4444", "12/18");

}

À vous de jouer !
• Acceptez la nature asynchrone du Web

• Écrivez des tests atomiques

• Testez les parcours utilisateurs

• Pensez comme des utilisateurs
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé

Weitere ähnliche Inhalte

Andere mochten auch

Le pilotage dans les PME
Le pilotage dans les PMELe pilotage dans les PME
Le pilotage dans les PMESage france
 
Thèse de Doctorat/Phd en Science du Langage
Thèse de Doctorat/Phd en Science du LangageThèse de Doctorat/Phd en Science du Langage
Thèse de Doctorat/Phd en Science du LangageUniversité de Dschang
 
Avatar-mediation and transformation of practice in a 3D virtual world - meani...
Avatar-mediation and transformation of practice in a 3D virtual world - meani...Avatar-mediation and transformation of practice in a 3D virtual world - meani...
Avatar-mediation and transformation of practice in a 3D virtual world - meani...Marianne Riis
 
Cara lyon - Indicateurs agiles
Cara lyon - Indicateurs agilesCara lyon - Indicateurs agiles
Cara lyon - Indicateurs agilesPierre Fauvel
 
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence Introducing Spatial Coverage in a Semantic Repository Model - Phd defence
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence Camille Tardy
 
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)Les déterminants des IDE en Afrique Subsaharienne (1985-2012)
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)Université de Dschang
 
Soutenance de thèse valentin
Soutenance de thèse valentinSoutenance de thèse valentin
Soutenance de thèse valentinJérémie34
 
Soutenance de la thèse professionnelle - Inbound Marketing
Soutenance de la thèse professionnelle - Inbound MarketingSoutenance de la thèse professionnelle - Inbound Marketing
Soutenance de la thèse professionnelle - Inbound MarketingHatim Otarid
 
DevFest Nantes 2016 - Spinnaker
DevFest Nantes 2016 - SpinnakerDevFest Nantes 2016 - Spinnaker
DevFest Nantes 2016 - SpinnakerStephan Lagraulet
 
Presentation soutenance de magister en marketing de l'innovation multicanal...
Presentation   soutenance de magister en marketing de l'innovation multicanal...Presentation   soutenance de magister en marketing de l'innovation multicanal...
Presentation soutenance de magister en marketing de l'innovation multicanal...Fethi Ferhane
 
Vous pouvez ignorerr les controleurs de gestion
Vous pouvez ignorerr les controleurs de gestionVous pouvez ignorerr les controleurs de gestion
Vous pouvez ignorerr les controleurs de gestionAgileCoach.net
 
Mon 1er USER STORY MAPPING !
Mon 1er USER STORY MAPPING !Mon 1er USER STORY MAPPING !
Mon 1er USER STORY MAPPING !Oeil de Coach
 
Conférence IGL Novembre 2007
Conférence IGL Novembre 2007Conférence IGL Novembre 2007
Conférence IGL Novembre 2007stefal
 
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...Agile Montréal
 
Proyecto docente 2013 i
Proyecto docente 2013 iProyecto docente 2013 i
Proyecto docente 2013 iElena Tapias
 

Andere mochten auch (20)

Le pilotage dans les PME
Le pilotage dans les PMELe pilotage dans les PME
Le pilotage dans les PME
 
Thèse de Doctorat/Phd en Science du Langage
Thèse de Doctorat/Phd en Science du LangageThèse de Doctorat/Phd en Science du Langage
Thèse de Doctorat/Phd en Science du Langage
 
Avatar-mediation and transformation of practice in a 3D virtual world - meani...
Avatar-mediation and transformation of practice in a 3D virtual world - meani...Avatar-mediation and transformation of practice in a 3D virtual world - meani...
Avatar-mediation and transformation of practice in a 3D virtual world - meani...
 
Cara lyon - Indicateurs agiles
Cara lyon - Indicateurs agilesCara lyon - Indicateurs agiles
Cara lyon - Indicateurs agiles
 
Prasheel
PrasheelPrasheel
Prasheel
 
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence Introducing Spatial Coverage in a Semantic Repository Model - Phd defence
Introducing Spatial Coverage in a Semantic Repository Model - Phd defence
 
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)Les déterminants des IDE en Afrique Subsaharienne (1985-2012)
Les déterminants des IDE en Afrique Subsaharienne (1985-2012)
 
Tests de performances
Tests de performancesTests de performances
Tests de performances
 
Soutenance de thèse valentin
Soutenance de thèse valentinSoutenance de thèse valentin
Soutenance de thèse valentin
 
Soutenance de la thèse professionnelle - Inbound Marketing
Soutenance de la thèse professionnelle - Inbound MarketingSoutenance de la thèse professionnelle - Inbound Marketing
Soutenance de la thèse professionnelle - Inbound Marketing
 
DevFest Nantes 2016 - Spinnaker
DevFest Nantes 2016 - SpinnakerDevFest Nantes 2016 - Spinnaker
DevFest Nantes 2016 - Spinnaker
 
Order to cash Agile
Order to cash AgileOrder to cash Agile
Order to cash Agile
 
Presentation soutenance de magister en marketing de l'innovation multicanal...
Presentation   soutenance de magister en marketing de l'innovation multicanal...Presentation   soutenance de magister en marketing de l'innovation multicanal...
Presentation soutenance de magister en marketing de l'innovation multicanal...
 
Vous pouvez ignorerr les controleurs de gestion
Vous pouvez ignorerr les controleurs de gestionVous pouvez ignorerr les controleurs de gestion
Vous pouvez ignorerr les controleurs de gestion
 
Mon 1er USER STORY MAPPING !
Mon 1er USER STORY MAPPING !Mon 1er USER STORY MAPPING !
Mon 1er USER STORY MAPPING !
 
Big ben
Big benBig ben
Big ben
 
Conférence IGL Novembre 2007
Conférence IGL Novembre 2007Conférence IGL Novembre 2007
Conférence IGL Novembre 2007
 
Macbeth
MacbethMacbeth
Macbeth
 
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...
À l’assaut de votre code patrimonial “Legacy” grâce aux tests - Félix-Antoine...
 
Proyecto docente 2013 i
Proyecto docente 2013 iProyecto docente 2013 i
Proyecto docente 2013 i
 

Ähnlich wie Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé

ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowMathias Kluba
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
Devops for mobile iOS/Android
Devops for mobile iOS/AndroidDevops for mobile iOS/Android
Devops for mobile iOS/AndroidCedric Gatay
 
Déploiement automatique d'app iOS et/ou Android
Déploiement automatique d'app iOS et/ou AndroidDéploiement automatique d'app iOS et/ou Android
Déploiement automatique d'app iOS et/ou AndroidFlorian Chauveau
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expériencelouschwartz
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
Cocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaHeads France
 
Persona: un système d'identité pour le Web
Persona: un système d'identité pour le WebPersona: un système d'identité pour le Web
Persona: un système d'identité pour le WebFrancois Marier
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeadsRNS
 
On test quoi - DCLannion 2017
On test quoi - DCLannion 2017On test quoi - DCLannion 2017
On test quoi - DCLannion 2017Artusamak
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1Christophe Rochefolle
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 

Ähnlich wie Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé (20)

Living Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptxLiving Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptx
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Devops for mobile iOS/Android
Devops for mobile iOS/AndroidDevops for mobile iOS/Android
Devops for mobile iOS/Android
 
Déploiement automatique d'app iOS et/ou Android
Déploiement automatique d'app iOS et/ou AndroidDéploiement automatique d'app iOS et/ou Android
Déploiement automatique d'app iOS et/ou Android
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
Les tests en PHP
Les tests en PHPLes tests en PHP
Les tests en PHP
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Cocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitairesCocoaheads Paris Nombembre Test unitaires
Cocoaheads Paris Nombembre Test unitaires
 
Persona: un système d'identité pour le Web
Persona: un système d'identité pour le WebPersona: un système d'identité pour le Web
Persona: un système d'identité pour le Web
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Applets
AppletsApplets
Applets
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock Objects
 
On test quoi - DCLannion 2017
On test quoi - DCLannion 2017On test quoi - DCLannion 2017
On test quoi - DCLannion 2017
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Salesforce Tooling API
Salesforce Tooling APISalesforce Tooling API
Salesforce Tooling API
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 

Mehr von Agile Montréal

ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...Agile Montréal
 
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...Agile Montréal
 
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander DurATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander DurAgile Montréal
 
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...Agile Montréal
 
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...Agile Montréal
 
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...Agile Montréal
 
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...Agile Montréal
 
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...Agile Montréal
 
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...Agile Montréal
 
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...Agile Montréal
 
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...Agile Montréal
 
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...Agile Montréal
 
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi RocheATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi RocheAgile Montréal
 
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...Agile Montréal
 
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline  TissierATMTL23 - La collaboration intergénérationnelle au travail par Apolline  Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline TissierAgile Montréal
 
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl MétivierATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl MétivierAgile Montréal
 
ATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique PothierATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique PothierAgile Montréal
 
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...Agile Montréal
 
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...Agile Montréal
 
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...Agile Montréal
 

Mehr von Agile Montréal (20)

ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
ATMTL23 - L'agilité augmentée par ChatGPT: comment utiliser l'agent intellige...
 
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
ATMTL23 - How to create and elevate top talent? A cohort-based learning metho...
 
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander DurATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
ATMTL23 - TANS: there always a next sprint by Tom Siebeneicher and Sander Dur
 
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
ATMTL23 - Dépasser les frontières : Réinterpréter les Principes ISTQB avec un...
 
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
ATMTL23 - Comment mieux atteindre vos objectifs grâce à l'agilité comportemen...
 
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
ATMTL23 - Le multivers Agile - Volume 2: Odyssée vers Agiletopia par Martin L...
 
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
ATMTL23 - Créer une entreprise apprenante : Les principes de Peter Senge pour...
 
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
ATMTL23 - De la Zone de Guerre à la Zone de Cœur : Un Voyage de Résilience, d...
 
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
ATMTL23 - Réussir sa transformation agile c'est d’abord changer son état d'es...
 
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
ATMTL23 - The Happiness Blueprint: Positivity Experiments for Powerful Teamwo...
 
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
ATMTL23 - Le Developer Experience au service de la livraison en continu par A...
 
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
ATMTL23 - L'Arbre de vie - Une pratique narrative pour se réapproprier son pa...
 
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi RocheATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
ATMTL23 - Atelier PNL pour ameliorer la communication par Remi Roche
 
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
ATMTL23 - Remettre l'humain au coeur de l'agilité avec le Mind Mapping par Re...
 
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline  TissierATMTL23 - La collaboration intergénérationnelle au travail par Apolline  Tissier
ATMTL23 - La collaboration intergénérationnelle au travail par Apolline Tissier
 
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl MétivierATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
ATMTL23 - L'odysée d'un PMO vers un VMO par Elyes Dekhili et Karl Métivier
 
ATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique PothierATMTL23 - Économie coopérative et agilité par Dominique Pothier
ATMTL23 - Économie coopérative et agilité par Dominique Pothier
 
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
ATMTL23 - Agnostic Agile, un mouvement en Agilité qui respecte les bases les ...
 
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
ATMTL23 - Innovation Unleashed: Inspiring Agile Teams through Creative Thinki...
 
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
ATMTL23 - « A community of Scientists » Saisir le pouvoir du Toyota Kata pour...
 

Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé

  • 1.
  • 2. Automatiser les tests d’acceptation : Comment s’y prendre ? Vincent Tencé @testinfected http://vtence.com http://github.com/testinfected
  • 6. Les tests clients sont essentiels à une livraison réussie
  • 7. Test d’acceptation de bout en bout Persistence Time UserInterface Mail Payment Test
  • 8.
  • 9. Tests instables • Échouent de façon imprévisible • Dépendent d’un jeu unique et vivant de données de test • Dépendent de systèmes externes hors de notre contrôle • Gèrent mal la nature asynchrone du Web
  • 10. Visez l’atomicité • Partez d’un état initial connu minimal • Utilisez le jeu de données minimal suffisant pour le scénario décrit • Nettoyez avant plutôt qu’après • Remplacez les systèmes externes par des « faux » qui sont programmables et que vous contrôlez
  • 11. Utilisez vos API public void registerUser(String email, String password) {
 HttpResponse response = request.content(Form.urlEncoded() .addField("email", email)
 .addField("password", password)
 .addField("conditions", "on"))
 .post("/accounts");
 // Pour améliorer le diagnostique du test
 assertThat(response).hasStatusCode(303); }

  • 12. Waits WebDriver driver = new FirefoxDriver(); driver.get(“http://some_domain/url_that_delays_login”); WebDriverWait wait = new WebDriverWait(driver, 2, 50); WebElement display = wait.until(presenceOfElementLocated( By.id("some-dynamic-element"))); assertThat("display text", display.getText(), equalTo("Loaded")) WebElement button = wait.until(elementToBeClickable( By.id(“some-button"))); button.click();
  • 13. Acceptez l’asynchronisme BrowserDriver browser = new BrowserDriver( new UnsynchronizedProber(2000, 50), new FirefoxDriver()); browser.navigate().to(“http://somedomain/url_that_delays_loading"); browser.element(By.id(“some-dynamic-element")).hasText("Loaded"); browser.element(By.id(“some-button”)).click(); java.lang.AssertionError: Tried to: check that an element by id "some-button" is enabled but: it was disabled
  • 14. Manque d’abstraction DesiredCapabilities capabilities = DesiredCapabilities.firefox();
 WebDriver driver = new FirefoxDriver(capabilities);
 
 // Enter username and password
 driver.findElement(By.id("username")).sendKeys("Bob");
 driver.findElement(By.id("password")).sendKeys("secret");
 
 // Click login button
 driver.findElement(By.id("login")).submit();
 
 // Wait for home page to load
 WebDriverWait wait = new WebDriverWait(driver, 5000); wait.until(ExpectedConditions.titleIs("Home")); 
 // Check the greeting message String greeting = driver.findElement(By.id("greeting")).getText();
 assertThat(greeting, equalTo("Welcome, Bob!"));
  • 15. Trop de détails Scenario: Successful login 
 Given a user "Bob" with password "secret"
 And I am on the login page # Ces lignes là vont toujours ensemble
 And I fill in "Username" with "Bob"
 And I fill in "Password" with "secret" # J’ai vraiment besoin de connaître tous ces détails ?
 When I press "Log In" 
 Then I should see "Welcome, Bob!"
  • 16. Page Objects DesiredCapabilities capabilities = DesiredCapabilities.firefox();
 WebDriver driver = new FirefoxDriver(capabilities);
 // Euh, vraiment ? LogInPage loginPage = PageFactory.initElements(driver, LogInPage.class);
 
 // Voilà la partie intéressante HomePage page = loginPage.loginAs("Bob", "secret"); // Et si l’affichage est asynchrone ? assertThat(page.greetingMessage(), equalTo("Welcome, Bob!"));
  • 17. Tests liés aux conditions d’acceptation Scenario: Successful login 
 Given the user "Bob" has registered When he logs in successfully Then he should see "Welcome, Bob!"
  • 18. Tests des récits utilisateurs • Mènent à un trop grand nombre de tests • Créent une batterie de tests difficile à maintenir • Diminuent la valeurs des tests d’acceptation comme source de documentation fonctionnelle • Ne renseignent pas sur la valeur disponible aux utilisateurs
  • 19. Testez les parcours utilisateurs • Testez les interactions complètes d’un utilisateur avec le système 
 en vue de l’atteinte d’un objectif donné • Utilisez un petit nombre de tests de parcours utilisateurs seulement 
 pour tester l’intégration de l’ensemble du système
  • 20. Ne cherchez pas à être exhaustif @Test
 public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() {
 Join registration = anonymous.signUp().as(bob());
 
 User bob = registration.selectPayingPlan("micro")
 .enterBillingDetails("5555555555554444", "12/18", "999"); 
 bob.manageAccount()
 .showsCurrentlyOnPlan("micro")
 .seesCreditCardDetails("**** **** **** 4444", "12/18");
 }

  • 21. Pensez comme des utilisateurs • Rôles : Qui ? • Objectifs : Pour quoi ? • Activités et tâches : Quoi ? • Actions : Comment ? • Évaluations : Conséquences ?
  • 22. Acteurs // Plusieurs acteurs vont collaborer Actors actors = new Actors(config); // Un acteur initialement anonyme, avec un rôle de visiteur
 User anonymous = actors.visitor(); // Les systèmes externes aussi sont des acteurs importants
 RemoteApplication api = actors.remoteApplication();

  • 23. Objectifs // Les objectifs des utilisateurs s’expriment dans les noms des // classes de test et des scénarios de test public class JoiningTheCommunityTest {
 @Test
 public void joinsToLearnMoreBySelectingAFreePlan() { … } @Test
 public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() { … } }
  • 24. Activités et tâches // Les tâches sont groupées en activités auxquelles // les acteurs participent public class Join {
 public Join signUp() { … }
 
 public Join as(AccountDetails details) { screen.enterEmail(details.email) .enterPassword(details.password) .acceptConditions() .signUp(); } 
 public User chooseFreePlan() { … } 
 
 public Join selectPayingPlan(String name) { … } 
 … }
  • 25. Actions // Les acteurs interagissent avec des éléments de l’interface // utilisateur pour accomplir leurs tâches public class SignUpScreen { 
 public SignUpScreen enterEmail(String email) {
 browser.element( id("sign-up")).element(id("email")).type(email); return this; }
 public SignUpScreen enterPassword(String password) {
 browser.element( id("sign-up")).element(id("password")).type(password); return this; }
 … }
  • 26. Évaluations // Les interactions ont des conséquences que les acteurs // vont évaluer en posant des questions public class BillingScreen {
 
 public BillingScreen showsCurrentPlan(String planName) {
 browser.element(By.id("plan")) .hasText(containsStringIgnoringCase(planName));
 return this;
 }
 
 public BillingScreen showsCurrentCardDetails(String description, String validity) {
 browser.element(By.id("payment")) .hasText(containsStringIgnoringCase(description));
 browser.element(By.id("payment")) .hasText(containsStringIgnoringCase(validity));
 return this;
 }
 }
  • 27. Au final @Test
 public void joinsToGetPremiumFeaturesBySelectingAPayingPlan() {
 Join registration = anonymous.signUp().as(bob());
 
 User bob = registration.selectPayingPlan("micro")
 .enterBillingDetails("5555555555554444", "12/18", "999"); 
 bob.manageAccount()
 .showsCurrentlyOnPlan("micro")
 .seesCreditCardDetails("**** **** **** 4444", "12/18");
 }

  • 28. En incluant les acteurs externes @Test
 public void joinsAndSelectsAPayingPlan() throws Exception {
 Join registration = anonymous.signUp().as(bob()); paymentGateway.hasCreatedCustomerAccount(bob().email), "free");
 mailServer.hasSentWelcomeEmailTo(bob().email); 
 User bob = registration.selectPayingPlan("micro")
 .enterBillingDetails("5555555555554444", "12/18", "999"); paymentGateway.hasCreatedCreditCard(bob().email, "5555555555554444", "12/18","999")
 .hasUpgradedCustomerPlan(bob().email, "micro"); 
 bob.manageAccount()
 .showsCurrentlyOnPlan("micro")
 .seesCreditCardDetails("**** **** **** 4444", "12/18");
 }

  • 29. À vous de jouer ! • Acceptez la nature asynchrone du Web • Écrivez des tests atomiques • Testez les parcours utilisateurs • Pensez comme des utilisateurs