sql server - tutorial - Comment puis-je tester la persistance?




primefaces formulaire exemple (7)

En tant que débutant dans la pratique du développement piloté par les tests, je finis souvent par un dilemme quant à la manière de tester la persistance d'un test dans une base de données.

Je sais que techniquement ce serait un test d'intégration (pas un test unitaire), mais je veux trouver les meilleures stratégies pour ce qui suit:

  1. Tester des requêtes.
  2. Tester les inserts. Comment puis-je savoir que l'insertion a mal tourné en cas d'échec? Je peux le tester en insérant et en interrogeant, mais comment puis-je savoir que la requête n'était pas fausse?
  3. Tester les mises à jour et les suppressions - comme pour les tests d'insertions

Quelles sont les meilleures pratiques pour cela?

Concernant tester SQL: Je suis conscient que cela peut être fait, mais si j'utilise un Mappeur O / R comme NHibernate, il attache des verrous de nommage dans les alias utilisés pour les requêtes de sortie, et comme c'est quelque peu imprévisible je ne suis pas sûr Je pourrais tester pour ça.

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


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


Le problème que j'ai rencontré lors de la persistance des tests unitaires, en particulier sans ORM et donc moqueur de votre base de données (connexion), est que vous ne savez pas vraiment si vos requêtes réussissent. Il se peut que vos requêtes soient spécifiquement conçues pour une version de base de données particulière et ne réussissent qu'avec cette version. Vous ne trouverez jamais cela si vous vous moquez de votre base de données. Donc, à mon avis, la persistance des tests unitaires n'a qu'une utilité limitée. Vous devriez toujours ajouter des tests en cours d'exécution sur la base de données ciblée.


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

Avec C # 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 faite dans NUnit, sauf que les noms d'attribut diffèrent légèrement.

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


Vous effectuez les tests unitaires en se moquant de la connexion à la base de données. De cette façon, vous pouvez créer des scénarios dans lesquels des requêtes spécifiques dans le flux d'un appel de méthode réussissent ou échouent. Je construis généralement mes attentes fictives afin que le texte de requête réel soit ignoré, parce que je veux vraiment tester la tolérance aux fautes de la méthode et comment elle se gère - les spécificités du SQL ne sont pas pertinentes à cette fin.

Évidemment, cela signifie que votre test ne vérifie pas réellement que la méthode fonctionne , car le code SQL peut être erroné. C'est là que les tests d'intégration entrent en jeu. Pour cela, je m'attends à ce que quelqu'un d'autre ait une réponse plus approfondie, car je commence à peine à m'en occuper moi-même.


Je crée généralement un référentiel et l'utilise pour enregistrer mon entité, puis en récupérer un nouveau. Ensuite, j'affirme que le récupéré est égal à l'enregistré.


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

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

Cordialement,

Rob G


Comme l'a dit Mike Stone , DbUnit est idéal pour mettre la base de données dans un état connu avant d'exécuter vos tests. Lorsque vos tests sont terminés, DbUnit peut remettre la base de données dans l'état dans lequel elle se trouvait avant d'exécuter les tests.

DbUnit (Java)

DbUnit.NET







tdd