Méthodes de test unitaire appelant les services Web des fournisseurs

10

J'ai une classe avec une méthode publique Send()et quelques méthodes privées. Il appelle quelques services Web et traite la réponse. Le traitement se fait dans des méthodes privées.

Je veux tester le code à l'unité. Je crois comprendre que les tests unitaires devraient tester mon code de manière isolée (c'est-à-dire simuler les réponses des fournisseurs).

Je crois également que les méthodes privées ne devraient pas avoir besoin d'être testées à l'unité. Mais si je teste simplement la méthode Send (), mon code n'est pas testé de manière isolée et dépend de la réponse du fournisseur.

Dois-je alors rendre mes méthodes privées publiques afin de pouvoir les tester avec des réponses factices? Cela semble une mauvaise pratique car seule la classe devrait avoir besoin de les appeler.

Toutes mes excuses si c'est une question fondamentale, je suis assez nouveau pour les tests unitaires.

J'utilise c # et VS2010

Tom Squires
la source
Si vous ne testez pas une méthode privée, comment savoir si elle fonctionne?
Bryan Oakley
1
@BryanOakley vous n'avez pas besoin de savoir qu'une méthode privée fonctionne, elle est privée. Vous savez que cela fonctionne parce que les méthodes publiques qui l'appellent passent leurs tests.
StuperUser
@Bryan Oakley jetez un oeil sur le lien
Tom Squires
Salut Tom, j'ai mis à jour le lien pour le rendre plus visible et pour que le texte du lien reflète sa cible. N'hésitez pas à revenir en arrière.
StuperUser

Réponses:

18

Vous devez séparer le code traitant des services Web (c'est-à-dire l'envoi et la réception de données) du code traitant les résultats. Déplacez ce dernier code dans une classe distincte, en rendant publiques les méthodes nécessaires. Ensuite, vous pouvez facilement tester de manière unitaire la logique de traitement, indépendamment des dépendances externes.

Par cela, vous rendez également votre code conforme au principe de responsabilité unique . En règle générale, ressentir le besoin de tester des méthodes privées est souvent une indication que la classe a trop de responsabilités et devrait donc être refactorisée en plusieurs classes.

Péter Török
la source
3

Je pense qu'un test avec de telles dépendances ( appeler les services Web des fournisseurs ) est un test d'intégration plutôt qu'un test unitaire.

OC
la source
3

Comme d'autres l'ont dit, si vos tests unitaires ont des dépendances externes comme des services Web ou des appels de base de données, ce ne sont PAS du tout des tests unitaires, ce sont des tests d'intégration.

Les vrais tests unitaires peuvent s'exécuter indépendamment des composants externes, à l'exception du composant qu'ils sont destinés à tester et doivent être reproductibles quel que soit l'environnement. Si les services Web externes tombent en panne, votre test unitaire ne devrait pas échouer.

Nous contournons cela en utilisant un cadre de simulation. Les objets fantômes nous permettent de créer une maquette d'un composant afin que le composant de notre test unitaire utilise ces objets fantômes au lieu de vrais. Nous pouvons injecter des objets fictifs dans le composant testable, et spécifier quel (s) argument (s) nous attendons, ce que nous voudrions qu'il retourne quand il est appelé, même quelle exception nous voudrions qu'il lance. Je recommande fortement de lire davantage sur le sujet car cela améliorera la fiabilité et l'indépendance de vos tests unitaires.

Pour une bonne publication sur différents frameworks de simulation C #, voir le thread SO suivant:

/programming/37359/what-c-mocking-framework-to-use

EDIT: Pour les personnes ouvertement sensibles, je reconnais que j'ai négligé de mentionner DbUnit ou d'autres outils transactionnels qui peuvent annuler les modifications de la base de données à la fin du test. Celles-ci sont également reproductibles et peuvent être indépendantes de l'environnement avec les données de test générées, un cadre de simulation n'est donc pas nécessaire dans ce cas.

maple_shaft
la source
Quelqu'un peut-il expliquer le downvote? Je n'ai pas déchiré les bases de données PHP, ROR, NoSQL, Javascript sur le serveur, les produits Apple ou toute autre tendance fab, mais j'ai quand même quand même eu un
downvote au volant
Je suppose que quelqu'un n'a pas aimé que ses tests unitaires soient appelés "pas des tests unitaires du tout" (ce n'était pas moi) :)
Daniel B