[Formation NOOB] Tester sans se faire détester

Vous avez lu notre article  « Débugger sans peine » et maintenant vous souhaitez passer à votre phase de test ?
Dans cette vidéo vous apprendrez pourquoi et quand tester votre application, vous découvrirez également ce qu’est un test unitaire et ce qu’il implique. 

POURQUOI TESTER ?

Tout projet web est découpé en différentes étapes :

  1. Phase de développement
  2. Phase de test
  3. Phase de livraison

Lors de la phase de développement, vous pouvez être amené à opérer des changements majeurs : mise à jour de plugins, injections SQL, ajout de nouveaux champs à un formulaire, etc.
En théorie, 50% de votre temps devrait être alloué à re-tester la totalité de votre application et vérifier que tout fonctionne. Pourtant, en qualité de chef de projet junior, vous avez tendance à vous reposer sur votre lead développeur pour tester l’application, et en phase de recette vous vous dites que c’est le client qui doit tester la totalité de l’application.
N’oubliez pas qu’une recette avec des centaines de bugs – qui auraient pu être détectés au développement – est une recette longue et fastidieuse, pouvant mettre votre projet en péril !

TEST UNITAIRE : S’EVITER UNE RECETTE FASTIDIEUSE

Lire et comprendre une merge request n’est pas chose évidente…  C’est là que le test unitaire va vous aider. Il va vous permettre :

  • De tester la totalité de votre application pendant que vous développez et ce à n’importe quel moment,
  • D’assurer tous les comportements attendus depuis le début de l’application,
  • De réduire le cycle de test, particulièrement la phase de recette
  • De tester les cas qui n’arrivent jamais

Il permet aussi de réaliser un test manuel sur un comportement en particulier, toutefois vous devez connaitre à l’avance le comportement de l’objet, et non son fonctionnement !
L’injection de dépendance va fortement nous aider car il nous permet de mettre facilement en œuvre les tests unitaires.Vous devez donc éviter les factories et les singletons qui vont vous compliquer la tâche.
En effet, l’idéal est de tester un seul et unique comportement : chaque test unitaire doit pouvoir être exécuté seul.

ORIENTER SON DEVELOPPEMENT

Le « Test Driven Development » ou développement orienté par le comportement attendu, ne suit plus une logique algorithmique mais une logique de comportement.
Par exemple, si vous avez des objets à ordonner comme des contrats avec plusieurs gestionnaires et que vous avez réalisé un arbre de conditions, l’idéal est de coder tous vos tests à l’avance avant de développer pas à pas votre application.
En travaillant dans ce sens, vous aurez peu de chance d’avoir des erreurs ! En effet, si vous vous trompez dans votre code et inversez deux conditions, alors votre test ne passera plus.

L’EXEMPLE DE PHP UNIT

De nombreux outils existent pour vous aider, c’est le cas de PHPUnit qui est un framework qui vous permet d’implémenter des tests de régression, en vérifiant que les exécutions correspondent aux assertions prédéfinies.
Pour l’installer, vous pouvez utiliser le gestionnaire de paquets « Composer », il vous suffit de taper la commande « composer require phpunit/phpunit –dev ».
L’avantage, c’est que vous pouvez installer PHPUnit dans votre intégration continue comme Gitlab : quand vous envoyez votre code, celui-ci lancera automatiquement sa validation.
Exemple de test :

PhpUnit, comme la majorité des frameworks de test, utilise les assertions pour contrôler un résultat.
PHP unit assertion
Il est important de toujours utiliser l’assertion du même type que le résultat attendu, afin d’avoir un une erreur cohérente et compréhensible si celle-ci se produit.

Jeu de données
Si vous avez plusieurs jeux de données à tester pour une même fonction, il est possible d’utiliser des providers qui permettent d’écrire simplement un test avec un jeu de données multiples :

Vous ne devez pas tester plusieurs comportements dans un seul test, car vous devez garder une visibilité la plus unitaire possible, néanmoins vous pouvez lier vos tests :
Avec la règle @depends vous pouvez créer une fonction qui dépend d’une autre, toutefois cela complexifie votre test et reste à éviter au maximum !

Vous pouvez également faire des Mocks, qui vont vous permettre de simuler une base de donner derrière votre test.

