Comment puis-je la persistance de test unitaire?

voix
43

En tant que novice dans la pratique du développement piloté par les tests, je finis souvent dans une situation embarrassante à la façon de la persistance de test unité à une base de données.

Je sais que techniquement ce serait un test d'intégration (et non un test unitaire), mais je veux trouver les meilleures stratégies pour les éléments suivants:

  1. test de requêtes.
  2. inserts d'essai. Comment puis-je savoir que l'insert qui a mal tourné si elle échoue? Je peux le tester en insérant, puis en interrogeant, mais comment puis-je savoir que la requête n'a pas eu tort?
  3. mises à jour d'essais et supprime - même que les inserts de test

Quelles sont les meilleures pratiques pour faire cela?


En ce qui concerne les tests SQL: Je suis conscient que cela pourrait se faire, mais si j'utilise un O / R Mapper comme NHibernate, il attache des verrues de nommage dans les alias utilisés pour les requêtes de sortie, et que c'est un peu imprévisible, je ne suis pas sûr Je pourrais tester pour cela.

Devrais-je, tout abandonner et simplement confiance NHibernate? Je ne suis pas sûr que ce soit prudent.

Créé 05/08/2008 à 10:43
source utilisateur
Dans d'autres langues...                            


10 réponses

voix
16

Regardez dans l'unité DB. Il est une bibliothèque Java, mais il doit y avoir un équivalent C #. Il vous permet de préparer la base de données avec un ensemble de données afin que vous sachiez ce qui est dans la base de données, vous pouvez l'interface avec DB Unit pour voir ce qui est dans la base de données. Il peut fonctionner sur de nombreux systèmes de base de données, vous pouvez donc utiliser la configuration de votre base de données réelle, ou quelque chose d'autre, comme HSQL en Java (une implémentation de base de données Java avec une option en mémoire).

Si vous voulez vérifier que votre code utilise la base de données correctement (que vous très probablement devriez faire), alors ceci est la voie à suivre pour isoler chaque test et d'assurer la base de données a prévu des données préparées.

Créé 11/08/2008 à 10:40
source utilisateur

voix
15

Comme dit Mike Stone , DbUnit est idéal pour obtenir la base de données dans un état connu avant d' exécuter vos tests. Lorsque vos tests terminés, DbUnit peut mettre la base de données de nouveau dans l'état où il était avant conduit les tests.

DbUnit (Java)

DbUnit.NET

Créé 25/08/2008 à 14:22
source utilisateur

voix
4

Vous faites les tests unitaires en se moquant la connexion de base de données. De cette façon, vous pouvez construire des scénarios où des requêtes spécifiques dans le flux d'un appel de méthode réussissent ou échouent. Je construis mes attentes habituellement fausses afin que le texte de la requête réelle est ignorée, parce que je veux vraiment tester la tolérance aux pannes de la méthode et la façon dont il se gère - les spécificités de SQL ne sont pas pertinentes à cette fin.

De toute évidence , cela signifie que votre test ne vérifiaient réellement que la méthode fonctionne , parce que le SQL peut être erroné. C'est là les tests d'intégration entrent en jeu. Pour cela, je me attendre que quelqu'un d' autre aura une réponse plus complète, que je commence tout juste à se familiariser avec moi - même ceux -ci .

Créé 05/08/2008 à 10:47
source utilisateur

voix
3

J'ai écrit un post ici concernant les tests unitaires de la couche de données qui couvre ce problème exact. Toutes mes excuses pour le (honteux), mais la fiche l'article est trop long pour poster ici.

J'espère que vous aide - il a travaillé très bien pour moi au cours des 6 derniers mois sur 3 projets actifs.

Cordialement,

Rob G

Créé 13/08/2008 à 00:23
source utilisateur

voix
2

Pour les projets basés JDBC, cadre Acolyte peut être utilisé: http://acolyte.eu.org . Il permet l'accès aux données que vous voulez mockup aux tests, au profit de l' abstraction JDBC, sans avoir à gérer un DB de test spécifique.

Créé 09/07/2014 à 10:20
source utilisateur

voix
2

Pour NHibernate, je serais certainement tout se moquant plaide pour le NHibernate APIpour les tests unitaires - faire confiance à la bibliothèque pour faire la bonne chose. Si vous voulez vous assurer que les données vont en fait à la base de données, faire un test d'intégration.

Créé 05/08/2008 à 12:20
source utilisateur

voix
2

Le problème que je connu lorsque la persistance des tests unitaires, en particulier sans ORM et se moquant ainsi de votre base de données (connexion), est que vous ne savez pas vraiment si vos requêtes réussissent. Il se pourrait que vous vos requêtes sont spécialement conçues pour une version de base de données particulière et ne réussissons avec cette version. Vous ne trouverez jamais que si vous vous moquez de votre base de données. Donc, à mon avis, la persistance de tests unitaires est d'une utilité limitée. Vous devez toujours ajouter des tests en cours d'exécution sur la base de données ciblée.

Créé 05/08/2008 à 11:29
source utilisateur

voix
1

Je crée généralement un référentiel et l'utiliser pour sauver mon entité, puis récupérer un nouveau. Ensuite, je soutiens que l'extrait est égal à ceux qui sont sauvés.

Créé 27/08/2008 à 22:17
source utilisateur

voix
1

Techniquement les tests unitaires ne sont pas de persistence tests unitaires, ils sont des tests d'intégration.

Avec C # en utilisant MbUnit, vous utilisez simplement les attributs SqlRestoreInfo et rollback

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

La même chose peut être fait dans NUnit, excpet les noms d'attributs diffèrent slighty.

Pour ce qui est de vérifier si votre requête a été succeful, vous devez normalement suivre avec une deuxième requête pour voir si la base de données a été modifiée comme prévu.

Créé 05/08/2008 à 12:27
source utilisateur

voix
1

Je aussi simuler la base de données, et vérifier que les requêtes sont ce que vous attendiez. Il y a le risque que le test vérifie le mauvais sql, mais cela serait détecté dans les tests d'intégration

Créé 05/08/2008 à 11:19
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more