349 votes

Quelle est la différence entre les tests unitaires et d’intégration ?

Je sais que le soi-disant définition classique de tests unitaires et tests d'intégration. Ce que je suis curieux de savoir quand il est temps d'écrire des tests unitaires... je vais écrire à couvrir le plus grand nombre d'ensembles de classes.

Par exemple, si j'ai un Mot de la classe, je vais écrire des tests unitaires pour le Mot de la classe. Puis, je commence à écrire ma Phrase de la classe, et quand il a besoin d'interagir avec le Mot classe, j'écris souvent mes tests unitaires tels qu'ils testent les deux Phrase et de Mot... au moins dans les endroits où ils interagissent.

Ces tests, en substance, devenir des tests d'intégration parce qu'ils ont désormais tester l'intégration de ces 2 classes? Ou est-ce juste un test unitaire qui s'étend sur 2 classes?

En général, en raison de l'incertitude entourant la ligne, je vais rarement à l'écriture de tests d'intégration... ou est-ce mon en utilisant le produit fini pour voir si toutes les pièces fonctionnent correctement l'intégration réelle des tests, même s'ils sont manuelles et rarement répété au-delà de la portée de chaque individu?

Suis-je l'incompréhension des tests d'intégration, ou il y a vraiment très peu de différence entre l'intégration et les tests unitaires?

EDIT: Merci pour toutes les grandes réponses de tout le monde! Je pense que de la variété des réponses, il est clair que la ligne entre les tests unitaires et d'intégration est certainement une ligne floue, et c'est peut-être un peu pédant à essayer de comprendre qui sont qui et le vrai accent devrait rester sur le code (Merci @Rob Cooper). Aussi, désolé mais je ne vais pas accepter toute réponse, car trop nombreux sont trop bonnes, et il semble vraiment tout à fait subjective.

339voto

Arialdo Martini Points 1772

La principale différence, pour moi, c'est que les tests d'intégration de révéler si une fonction de travail ou est cassé, car ils soulignent le code dans un scénario proche de la réalité. Ils invoquer un ou plusieurs logiciels de méthodes ou de fonctions et de tester si ils agissent comme prévu.

À l'opposé, une Unité de test le test d'une seule méthode s'appuie souvent sur la supposition erronée que le reste du logiciel est correctement de travail, parce qu'il explicitement se moque de toutes les dépendances.

Donc, quand un test unitaire pour une méthode de mise en œuvre de certaines fonctionnalité est vert, cela ne veut pas dire que la fonction est de travail.

Disons que vous avez une méthode quelque part comme ça

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}

DoSomething est très important pour votre client: c'est une fonctionnalité, la seule chose qui compte. C'est pourquoi vous avez l'habitude d'écrire un Concombre spécification de le faire valoir: vous souhaitez vérifier et communiquer la fonctionnalité fonctionne ou pas.

Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for

Pas de doute: si le test est réussi, vous pouvez affirmer que vous livrez un travail de fonctionnalité. C'est ce que vous pouvez appeler la Valeur de l'Entreprise.

Si vous voulez écrire un test unitaire pour DoSomething vous devriez faire semblant (à l'aide de certains simulacres) que le reste de la classe et des méthodes de travail (qui est: que, de toutes les dépendances de la méthode est d'utiliser correctement son travail), et d'affirmer votre méthode de travail.

Dans la pratique, vous faites quelque chose comme

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  <b>FakeAlwaysWorkingLog</b>.TrackTheFactYouDidYourJob();
  return someResults;
}

Vous pouvez faire cela avec l'Injection de Dépendance, ou une partie d'Usine Méthode ou les Mock-Cadre ou tout simplement l'extension de la classe sous test.

Supposons qu'il y a un bug dans le Journal.DoSomething(). Heureusement, le Cornichon spec va le trouver et de le votre de bout en bout, les tests échouent.

La fonctionnalité ne fonctionne pas, parce que le Journal est cassé, pas parce que [Faire votre travail avec someInput] n'est pas fait son travail. Et, en passant, [à Faire votre travail someInput] est de l'entière responsabilité de cette méthode.

Aussi, supposons que le Journal est utilisé dans 100 autres fonctions, dans 100 autres méthodes de 100 autres classes.

Yep, 100 fonctionnalités échouent. Mais, heureusement, 100 de bout en bout, les tests échouent ainsi et de révéler le problème. Et, oui: ils disent la vérité.

C'est une information très utile: je sais que j'ai un produit cassé. C'est aussi un très déroutant de l'information: il ne me dit rien à propos de où est le problème. Il communique moi le symptôme, pas la cause.

Pourtant, DoSomething de l'unité de test est vert, parce que c'est à l'aide d'un faux Journal, construit jamais se casser. Et, oui: c'est clairement le mensonge. C'est communiquer une fracture de la fonction de travail. Comment peut-il être utile?

(Si DoSomething()'s de l'unité de test échoue, assurez-vous: [Faire votre travail avec someInput] a quelques bugs.)

Supposons que c'est un système avec une fracture de la classe A system with a broken class

Un seul bug va briser plusieurs fonctionnalités, et plusieurs tests d'intégration échoue

