Ce titre est un peu trompeur car il s’agit en fait d’accélérer le chargement de certaines fixtures, mais c’est bien au niveau de la vitesse d’exécution des tests que les gains se sentiront le plus.
Introduction
Les tests fonctionnels et leurs fixtures sont relativement simples et rapides à écrire avec l’écosystème Symfony : Doctrine Data Fixtures, LiipFunctionalTestBundle, Alice, Faker…
Problème
Si vous avez choisi de hasher le mot de passe de vos utilisateurs avec Bcrypt (qui l’encodeur recommandé par Symfony) il est possible que l’exécution de votre suite de tests soit anormalement lente. Bcrypt est lent par nature et par design, cela permet notamment de limiter les attaques de type brute-force.
Ainsi plus vous avez de fixtures utilisateur de votre site, plus le temps consacré à l’exécution de la fonction de hashage du mot de passe augmente et la durée de vos tests avec. Multipliez ce temps par le nombre de chargement de ces fixtures (souvent avant chaque test) et imaginez (ou constatez) le résultat…
Solution
Une astuce simple pour accélérer l’exécution de votre suite consiste à utiliser un encodeur beaucoup moins coûteux en temps en environnement de test (plaintext par exemple).
Ajoutez les lignes suivantes en bas de votre fichier app/config/config_test.yml :
#config_test.yml
#...
security:
encoders:
AppBundle\Entity\User: plaintext
Conclusion
Les gains sont évidemment variables selon les projets mais sur un petit projet utilisant LiipFunctionalTestBundle pour charger les fixtures à chaque test la différence est flagrante : 2 minutes 55 secondes avant / 1 minute 32 secondes après avec cette simple manipulation.
Note : N’utilisez jamais plaintext en production ! Uniquement en environnement de test et si les performances en pâtissent.