Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPForum 2014 : retour d'expérience tests fonctionnels

Marc Hugon
October 23, 2014

PHPForum 2014 : retour d'expérience tests fonctionnels

Cela fait 2 ans que Maisons du Monde travaille sur la mise en place d'une batterie de tests fonctionnels nécessaires quand on veut mettre en production des modifications sur un site e-commerce dont le chiffre d'affaire 2014 devrait atteindre les 100 millions d'euros, et qu'on souhaite que ça se passe bien... Nous vous proposons un retour d'expérience sur les outils qui ont été mis en place, les stratégies mises en oeuvre et les résultats obtenus.

Marc Hugon

October 23, 2014
Tweet

Other Decks in Programming

Transcript

  1. Retour d’expérience
    Tests fonctionnels

    View Slide

  2. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Votre conteur
    Marc Hugon
    http://fr.linkedin.com/in/marchugon/
    Directeur de projet senior
    Ex développeur
    Ex Chef de projet
    Ex Directeur technique

    View Slide

  3. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Il était une fois
    Le royaume Maisons du Monde
    www.maisonsdumonde.com
    ● Site Ecommerce, meuble et objets de décoration
    ● 11 pays, 5 langues, 3 devises
    ● Plusieurs milliers de références produits
    ● Un CA 2014 d’environ 100M Euros

    View Slide

  4. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Au début de notre histoire
    La situation était plutôt euphorique
    ● Une nouvelle équipe se montait
    ● On revoyait les bases techniques en faisant passer un
    existant en Symfony1.4
    ● On revoyait le design, l’ergonomie, les fonctionnalités
    ● Le CA était en très forte augmentation

    View Slide

  5. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Puis vinrent de véritables problèmes
    ● De gros chantiers de refonte commençaient à aboutir,
    mais…
    ● Les périodes de recette devenaient toujours plus
    chronophages, et toujours plus stressantes
    ● Le tunnel de commande finit par lâcher plusieurs
    heures
    Le royaume était en danger, il fallait agir

    View Slide

  6. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    La situation était problématique
    Mais voyons, vu qu’on fait du symfony, il doit y
    avoir plein de tests unitaires ? Hum ?
    ● Pas eu le temps de les écrire car le “time to market”
    demandé était très court
    ● L’équipe en cours de constitution n’avait pas forcément
    les connaissances nécessaires
    ● La récupération d’un “framework” pré-existant les
    rendaient complexes

    View Slide

  7. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Arriva un ingénieur qualité
    Et il décida de prendre les armes qu’il
    connaissait le mieux
    ● Son navigateur
    ● Son plugin Selenium (http://docs.seleniumhq.org/projects/ide/)
    Il commença à écrire des tests qu’il pouvait
    rejouer avant chaque mise en production

    View Slide

  8. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Des obstacles l’attendaient
    “je vais tester un scénario utilisateur simple : je me
    connecte avec un compte existant, j’ajoute un produit dans
    mon panier, et je me rends jusqu’à la page de choix du
    moyen de paiement”
    Simple, non ?
    Mais si le stock de ce produit devient épuisé ?
    On met en production ?

    View Slide

  9. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Et ce n’était pas encore gagné
    “J’ai besoin de deux produits, de types
    différents disponibles à des dates différentes
    pour vérifier le bon fonctionnement d’une règle
    liée aux livraisons”
    Euh… Ils doivent être disponibles en plus ?

    View Slide

  10. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Il fallait beaucoup de tests
    Mais… Les tests Selenium sont lourds à
    maintenir
    ● Difficile de réutiliser des bouts de test déjà écrits pour
    en créer d’autres
    ● Scripts trop liés au code HTML des pages testées. Il
    devient vite difficile de les relire et de comprendre ce
    qu’ils font, et donc ils sont complexes à maintenir
    driver.findElement(By.id("contentForm:nextPageButton")).click();.... euh… oui ?

    View Slide

  11. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Et en plus les moyens sont limités
    Il y a des tâches dont notre preux chevalier ne savait pas
    s’acquitter
    ● Est-ce que j’ai bien enregistré mon code de réduction dans ma
    commande (donc en BDD) ?
    ● Est-ce que ce code est bien dans le mail de confirmation de
    commande ?
    ● Comment tester la création d’un compte différent à chaque
    lancement du test ?
    ● Est-ce que mes tests ont leur place dans les bases de production ?

    View Slide

  12. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Le cliffhanger
    On ne peut pas s’en sortir !
    Quels sont les besoins ?
    ● Des tests compréhensibles et maintenable
    ● De la réutilisabilité
    ● La possibilité de sortir du cadre du navigateur (BDD,
    web service & co)
    ● Idéalement un outil de travail dédié

    View Slide

  13. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Nouveau héros
    Rubymine (https://www.jetbrains.com/ruby/) et
    Cucumber (http://cukes.info) répondent à nos attentes
    ● Rubymine est l’éditeur (avec des breakpoint !)
    ● Cucumber : BDD en Ruby
    ● Gherkin : permet de faciliter l’entretien, la réutilisabilité, la lisibilité
    ● Selenium pour lancer les tests
    Scenario: If I order a product in 25 EUR I should not be able to order
    Given I am on the "french" home page
    And I search for a cheap mlp available now
    And I add a product from product page to my cart and continue
    Then I should be notified that I have not met the minimum order amount
    And I should not be able to place my order

    View Slide

  14. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Nouveau champ de bataille
    Fini de tout tester en production. On crée
    quotidiennement un dump “light” de la base de
    production
    ● La base de production est quotidiennement copiée
    ● Elle est anonymisée
    ● Un script ne garde que 2 mois de données
    ● On peut l’importer en 15 minutes sur n’importe quel serveur

    View Slide

  15. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Et on fait comment ?
    On veut garder par exemple 2 mois de commandes.
    La suppression SQL est trop lente avec les contraintes d’intégrités (plusieurs
    jours d’attente). Notre recette est :
    ● Récupérer le dump SQL complet
    ● Parser ce dump ligne à ligne et le copier dans le dump “light”
    ● Ne pas copier les lignes qui ne satisfont pas notre objectif (exemple :
    commande dont la date de création est de plus de 2 mois)
    Et on fait ça en PHP en 10 minutes pour 80 Go de fichier texte

    View Slide

  16. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Elaboration de stratégies
    Comment répondre à :
    “J’ai besoin de maîtriser ma disponibilité produit”
    Ce qui, de façon plus générale revient à :
    “Comment gérer un service tiers qui contrecarre mes
    efforts”

    View Slide

  17. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Recrutement d’alliés
    Bonjour les “fakeProduct”
    ● On définit (CSV) de nouveaux produits qui vont s’ajouter au
    catalogue :
    o Le type du produit (meuble, déco)
    o Le prix
    o Sa disponibilité
    o Ses propriétés (taille / poids)
    o Et une dizaine d’autres particularités
    ● Ces produits s’ajoutent au catalogue existant (mise à jour
    quotidienne), ils sont 100% fonctionnels

    View Slide

  18. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Stratégie de contournement
    La disponibilité produit est renvoyée par l’appel à un web-
    service… sauf pour les “fakeProduct”
    if ($prod_id < 1000)
    On renvoie les mêmes données que le web-service, mais
    on choisit ces données selon ce qui a été défini dans le
    fichier initial

    View Slide

  19. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Stratégie de détournement
    Pour un test précis, on a besoin d’avoir une réponse
    précise d’un web service externe.
    • Dans le code, on checke une donnée de cookie pour y trouver l’URL
    du service à appeler. Si non trouvée, on prend celle qui est
    configurée dans l’application
    • Au lancement du test, on crée un serveur dans Cucumber
    • On renseigne l’URL créée dans le cookie
    • Il n’y a plus qu’à lancer le test, c’est notre web service qui est
    appelé, avec une réponse en dur

    View Slide

  20. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Les interfaces externes
    Encore un autre ennemi
    On peut tester le bon fonctionnement du paiement, une
    erreur de saisie et une annulation. C’est bien.
    Mais…. Comment tester le code 34 suspicion de fraude ?

    View Slide

  21. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Stratégie d’imitation
    ./make mercanet-mock
    Formulaire “maisons
    Tous les types de retour
    deviennent possibles
    Et je peux travailler sur
    l’auto response uniquement

    View Slide

  22. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Pour gagner, il faut faire des efforts
    ● 3 testeurs pour une équipe de 10 développeurs
    ● 1 devops
    ● 400 scénarios de test (feature) pour
    www.maisonsdumonde.com
    ● 2 ans de travail
    ● compatibilité phantomjs (http://phantomjs.org/) assurée pour
    diminuer le temps de build

    View Slide

  23. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Quelques gemmes précieuses
    ● Sinatra (pour simuler les web service) (http://www.sinatrarb.com/
    )
    ● Cukeforker (parallélisation des tests)
    (https://github.com/jarib/cukeforker
    )
    ● Page_object (meilleure lisibilité et réutilisabilité)
    (https://github.com/cheezy/page-object
    )
    ● Nokogiri (XML parser) (https://rubygems.org/gems/nokogiri
    )
    ● pdf_reader (https://github.com/yob/pdf-reader
    )
    expect(on_page(ContactPage).phone_numbers).to eql(number)

    View Slide

  24. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Notre armée actuelle
    ● Intégration continue avec Bamboo
    (https://www.atlassian.com/software/bamboo)
    ● 6 agents
    ● 3 agents en parallèle pour le build maisonsdumonde.com, 20
    minutes de build au minimum
    ● Environ 6 000 commandes passées en test par jour
    ● Et 3 autres applications bénéficient de tests fonctionnels (en moins
    poussé)

    View Slide

  25. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Le résultat ?
    ● 3 mises en production en moyenne par semaine (quotidiennement
    avant la campagne pub)
    ● Diminution drastique des incidents majeurs, le chemin critique est
    tout le temps fonctionnel
    ● Refonte totale du site web + mobile mis en production sans heurts
    ● On teste en permanence des événements (soldes par exemple)

    View Slide

  26. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Le résultat !

    View Slide

  27. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Alors on a gagné ?
    Oui, les testeurs sont maintenant les seuls
    responsables des mises en production, le
    marketing ne fait plus forcément de vérification,
    selon les sujets.
    Pourtant, comme dans toute bonne histoire, de
    nouveaux obstacles nous attendent….

    View Slide

  28. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Le teasing de l’épisode II
    Pour passer notre base de code symfony 1.4
    (et ex framework propriétaire) vers une base de
    code symfony 2.5, nous avons choisi de créer
    des services pour chaque nouveau
    développement
    On migre le code métier à chaque projet

    View Slide

  29. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Notre nouvelle configuration
    Pour tester www.maisonsdumonde.com, il faut
    prendre en compte
    ● Catalog-service
    ● Carrier-service
    ● User-service
    Les stratégies de contournement fonctionnent,
    mais ...

    View Slide

  30. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Trop de simulation cache la réalité
    Si l’application ne fonctionne en test qu’avec des
    web services simulés, comment éviter les
    problèmes de régression ?
    Comment gérer des tests qui ont besoin de
    nouvelles versions des web services, donc de
    branches Git spécifiques ?

    View Slide

  31. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Alors que faire ?
    C’est notre challenge en cours
    Ensuite, seulement, nous vivrons heureux….
    Ou pas ;)

    View Slide

  32. PHP Forum 2014 - Retour d’expérience tests fonctionnels
    Des questions ?
    Questions ? Merci !
    PS : vous avez vu la pub ?
    http://soyezfous-soyezvous.maisonsdumonde.com/

    View Slide