Créer des fixtures pour faciliter les tests

Assurance qualité avec de données de tests ou fixtures

Les fixtures ou données de tests permettent au développeur d’initialiser les données de la base de données dans un état connu. Par exemple, pour l’entité User, il serait possible de charger plusieurs utilisateurs avec différents rôles et caractéristiques. On pourrait créer un administrateur, un utilisateur standard et un utilisateur avec un accès désactivé. Par la suite, il serait possible d’écrire des tests fonctionnels afin de vérifier que notre page d’authentification (login) fonctionne bien avec tous ces types d’utilisateurs.

Dans bien des cas, il faudra recharger les fixtures entre chaque test. De cette manière, les effets de bord seront évités. Un état stable et connu sera initialisé entre chaque test.

Avec Symfony et Doctrine, il est facile de mettre en place des fixtures. Les fixtures héritent de la classe AbstractFixture et sont déposées dans le dossier /DataFixtures/ORM. Si l’ordre de chargement des fixtures est important, il est aussi possible d’implémenter l’interface OrderedFixtureInterface.

Configuration du bundle DoctrineFixturesBundle

Avant de faciliter la gestion des fixtures, il est conseillé de mettre en place le DoctrineFixturesBundle. Voici la procédure à suivre :

Exemple de fixture pour Doctrine et Symfony

Le code suivant présente une classe qui permet de charger des entités Cegep dans la base de données.

On débute par définir l’espace de nom (namespace), par la suite, on indique les classes à charger avec le mot clé use, finalement, la classe est définie. Cette classe doit hériter de AbstractFixture et fournir une méthode load. C’est dans la méthode load que les entités seront créées et sauvegardées vers la base de données.

Si plusieurs classes de fixtures sont nécessaires, il sera peut-être important de définir l’ordre de chargement (créer les utilisateurs avant de créer les commentaires associés à ces utilisateurs). L’interface OrderedFixtureInterface vous obligera à définir la méthode getOrder qui devra retourner l’ordre de chargement de votre classe.

/src/Acme/Bundle/ApiBundle/DataFixtures/ORM/LoadCegepData.php

addReference et getReference

La méthode addReference permet au développeur de sauvegarder une référence vers une entité. Par exemple, on sauvegarde une référence d’un utilisateur lors de sa création et on utilise cette référence lors de la création d’un commentaire pour cet utilisateur :

persist et flush

La méthode load nous donne accès à un objet de type ObjectManager. Cet objet permet de sauvegarder nos entités vers la base de données.

La méthode persist indique à Doctrine que l’entité devra être sauvegardée.

La méthode flush sauvegarde toutes les entités marquées pour la sauvegarde avec persist.
C’est lors du flush que les requêtes SQL sont lancées.

Chargement des fixtures

Pour réinitialiser la base de données avec les données de vos fixtures, vous pouvez lancer la commande fixture:load :

 

Prochaine étape

Comments

comments

0 réponses

Répondre

Want to join the discussion?
Feel free to contribute!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *