Accélerez facilement vos tests fonctionnels Symfony

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.

Partagez cet article