Quelles sont les meilleures pratiques que vous utilisez pour tester les requêtes de base de données?

StackOverflow https://stackoverflow.com/questions/260342

Question

Je suis actuellement en train de tester notre solution comportant l'ensemble de la "gamme". des couches: UI, Middle et la base de données omniprésente.

Avant mon arrivée au sein de mon équipe actuelle, les testeurs ont effectué le test des requêtes manuellement. Ces requêtes renvoient théoriquement un ensemble de résultats que la procédure stockée doit renvoyer en fonction de diverses règles de pertinence, de tri et de ce que vous avez.

Cela a eu pour effet secondaire que les bogues soient classés plus souvent contre la requête du testeur que contre la requête en question.

J'ai proposé de travailler avec un ensemble de résultats connus, qui vous permet simplement de déduire comment il doit être renvoyé puisque vous contrôlez les données présentes. Auparavant, les données étaient extraites de la production, désinfectées, puis insérées dans nos bases de données de test.

Les gens voulaient toujours créer leurs propres requêtes pour tester ce que les développeurs ont créé. Je soupçonne que beaucoup le sont encore. Je pense que ce n’est pas du tout l’idéal et que cela accroît inutilement notre empreinte sur les tests.

Alors, je suis curieux de savoir quelles pratiques utilisez-vous pour tester ce type de scénario et quelles seraient les meilleures solutions pour obtenir la meilleure couverture de bout en bout que vous puissiez obtenir, sans introduire de données chaotiques?

Mon problème est de savoir où est le meilleur endroit pour faire quels tests. Dois-je simplement piquer directement le service et comparer ce jeu de données à celui que je peux extraire de la procédure stockée? J'ai une idée approximative et j'ai assez de succès jusqu'à présent, mais je sens qu'il nous manque encore quelque chose d'important. Je me tourne donc vers la communauté pour voir si elle a des idées précieuses qui pourraient m'aider à formuler mon approche de test. mieux.

Était-ce utile?

La solution

Tester les procédures stockées nécessitera que chaque personne qui teste ait une instance distincte de la base de données. C'est une exigence. Si vous partagez des environnements, vous ne pourrez pas vous fier aux résultats de votre test. Ils ne valent rien.

Vous devrez également vous assurer que vous restaurez la base de données à son état précédent après chaque test afin de rendre les résultats prévisibles et stables. En raison de la nécessité de restaurer l'état après chaque test, ces tests prendront beaucoup plus de temps que les tests unitaires standard, ils seront donc probablement quelque chose que vous voudrez exécuter pendant la nuit.

Il existe quelques outils pour vous aider. DbUnit est l’un d’entre eux et je pense aussi que Microsoft avait un outil Visual Studio pour professionnels de la base de données qui prenait en charge les tests de base de données.

Autres conseils

Voici quelques directives:

  1. Utilisez une base de données isolée pour les tests unitaires (aucune autre exécution ou activité de test, par exemple)
  2. Toujours insérer toutes les données de test que vous souhaitez interroger dans le même test
  3. Ecrivez les tests pour créer de manière aléatoire différents volumes de données, par exemple. nombre aléatoire d'inserts disons entre 1 et 10 lignes
  4. Randomize les données, par exemple pour une insertion aléatoire de champ booléen et true ou false
  5. Conservez un compte dans le test des variables (nombre de lignes, nombre de traces, par exemple)
  6. Pour l'assertion, exécutez la requête et comparez-la aux variables de test locales
  7. Utiliser les transactions de services d’entreprise pour restaurer la base de données à l’état précédent

Voir le lien ci-dessous pour la technique de transaction de services aux entreprises:

http://weblogs.asp.net/rosherove/articles/DbUnitTesting.aspx

Dans le cadre de notre intégration continue, nous exécutons notre "génération" nocturne de requêtes de base de données. Il s’agit d’une suite d’appels à la base de données régulièrement mis à jour à partir des appels réels du code, ainsi que des requêtes ad hoc attendues.

Ces appels sont chronométrés pour que:

