Comment faire des tests unitaires de base de données?
-
04-10-2019 - |
Question
J'ai entendu dire que lorsque l'application de développement qui utilise une base de données que vous devez faire des tests unitaires de base de données. Quelles sont les meilleures pratiques dans les tests unitaires de base de données? Quelles sont les principales préoccupations lorsque vous faites des tests unitaires db et comment le faire « droit »?
La solution
Quelles sont les meilleures pratiques dans les tests unitaires de base de données?
Le cadre DbUnit (un framework de test permettant de mettre une base de données dans un état de connaître et d'effectuer l'affirmation contre son contenu) a une base de données recensant la page test meilleures pratiques qui, à mon expérience, sont vraies.
Quelles sont les principales préoccupations lorsque vous faites des tests unitaires db
- Création d'un schéma à ce jour, la gestion de schéma change
- Configuration des données (données de référence, les données de test) et maintenant données de test
- Tenue de tests indépendants
- Permettre aux développeurs de travailler simultanément
- Vitesse (tests impliquant la base de données sont généralement plus lents et feront prendre plus de temps toute votre construction)
et comment le faire "droit"?
a laissé entendre, suivre les bonnes pratiques connues et utiliser les outils / cadres dédiés:
- Je préfère dans la base de données de la mémoire si possible (pour la vitesse)
- Utilisez un schéma par développeur est un must (pour permettre le travail simultané)
- Utilisez un outil « migration base de données » (à la RoR) pour gérer les changements de schéma et mettre à jour un schéma vers la version finale
- Construire ou utiliser un harnais de test permettant de mettre la base de données dans un état connu avant chaque essai et d'effectuer affirme contre les données après l'exécution (ou pour exécuter des tests dans une transaction que vous rollback à la fin de l'essai).
Autres conseils
Une liste des éléments qui devraient être examinés et pris en compte lors regardant avec l'unité de base de données test
- Chaque testeur a besoin d'une base de données séparée, afin d'éviter d'interférer avec d'autres activités testeur / développeur
- Pour avoir un moyen facile de créer une base de données à tester (ce qui est lié à avoir une base de données SQL Server sous contrôle de version). Cela est particulièrement utile lorsque vous essayez de trouver ce qui a mal tourné si certains tests échouent
- Mise au point sur des domaines spécifiques et la création de tests pour un seul module au lieu de couvrir à la fois. Ajout de tests est granulairement un bon moyen d'être efficace
- Assurez-vous de fournir autant de détails que possible lorsqu'un test échoue, pour permettre un débogage plus facile
- Utilisez l'une et les mêmes données de test pour tous les tests
Si le test est mis en œuvre en utilisant le cadre tSQLt, le processus de tests unitaires pourrait être compliqué en traitant avec beaucoup de bases de données de plusieurs instances SQL Server. Afin de maintenir, exécuter et gérer des tests unitaires directement à partir de SQL Server Management Studio, ApexSQL Unité de test de la boîte être utilisé comme une solution
Jetez un oeil à ce lien . Il va sur quelques-unes des bases pour la création de tests unitaires stockés dans SQL procs serveur, ainsi que les différents types de tests unitaires et quand vous devriez les utiliser. Je ne sais pas ce que vous utilisez SGBD, mais de toute évidence cet article est orienté vers SQL Server.
Stolen de l'article:
Tests de fonction
La première et probablement la plus répandue classe de test unitaire de base de données est un test de fonctionnalité. Dans mon esprit, fonction essais tester les fonctionnalités de base API-ou, si vous voulez-de votre base de données de la base de données du point de vue du consommateur. Test de programmabilité d'une base de données objets est le scénario de ligne principale ici. Donc, tester toutes les procédures stockées, fonctions et déclencheurs dans votre base de données constituent des tests de fonctionnalité dans mon esprit. Pour tester une procédure stockée, vous exécutez la procédure stockée et vérifier que soit le prévu les résultats ont été renvoyés ou un comportement approprié a eu lieu. Cependant, vous pouvez tester plus que ces types d'objets. Vous pouvez Imaginez vouloir veiller à ce que une vue, par exemple, le retour approprié calcul à partir d'une colonne calculée. Comme vous pouvez le voir, les possibilités dans ce domaine sont grandes.
Tests de schéma
L'un des aspects les plus critiques d'un base de données est son schéma et à tester veiller à ce qu'il se comporte comme attendu est une autre classe importante base de données tests unitaires. Ici, vous voulez souvent pour faire en sorte que la vue retourne ATTENDUS ensemble de colonnes du type de données approprié dans le ordre approprié. Tu pourrais vouloir assurez-vous que votre base de données ne, en fait, contiennent les 1000 tableaux qui vous attendez.
Tests de sécurité
Dans la journée d'aujourd'hui et l'âge, la sécurité des données qui sont stockées au sein de la base de données est essentielle. Ainsi, une autre classe importante de tests unitaires de base de données sont ceux qui essai la base de données Sécurité. Ici, vous voulez veiller à ce que les utilisateurs particuliers existent dans votre base de données et qu'ils sont attribué les autorisations appropriées. Vous voulez souvent créer négatif des tests qui tentent de récupérer des données des tables ou vues restreintes et veiller à ce que l'accès est de manière appropriée refusée.
Tests d'actions de données
De nombreuses bases de données contiennent des données d'achat d'actions, ou les données de semences. Cette modification des données rarement et est souvent utilisé comme rechercher les données pour les applications ou fin utilisateurs. ZIP codes et leurs associés Les villes et les états sont de grands exemples de ce genre de données. Il est donc utile pour créer des tests pour faire en sorte que vos données de stock ne, en fait, existe dans votre base de données.
Je suis content que vous posiez de tests unitaires, et non le test en général.
Les bases de données ont de nombreuses caractéristiques qui doivent être testées. Voici quelques exemples:
- Types / Taille / jeux de caractères de données (essayez d'insérer un nom suédois, ou de longues urls ou des numéros des mondes réels, et voir si vos définitions de colonnes sont ok)
- Triggers
- Contraints (clés étrangères, unicité ...)
- Vues (vérifier que les données sont inclus / exclus / transformé correctement)
- Procédures stockées
- UDFs
- Permissions
- ...
Ceci est utile non seulement lorsque vous changez quelque chose dans votre base de données, mais aussi lorsque vous mettez à niveau votre SGBD ou changer quelque chose dans vos paramètres.
En général, les essais d'intégration se fait. Cela signifie qu'une suite de tests dans un langage de programmation comme PHP ou Java est créé, et les tests émettent des requêtes. Mais si quelque chose tombe en panne, ou il y a quelques exceptions près, il est plus difficile de comprendre le problème, pour 2 raisons:
- Le problème pourrait être dans votre code PHP, ou dans la configuration PHP, ou dans le réseau, ou ...
- Les instructions SQL sont plus difficiles à lire et à modifier, si elles sont intégrées dans un autre langage de programmation.
Alors, à mon avis, des bases de données complexes, vous devez utiliser un cadre de test unitaire qui est écrit dans SQL (en utilisant des procédures stockées et tables). Vous devez choisir soigneusement, parce que ce genre d'outils est pas largement utilisé (et donc pas largement testé). Par exemple, si vous utilisez MySQL Je sais que ces outils:
J'utilise JUnit / nunit / etc et le code des tests unitaires de base de données avec java ou c #. Ceux-ci peuvent alors fonctionner sur un serveur d'intégration en utilisant peut-être un schéma distinct à la base de données de test.
Le dernier développeur sql oracle est livré avec construit dans le cadre de tests unitaires. J'ai eu un coup d'oeil dans ce mais je pas utiliser. Il utilise une interface graphique pour créer et exécuter des tests et stocke tous les tests de la base de données afin de ne pas si facile de mettre des cas de test sous contrôle de version. Il y a probablement d'autres cadres d'essai là-bas je pense qu'ils pourraient être spécifiques à votre base de données.
Les bonnes pratiques sont similaires à des tests unitaires réguliers:
- mettre les essais sous contrôle source
- faire des tests qui fonctionnent rapidement - ne pas tester trop à la fois
- vos tests reproductible
Jetez un oeil sur le cadre DBTestDriven. Il fonctionne très bien pour nous. Téléchargez-le sur GitHub ou leur site web.
En ce qui concerne le développement JVM, les tests unitaires peuvent bénéficier de l'abstraction JDBC. Dès que vous savez que les données JDBC sont soulevées par l'accès DB, ces données JDBC peuvent être « rejoué »
Ainsi cas d'accès DB peut être « reproduit » pour les tests, sans la cible DB:. Pas de test / données complexité d'isolement, faciliter l'intégration continue
Mon cadre Acolyte est un cadre utile de cette façon (y compris l'outil GUI studio « enregistrement » résultat DB): https://github.com/cchantep/acolyte