8
votes

Est-il raisonnable d'appliquer que les tests d'unités ne devraient jamais parler à une base de données / webservice en direct?

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.

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?


0 commentaires

7 Réponses :


2
votes

J'en affiche généralement un test de l'unité comme quelque chose qui teste une classe individuelle ou Module isolément . 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.

Les tests d'intégration sont une histoire différente. Un test d'intégration devrait éviter les ressources 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é.

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 .


0 commentaires

0
votes

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.


0 commentaires

4
votes

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.


0 commentaires

0
votes

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.

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.


1 commentaires

Les effets secondaires dans des méthodes / classes doivent être évités autant que possible, par ex. en utilisant une injection de dépendance.



0
votes

Dans mon expérience, les tests doivent être effectués sur plusieurs niveaux:

  • Tests unitaires qui vérifient l'exactitude des classes / modules sans avoir besoin de données externes
  • Tests système qui vérifient des parties plus grandes de l'application, chargant des données à partir de bases de données / fichiers spécifiques et vérifiant les résultats (par exemple en comparant les fichiers de sortie). Assurez-vous de ne pas modifier ces bases de données / fichiers et assurez-vous d'avoir une base de données / un fichier de fichiers par groupe de tests
  • Tests manuels qui vérifient l'interface utilisateur

    Chacun de ces tests a leur utilité.


0 commentaires

0
votes

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.

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.


0 commentaires

1
votes

Les tests d'unité ne doivent pas être effectués avec des données en direct, une période.

Même si vous souhaitez commencer à faire des tests d'intégration, ne commencez pas cela avec des données en direct non plus.

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.


0 commentaires