La réponse courte est de Lire l'entrée Fine Manual sur les tests de base de données dans le manuel PHPUnit .
Et maintenant la longue réponse...
La première chose à retenir à propos des tests unitaires est qu'ils doivent être effectués de manière isolée de tous les autres composants. Souvent, cet objectif est simplifié à l'aide de techniques d'inversion de contrôle (IoC) comme injection de dépendance . Lorsque vos classes demandent explicitement leurs dépendances dans les méthodes du constructeur, il suffit de se moquer ces dépendances afin que vous puissiez tester le code restant de manière isolée.
Tester du code qui interagit avec des modèles est cependant un peu différent. Habituellement, il n'est ni pratique ni conseillé d'injecter vos modèles dans la classe dans laquelle vous devez y accéder. Vos modèles sont généralement des structures de données "stupides" qui exposent des capacités limitées ou inexistantes. Par conséquent, il est généralement acceptable (en termes de testabilité) d'instancier vos modèles à la volée dans vos classes autrement injectées. Malheureusement, cela rend difficile le test du code de la base de données car, comme le note la documentation de PHPUnit :
Alors, comment isoler et tester le code qui interagit avec la base de données si les modèles ne sont pas directement injectés ? La façon la plus simple de le faire est d'utiliser appareils de test .
Puisque vous utilisez certainement déjà PDO
ou une bibliothèque ORM qui s'appuie sur PDO
(n'est-ce pas ?), la configuration des appareils est aussi simple que d'ensemencer une base de données SQLite de base ou un fichier XML avec des données pour accueillir vos cas de test et d'utiliser cette connexion spéciale à la base de données lorsque vous testez le code qui interagit avec la base de données. Vous pouvez spécifier cette connexion dans votre fichier d'amorçage PHPUnit, mais il est probablement plus approprié sémantiquement de configurer un Cas de test de base de données PHPUnit
.
Les étapes des meilleures pratiques généralement acceptées pour tester le code de base de données (elles sont également reprises dans la documentation de PHPUnit sur les tests de base de données) :
- Configurer l'appareil
- Système d'exercice en cours de test
- Vérifier le résultat
- Démontage
Donc, pour résumer, tout ce que vous avez à faire est de créer un appareil de base de données "factice" et de faire interagir votre code avec ces données connues au lieu d'une base de données réelle que vous utiliseriez en production. Cette méthode vous permet d'isoler avec succès le code testé car il traite des données connues, ce qui signifie que vous pouvez faire des affirmations spécifiques/testables sur les résultats de vos opérations de base de données.
MISE À JOUR
Tout simplement parce que c'est un guide extraordinairement utile pour ce qui pas à faire dans votre code si vous souhaitez favoriser la testabilité, j'ajoute un lien vers Comment écrire du code 3v1L non testable . Il n'est pas impliqué dans les tests de base de données en particulier, mais il est néanmoins utile. Bon test !
MISE À JOUR 2
Je voulais répondre au commentaire sur le report des tests de modèle car la base de code existante n'implémente pas PDO
pour l'accès à la base de données :
Vos modèles n'ont pas besoin d'utiliser PDO pour implémenter l'extension DbUnit de PHPUnit.
Cela vous facilitera un peu la vie si vous utilisez PDO, mais vous n'êtes pas obligé de le faire. Disons, par exemple, que vous avez construit votre application avec le pg_*
intégré de PHP Fonctions PostgreSQL. PHPUnit vous permet toujours de spécifier des luminaires et il peut toujours les reconstruire pour chaque test -- vous auriez simplement besoin de pointer votre connexion lors de l'exécution de tests vers la même ressource que l'extension DbUnit utilise pour son luminaire.