Question

J'ai écrit un test il y a quelque temps qui teste une intégration que j'ai écrite entre mon code et une API tierce. Le test garantit que l'intégration fonctionne correctement et que nous récupérons les résultats attendus.

La construction formelle a échoué aujourd'hui car le test a reçu une erreur de 500 tout en essayant de se connecter à l'API tiers.

Est-il logique de tester une situation comme celle-ci?

Était-ce utile?

La solution

À mon avis, les tests d'intégration sont corrects pour échouer si le tiers (db, webservice etc.) n'est pas disponible. Si vous ne voulez pas tester l'intégration elle-même et juste la fonctionnalité simple, vous pourriez vous moquer du résultat de votre API et tester contre eux. Dans ce scénario, votre test ne dépend plus de la disponibilité tiers.

Je marque généralement des tests unitaires en fonction d'une disponibilité tiers avec un attribut de groupe comme "intégration" et les exclure du processus d'intégration continue. Au lieu de cela, je les laisse courir dans une construction nocturne. Les tests d'intégration sont généralement chers dans le temps et le Le point entier de l'intégration continue est de fournir une rétroaction rapide.

Autres conseils

Non, il n'est pas utile que votre suite de test échoue lorsqu'un service tiers est en baisse. Mais vous souhaitez tester pleinement votre intégration avec le service. La stratégie suivante a bien fonctionné pour moi:

  • Isolez le service tiers dans un module (disons une classe, mais quelle que soit votre langue modularibles est bien) qui ne fait que peu possible en plus de résumer la connexion au service. Écrivez des méthodes sur la classe afin qu'il soit possible de faire la différence entre les erreurs qui sont la faute et les erreurs du service qui sont de votre faute. Par exemple, donnez aux exceptions des services de service une superclasse commune.

  • Écrivez des tests unitaires de la classe de service afin que

    • Si une erreur de service se produit, les tests passent mais enregistrez l'erreur.

    • Si une autre erreur se produit, échouez comme d'habitude.

    Écrivez ces tests afin qu'ils fonctionnent contre le service en direct. Il devrait y avoir un petit nombre de ces tests, ils ne devraient donc pas créer de problème pour l'exécution de la suite de tests.

  • Stume ou simulez la classe de service de tous les autres tests, y compris les tests d'intégration. (Par "tests d'intégration" ici, je parle de tests qui testent toutes les couches de votre propre code, et non s'ils interagissent avec le service tiers.)

    Lorsque vous vous débattez ou se moquez de la classe de service à partir de tests d'intégration, ne tassez pas ou ne vous moquez pas de l'API publique de la classe de service, mais plutôt de tassement ou de se moquer d'un niveau inférieur, peut-être une méthode interne de la classe de service ou de la bibliothèque que vous utilisez pour Connectez-vous au service. Cela empêche les bogues d'intégration lors de l'appel de la classe de service. Dans les tests unitaires, tasse ou simulez l'API publique de la classe de service comme vous le feriez pour n'importe quelle classe.

Comme le suggère Martin Buberl, il pourrait être utile d'avoir un test séparé de tests d'intégration où la classe de service n'est pas couchée ou moquée. Pour être honnête, c'est quelque chose qui a été discuté dans plusieurs projets dans lesquels j'ai été impliqué, mais je ne pense pas que cela ait jamais été fait. Lorsqu'un service tiers échoue, nous le découvrons toujours à partir des erreurs de production (rapportées par la surveillance ou le support client) avant de le découvrir à partir des tests.

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