Exemple Mocks
Par exemple avec prophesize, celui-ci permet de donner une valeur de retour à une fonction.
Dans l’exemple nous allons donner une valeur à la fonction getCode.
Nous pourrons donc totalement faire abstraction de la base de données.

Pour conclure, les tests unitaires sont plus qu’utiles pour contrôler la pérennité de votre projet et éviter au maximum les régressions de code. Il n’est pas demandé d’avoir un test unitaire sur chaque petite fonction du code (sauf dans le cas d’un paquet open source ou public), mais sur les zones compliquées.
Les tests vous sécuriseront aussi s’il y a d’autres intervenants que vous, car vous pourrez identifier plus rapidement les erreurs et cela avant votre client.
Tout le monde est gagnant, vous car vous sécurisez votre code et votre client qui a une application plus stable.

Optimiser son site web

Amazon indique que si le temps de chargement de la page augmente de 0,1 seconde, les ventes chutent de 1%. Vous qui n’avez pas optimisé votre site, IMAGINEZ CE QUE VOUS PERDEZ !

Pour une fois, arrêtez de vous demander si vous transformerez mieux en utilisant un bouton rouge pâle ou orange foncé, lancez-vous plutôt dans l’optimisation technique de votre site !

Voici une check-list simple ainsi que des explications pour optimiser votre site :

1.  RÉDUIRE LE NOMBRE DE FICHIERS

  • Limiter le nombre de fichiers CSS et JS : il est possible de regrouper les fichiers CSS ou JS en un seul.
  • Regrouper les images – Sprite : il s’agit ici de regrouper les images qui sont fréquemment utiliseés dans le site en une seule. Cette technique s’appelle « Sprite ». En revanche, il faudra, via une feuille de style, afficher l’image en background et la positionner.

2. RÉDUIRE LA TAILLE DES FICHIERS

  • Réduire la taille des images : il est préférable de réduire la taille des images ou d’utiliser des mécanismes automatiques de mise à l’échelle. Des outils en ligne permettent de compresser un peu plus vos images sans détériorer la qualité (par exemple www.smushit.com).
  • Limiter le poids des fichiers – Compression Gzip : les fichiers Html, Css et Javascript sont des fichiers texte. Ils sont donc particulièrement adaptés à une compression ZIP importante. Le temps nécessaire à cette décompression est négligeable pour le visiteur.
  • Limiter le poids des fichiers – Minimify : une autre possibilité pour limiter le poids de vos fichiers CSS et JavaScript est de les minimiser. La minimisation supprime les retours à la ligne, les tabulations ainsi que les commentaires. La plupart des bibliothèques Javascript sont disponibles en version « minimisée ».

3. … ET NE RIEN ENVOYER DU TOUT !

  • Date d’expiration d’une ressource : il existe, pour le serveur Apache, le mod_expire. Il ajoute un en‐tête HTTP «Expires» qui indique la date d’expiration d’une ressource au navigateur. Tant que cette date n’est pas atteinte, le navigateur utilisera directement les données qu’il a en cache. Il n’y a donc plus aucun temps d’attente. La stratégie la plus efficace est donc de mettre une durée de vie illimitée et de renommer la ressource lorsqu’elle est modifiée.
  • Gestion Etag : Par défaut, la balise HTTP ETag (entity tag) est activée, elle permet de ne pas télécharger 2 fois les mêmes fichiers. Chaque ressource statique (image, Css, Js…) possède un identifiant unique pour une date de modification donnée. Ainsi, lors d’un second chargement de la page, le navigateur enverra l’ETag au serveur qui répondra soit par un code 302 Found (trouvé donc non modifié) soit par un 200 OK (envoi du fichier). Ce système n’évite pas les allers‐retours client‐serveur mais il évite de renvoyer le contenu des fichiers, donc réduit la consommation de bande passante ainsi que les traitements effectués par le serveur.

ATTENTION : Si vous avez une architecture avec plusieurs serveurs, vous devez utiliser cette option avec précaution. Dans ce cas, l’Etag est différent pour chaque serveur. Il est possible que cette balise augmente la bande passante plutôt que la réduise. C’est pourquoi certains outils de mesures vous conseillent de la désactiver.