Slide 1

Slide 1 text

Retour d’expérience Tests fonctionnels

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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 ?

Slide 9

Slide 9 text

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 ?

Slide 10

Slide 10 text

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 ?

Slide 11

Slide 11 text

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 ?

Slide 12

Slide 12 text

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é

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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”

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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 ?

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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)

Slide 24

Slide 24 text

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é)

Slide 25

Slide 25 text

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)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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….

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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 ...

Slide 30

Slide 30 text

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 ?

Slide 31

Slide 31 text

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 ;)

Slide 32

Slide 32 text

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