Tests fonctionnels et gestion des dates

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Je travaille actuellement sur une application de gestion de prise de rendez-vous à destination des professionnels. Afin de s'assurer du fonctionnement correct de la plateforme, cette dernière est testée au travers de nombreux scénarios Behat.

L'exécution des tests Behat est relativement classique. Avant chaque scénario, un jeu de données est chargée en base de données afin de dérouler les différentes étapes. Néanmoins cette méthode présente un inconvénient majeur puisque le jeu de données est statique.

Or lorsque l'on travaille avec des gestions de date, cela peut poser quelques problèmes. Effectivement, si on prend par exemple un scénario de prise de rendez-vous en tenant compte qu'un rendez-vous ne peut pas être pris pour une date antérieure à la date du jour, il sera nécessaire de mettre régulièrement le jeu de données à jour afin d'éviter que les données de ce dernier ne soient obsolètes. La date de la machine exécutant les tests étant la date de référence.

Pour résoudre ce problème, on peut penser à plusieurs solutions. La première est certainement de générer un jeu de données dynamique afin d'avoir des données relatives à la date du jour. Je n'aime pas trop cette solution pour diverses raisons. La première car elle nécessite du développement (et que j'ai peu de temps :)). La seconde, car on "perd" un certain contrôle sur le jeu de données et les tests vont nécessiter plus de codes. Or je souhaite garder ces tests aussi simple que possible.

La seconde solution, m'ayant traversé l'idée était de modifier la date système lors de l'exécution des tests. Il ne m'a pas fallu longtemps pour me dire que c'était une très mauvaise idée !

Dans le cas présent, afin de faire le minimum de modification sur l'existant, en introduisant le minimum de développement, j'ai eu recours à une application nommée faketime.

Cette application permet d'intercepter les appels systèmes de récupération de la date et l'heure. Faketime permet ainsi de démarrer un processus en altérant de manière virtuelle la date de la machine uniquement pour le processus désigné.

Lancer l'exécution des scénarios Behat en utilisant faketime se fait au travers d'une simple ligne de commande :

faketime '2014-10-05 12:30:00' bin/behat  # Utilisation d'une date précise
faketime 'last Friday' bin/behat          # Utilisation d'une date relative