A single bug will break several features, and several integration tests will fail

D'autre part, le même bug briser d'une seule unité de test

The same bug will break just one unit test

Maintenant, comparer les deux scénarios.

Le même bug briser d'une seule unité de test

  • Toutes vos fonctions à l'aide de l'cassé Journal sont rouges
  • Tous les tests unitaires sont de couleur verte, seule l'unité de test pour les Journaux est le rouge

En fait, les tests unitaires pour tous les modules, à l'aide d'une fracture de la fonction de green car, en utilisant des objets fantaisie, ils ont enlevé les dépendances. En d'autres termes, ils s'exécutent dans un idéal, entièrement fictif monde. Et c'est le seul moyen d'isoler les bugs et de les chercher. Les tests unitaires moyens de moqueries. Si vous n'êtes pas vous moquer, vous n'êtes pas de tests unitaires.

La différence

Les tests d'intégration dire ce quin'est pas le travail. Mais ils ne sont d'aucune utilité dans le deviner d'où le problème pourrait être.

Les tests unitaires sont les seuls tests que vous dire exactement le bug est. Le dessin de cette information, ils doivent exécuter la méthode dans un moqué de l'environnement, où toutes les autres dépendances sont censés fonctionner correctement.

C'est pourquoi je pense que votre phrase "Ou est-ce juste un test unitaire qui s'étend sur 2 classes" est en quelque sorte déplacées. Un test unitaire ne doit jamais s'étend sur 2 classes.

Cette réponse est essentiellement un résumé de ce que j'ai écrit ici: tests Unitaires mensonge, c'est pourquoi je les aime.

65voto

Larry Foulkrod Points 1026

Quand j'écris des tests unitaires, je limite le champ d'application du code d'essai pour la classe je suis en train d'écrire en se moquant de dépendances. Si je suis en train d'écrire une Phrase de classe, et la Phrase a une dépendance sur Word, je vais utiliser un simulacre de Parole. En se moquant de Mot, je peux me concentrer uniquement sur son interface et de tester les différents comportements de ma Phrase de la classe comme elle interagit avec Mot de l'interface. De cette façon, je suis seulement de tester le comportement et la mise en œuvre de la Phrase et non pas en même temps les tests de l'implentation de la Parole.

Une fois que j'ai écrit les tests unitaires pour s'assurer de la Phrase se comporte correctement lorsqu'il ineteracts avec Mot basé sur le Mot interface de l'-je écrire le test d'intégration pour s'assurer que mes hypothèses sur les interactions étaient correctes. Pour cela, je approvisionnement des objets réels et d'écrire un test qui exerce une fonction qui sera à la fin en utilisant à la fois la Peine et de la Parole.

47voto

Rob Cooper Points 15945

Mes 10 bits :D

On m'a toujours dit que les Tests Unitaires est le test d'un composant individuel - qui devrait être exercé à son maximum. Maintenant, cela a tendance à avoir beaucoup de niveaux, car la plupart des composants sont faits de petites pièces. Pour moi, une unité est une partie fonctionnelle du système. De sorte qu'il a à offrir quelque chose de valeur (c'est à dire pas une méthode pour le traitement de chaîne, mais un HtmlSanitizer peut-être).

Les Tests d'intégration est la prochaine étape, prendre une ou plusieurs des composants et de faire en sorte qu'ils travaillent ensemble comme ils le devraient.. Vous êtes au-dessus de l'subtilités de vous soucier de la façon dont les composants de travailler individuellement, mais quand vous entrez html dans votre HtmlEditControl , c'est en quelque sorte comme par magie sait que son valide ou pas..

De son une réelle mobilière ligne mais.. j'avais plutôt l'accent plus sur l'obtention de la putain de code à travailler à plein arrêter ^_^

24voto

Robert Koritnik Points 45499

Tests unitaires utilisent des simulacres

La chose vous parlez sont des tests d’intégration qui en fait de tester l’intégration entière de votre système. Mais quand vous faites vous les tests unitaires doivent effectivement tester chaque unité séparément. Tout le reste devrait être moqué. Donc dans votre cas de de la classe, si elle utilise classe, puis votre classe devrait être moqué. De cette façon, vous aurez seulement tester votre fonctionnalité de la classe.

18voto

Jon Limjap Points 46429

Je pense que lorsque vous commencez à penser à des tests d'intégration, vous parlez plus d'un croisement entre les couches physiques plutôt que des couches logiques.

Par exemple, si vos tests se préoccuper de la génération de contenu, c'est une unité de test: si votre critère porte sur lui-même avec seulement de l'écriture sur le disque, c'est encore un test unitaire, mais une fois que vous testez pour les I/O ET le contenu du fichier, alors vous avez vous-même un test d'intégration. Lorsque vous testez la sortie d'une fonction au sein d'un service, c'est un test unitaire, mais une fois que vous faites un appel de service et voir si le résultat de la fonction est la même, alors que c'est un test d'intégration.

Techniquement, vous ne pouvez pas test unitaire juste-une-classe de toute façon. Que faire si votre classe est composée de plusieurs autres classes? Le fait automatiquement faire un test d'intégration? Je ne le pense pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X