Mon équipe continue de trouver de plus en plus de valeur dans les tests de l'unité que nous écrivons. Nous n'ayons généralement pas de test les couches d'accès aux données de nos applications, car elles ne contiennent pas de "logique". Dans mon expérience, nous rencontrons des problèmes de performance significatifs et des erreurs non reproductibles à la suite de les développeurs à écrire des tests d'unité qui parlent à des bases de données en direct (ou Webservices) et de plus en plus de développeurs créent des moqueurs de ces données. Tests unitaires. p>
Prendre cette approche a augmenté la vitesse des tests et des tests isolés à la logique plutôt que de tester la connexion / la récupération en même temps. Je me demande si cela semble raisonnable d'appliquer en tant que norme de codage. Quels sont les avantages / inconvénients en ce qui concerne les bases de données en direct / services Web qui me manquent? P>
7 Réponses :
J'en affiche généralement un test de l'unité comme quelque chose qui teste une classe individuelle ou Module isolément em>. strong> En tant que tel, j'essaie d'éviter d'avoir des tests d'unités connaissez des systèmes en direct ou des ressources externes - j'ai tendance à éviter de telles dépendances dans des tests unitaires - ou de la moquer de leur éjection. p>
Les tests d'intégration sont une histoire différente. strong> Un test d'intégration devrait éviter les ressources em> se moquer de la moqueur et peut donc nécessiter une base de données ou un service en direct pour le soutenir. Ce que vous décrivez des sons comme s'il peut s'agir d'un test d'intégration plutôt que d'un test d'unité. P>
Dans certains cas, il est souhaitable de simuler les services nécessaires à un test d'intégration - mais lorsque cela est possible, j'essaie d'éviter cela parce que je ne fais pas confiance à la simulation pouvant refléter le comportement de la vraie chose. Pour moi, un test d'intégration devrait réellement tester l'intégration des composants dans un système em>. P>
imo vous manquez probablement que si vous utilisez des bases de données / WS sur le test, ce n'est pas un test d'unité, mais un test d'intégration. P>
Les parties de la base de données et Webservice de votre application doivent également être testées, mais par définition, elles ne seront pas des tests d'unités, mais des tests d'intégration. Ces tests seraient distincts de vos tests de l'unité et fonctionnent moins souvent, mais fourniront une détection anticipée très précieuse des défauts. P>
Tout test de validation de construction doit être aussi complet que possible. Si vous avez un appel de fonction qui relais sur des ressources externes, vous devez assurer que l'ensemble du système se comporte correctement. P>
Le problème avec des tests d'unités spécifiquement pour les fonctions qui se connectent à une base de données peuvent être problématiques car ces fonctions peuvent avoir des effets secondaires, tels que l'insertion de données. Ces effets secondaires peuvent provoquer une modification des valeurs de retour. p>
Les effets secondaires dans des méthodes / classes doivent être évités autant que possible, par ex. en utilisant une injection de dépendance.
Dans mon expérience, les tests doivent être effectués sur plusieurs niveaux: p>
Chacun de ces tests a leur utilité. P>
Je suis désolé, mais de nombreux développeurs manquent le fait que vous devez également tester la base de données. Je peux accepter de moquer de la connexion entre la classe "A" et la base de données, mais à un moment donné, vous allez créer une classe qui utilise une technologie d'accès aux données (Ado.net, par exemple), et vous devez tester que Cela fonctionne réellement. P>
Maintenant, en gardant ces tests petits et ciblés, vous pouvez plus facilement empêcher les effets secondaires et assurer les conditions initiales correctes de la base de données. Mais le fait est que vous devez tester ce code ou votre logique commerciale correctement testée se déroulera avec de mauvaises données pour travailler. P>
Les tests d'unité ne doivent pas être effectués avec des données en direct, une période. P>
Même si vous souhaitez commencer à faire des tests d'intégration, ne commencez pas cela avec des données en direct non plus. p>
Les tests d'intégration de départ doivent toujours être effectués contre les données de développement ou les données de maquette. La méthode privilégiée serait d'avoir un système DEV qui a publié des données en direct ou utilisez des scripts SQL pour générer un ensemble complet de données à tester. p>