1 / Ils ne prennent pas trop de temps.

2 / Ils ne diffèrent pas beaucoup (mal) de la nuit précédente.

De cette manière, nous détectons rapidement les requêtes erronées ou les modifications de base de données.

Le planificateur de requêtes est votre ami, en particulier dans ce cas. Il est toujours recommandé de vérifier que les index sont utilisés quand vous vous en attendez et que la requête ne nécessite pas de travail supplémentaire. Même si votre suite comprend des tests de résistance, il est néanmoins judicieux d’attraper les requêtes coûteuses avant que votre application ne soit complètement bloquée.

Nous avons une base de données vierge réservée à chaque développeur et testeur.

Lorsque les tests sont exécutés - chaque test efface la base de données et charge les données qu'il compte utiliser. Cela nous donne un état connu à tout moment.

Nous pouvons ensuite tester plusieurs scénarios différents sur le même DB (les uns après les autres) et ne jamais imprimer sur les autres testeurs.

Cela couvre le test de l'accès aux données lui-même. Pour les tests de service, nous faisons à peu près la même chose, mais nous ne testons que l’intérieur du service. Nous ne touchons pas le service, nous ne créons pas d’instance de la classe de traitement de service et ne transmettons pas tout ce dont nous avons besoin. De cette façon, nous testons le code et non l’infrastructure (message, etc.)

Django offre une capacité de test unitaire de base de données. Vous pouvez emprunter leurs idées de conception et les reproduire dans d'autres environnements.

Les membres de Django offrent une sous-classe de la classe TestCase standard unittest de Python qui remplit une base de données avec un appareil connu - un ensemble connu de lignes de données.

Dans le cas de Django (et Python), il est plus simple de renseigner la base de données à partir d'un extrait de données JSON. D'autres formats de fichier pour le projecteur peuvent être utilisés pour d'autres frameworks. Par exemple, si vous travaillez avec Oracle, les fichiers CSV pourraient être plus faciles à utiliser.

Cette sous-classe TestCase permet d’écrire un TestCase typique qui teste la base de données avec le gabarit de données connu.

De plus, le lanceur de tests Django crée un schéma temporaire à des fins de test. Cela est facile pour Django car il dispose d’un composant de gestion objet-relationnel complet qui inclut la création de fichiers DDL. Si vous ne le possédez pas, vous aurez toujours besoin du script DDL pour pouvoir créer et disposer d'un schéma de test à des fins moins strictes.

SQLServerCentral a un article ici (vous devrez peut-être vous enregistrer, mais c'est gratuit et sans chaînes) sur un framework de test unitaire TSQL appelé tsqlUnit. Il est open source et suit la tradition du framework xUnit.

Il suit le modèle SEAT TDD:

Configuration - prépare les conditions de test en manipulant les objets, les tableaux et / ou les données

Exercice - invoquer le code de production

Assert - vérifie que le résultat réel est égal au résultat attendu

Teardown - ramenez tout à l’état qu’il était avant le début du test. Pour ce faire, vous annulez une transaction, ce qui permet de tout garder en ordre.

Bien que je ne l'utilise pas, il semble prometteur et c'est certainement quelque chose que je vais examiner plus en détail.

Le cadre peut être téléchargé ici .

Je trouve qu'il est utile de tester le code SQL envoyé à la base de données plutôt que le résultat de l'interrogation de la base de données.

Ce n’est pas parce que je ne fais pas ça plus tard, mais je trouve qu’il est beaucoup plus rapide de tester cela que de trop charger la base de données.

Ceci est une configuration lourde, mais je recommande les conteneurs TDDing.

Lorsque vous exécutez votre script de test, créez un nouveau conteneur dans lequel votre base de données est exécutée, insérez-y des données fictives, puis exécutez les requêtes et testez-les par rapport à ce qui a été renvoyé et indiquez si les requêtes ont abouti ou non.

De cette manière, vous avez le contrôle de la mise en production de votre environnement de test.

ThoughtWorks

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top