Les meilleures pratiques pour la base de données de tests avec PHPUnit
PHPUnit
's propre manuel a certains comme-encore-non écrite sections intitulé "exploitation" et les "Tests de bases de données des Meilleures Pratiques."
Quelles sont les meilleures pratiques pour l'essai d'une base de données avec PHPUnit
, en particulier dans MySQL
?
- double possible de Ce sont des standards et des meilleures pratiques pour la création de tests unitaires pour les fonctionnalités à l'aide des bases de données?
- Gordon, j'ai vraiment écrit cette question spécifiquement parce que les réponses ne semblent pas aller dans beaucoup de profondeur, ni la
PHPUnit
chapitre sur les tests de bases de données référencé il. J'aimerais en voir plus sur cette. - Pour mettre les choses au clair : vous disposez d'une fonction de l'exécution de certaines requêtes (ou requêtes) sur une base de données basée sur une entrée. Cela renvoie un résultat, et maintenant vous voulez vérifier si ce résultat est ce que vous attendez? Si oui : puis, à partir d'un état connu (où vous savez aussi ce que le résultat devrait être le cas) serait un bon début (et c'est ce qu'ils font tous référence à la double question). Il suffit de restaurer cet état connu sur chaque série de tests.
- Êtes-vous désireux de savoir comment faire des "tests fonctionnels" avec PHPUnit?
- c'est essentiellement ce que j'ai fait, mais aucune idée si je suis en train de faire presque aussi bien que je devrais être. J'ai essentiellement exécuter
mysqldump
sur untestdb
, puis exécutezmysql
manuellement pour restaurertestdb
dans le même état sur le serveur de build, ainsi. Est-il possible que je devrais être en indiquant dans mes tests, cependant, que l'état est censé être? Et est-il plus automatisé façon de le faire que de l'exécution manuellemysqldump
à chaque fois? - un peu, bien que la majeure partie de l'application est constitué d'interactions avec
MySQL
, ce qui signifie que je serais encore personnellement considérer ces tests unitaires.
Vous devez vous connecter pour publier un commentaire.
Quand je fais de la base de données de tests avec PHPUnit je charge mon dump MySQL au début de la première suite, qui contient toute l'information que je suppose être vrai dans tous les tests. Lors de chaque test commence, je utiliser un setupDatabase méthode. Cette méthode supprime toutes les lignes dans les tables que je connais ont changé puis il charge d'une télévision dataset XML contenant les données que j'ai besoin de vrai. Après ceci est fait, je exécuter n'importe quel code je suis en essais. Enfin, j'ai utiliser un ensemble de méthodes simples pour sélectionner les lignes à partir de la base de données pour faire valoir les changements que j'ai faits ont été faites correctement.
Je ne dirais pas que c'est une meilleure pratique, mais l'a plutôt bien fonctionné pour moi. Les seuls problèmes que j'ai pu croiser sont d'avoir à faire un rechercher /remplacer sur les ensembles de données XML à chaque fois les modifications de schéma et de l'exécution des tests lentement, comme une conséquence de l'ensemble de la suppression et l'insertion.
Le Zend Framework est une bibliothèque intéressante pour PHPUnit qui permet de réaliser des essais de comparer une table de base de données d'une télévision dataset XML mais je n'ai pas eu la chance de l'utiliser encore.
Certains non ordonnée pensées:
Il est bon d'avoir des accessoires fixes (avec ou sans structure db), chargé en db en startUp() de chaque test. Il peut venu ie. de JSON ou XML fichiers, un pour chaque table.
Si vous le coupler avec des fonctions comme getNthFixture($sTable, $nIndex) ou countFixtures($sTable), vous pouvez facilement tester vos requêtes. Encore plus loin, vous pouvez utiliser [LINQ][1] pour obtenir les résultats attendus à partir de la configuration des lieux avec peu ou pas de différence entre les bases de données & luminaires de la requête. Je trouve qu'il est assez facile de s'adapter au début de prototypage /stade de développement, lors de la db structure est en train de changer très souvent. L'ajout d'affirmation de comparer directement LINQ résultat de la requête avec db résultat de la requête permet de créer des tests de pur plaisir 😉
Une autre conseils: db doit être réinitialisé avant chaque méthode de test, pas avant des cas de test. Idéalement, vous devez les supprimer de la base et de le reconstruire à partir de l'ensemble complet de luminaires.
Et, si vous le pouvez, essayez de faire des tests qui fonctionne avec des bases de données différentes (certaines choses, bien sûr, ne sont pas portable, mais la majorité est). Utiliser au moins sqlite côté de mysql/postgres/other_big_rdbm.
Si vous êtes un framework de test ou d'un autre système complexe, vous devriez probablement se moquer d'accès à la base de singleton. Si certains trucs codés en dur est enterré profondément dans le pas-si-souple-orm, il peut être une douleur dans le, disons, le cou.
Bonne idée est de connecter toutes les requêtes qui n'ont pas passé de test, et/ou pour les afficher dans l'échec de messages. Aussi pour db messages d'erreur. Si l'on analyse de grandes bases de données lorsque la performance est un problème, essayez de log de requêtes lentes en même temps.
Plus magique et peut-être un peu plus difficile, est d'automatiser des tests si toutes les colonnes utilisées dans où /avoir /jointures sont indexés. Est peut-être quelque chose de ce qui devrait appartenir à Articulées Php /Base de données de Code Sniffer (tm) à la place de tests unitaires, et n'est pas très simple à mettre en place, mais une fois utilisé grandement assure de la qualité du code.
Un autre bon conseil, allant de la triste expérience personnelle: toujours ajouter des tests pour veryfing les jeux de caractères, spécialement si vous travaillez avec de nombreuses langues différentes. ISO-8859-1 dans le monde est très petit 😉
[1]: http://phplinq.codeplex.com/ LINQ