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. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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 ?
  8. 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 ?
  9. 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 ?
  10. 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 ?
  11. 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é
  12. 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
  13. 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
  14. 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
  15. 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”
  16. 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
  17. 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
  18. 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
  19. 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 ?
  20. 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
  21. 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
  22. 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)
  23. 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é)
  24. 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)
  25. 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….
  26. 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
  27. 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 ...
  28. 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 ?
  29. 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 ;)
  30. PHP Forum 2014 - Retour d’expérience tests fonctionnels Des questions

    ? Questions ? Merci ! PS : vous avez vu la pub ? http://soyezfous-soyezvous.maisonsdumonde.com/