355 Stimmen

Was ist der Unterschied zwischen Integrations- und Einheitstests?

Ich kenne die sogenannte Lehrbuchdefinition von Unit-Tests und Integrationstests. Was mich interessiert, ist, wann es Zeit ist, Unit-Tests zu schreiben... Ich werde sie so schreiben, dass sie so viele Klassen wie möglich abdecken.

Zum Beispiel, wenn ich eine Word Klasse, werde ich einige Unit-Tests für die Word Klasse. Dann beginne ich mit dem Schreiben meiner Sentence Klasse, und wenn sie mit der Word Klasse, werde ich meine Unit-Tests oft so schreiben, dass sie sowohl die Sentence y Word ... zumindest an den Orten, an denen sie interagieren.

Sind diese Tests im Wesentlichen Integrationstests geworden, weil sie jetzt die Integration dieser 2 Klassen testen, oder ist es nur ein Unit-Test, der 2 Klassen überspannt?

Im Allgemeinen werde ich aufgrund dieser unsicheren Linie nur selten Integrationstests schreiben... oder ist die Verwendung des fertigen Produkts, um zu sehen, ob alle Teile richtig funktionieren, der eigentliche Integrationstest, auch wenn er manuell durchgeführt wird und selten über den Umfang der einzelnen Funktionen hinausgeht?

Verstehe ich Integrationstests falsch, oder gibt es wirklich nur sehr wenig Unterschied zwischen Integrations- und Unit-Tests?

4voto

Michael Neale Punkte 19010

Ich mache dasselbe - ich nenne sie alle Unit-Tests, aber irgendwann habe ich einen "Unit-Test", der so viel abdeckt, dass ich ihn oft in "..IntegrationTest" umbenenne - nur eine Namensänderung, sonst ändert sich nichts.

Ich denke, es gibt eine Fortsetzung von "atomaren Tests" (Testen einer winzigen Klasse oder einer Methode) zu Unit-Tests (Klassenebene) und Integrationstests - und dann funktionalen Tests (die normalerweise viel mehr Dinge von oben nach unten abdecken) - es scheint keinen sauberen Schnitt zu geben.

Wenn Ihr Test Daten einrichtet und vielleicht eine Datenbank/Datei usw. lädt, dann ist es vielleicht eher ein Integrationstest (bei Integrationstests verwende ich weniger Mocks und mehr echte Klassen, aber das bedeutet nicht, dass Sie nicht einen Teil des Systems mocken können).

4voto

Lance Fisher Punkte 25464

Ich denke, ich würde ein paar interagierende Klassen immer noch als Einheitstest bezeichnen, vorausgesetzt, dass die Einheitstests für Klasse 1 die Funktionen von Klasse 1 testen und die Einheitstests für Klasse 2 ihre Funktionen testen und dass sie nicht auf die Datenbank zugreifen.

Ich nenne einen Test einen Integrationstest, wenn er den größten Teil meines Stacks durchläuft und sogar die Datenbank trifft.

Diese Frage gefällt mir sehr, denn die TDD-Diskussion kommt mir manchmal etwas zu puristisch vor, und es ist gut, wenn ich einige konkrete Beispiele sehe.

4voto

Pascal Punkte 11125

Integrationstests: Die Persistenz der Datenbank wird getestet.
Einheitstests: Der Datenbankzugriff wird gespottet. Code-Methoden werden getestet.

3voto

Christian Hagelid Punkte 7897

Unit-Testing ist das Testen einer Arbeitseinheit oder eines Codeblocks, wenn Sie so wollen. Sie werden in der Regel von einem einzelnen Entwickler durchgeführt.

Integrationstests beziehen sich auf den Test, der vorzugsweise auf einem Integrationsserver durchgeführt wird, wenn ein Entwickler seinen Code in ein Versionskontroll-Repository überträgt. Integrationstests können von Dienstprogrammen wie Cruise Control durchgeführt werden.

Sie führen also Ihre Unit-Tests durch, um zu überprüfen, ob die von Ihnen erstellte Arbeitseinheit funktioniert, und die Integrationstests überprüfen, ob das, was Sie dem Repository hinzugefügt haben, nicht etwas anderes beschädigt hat.

3voto

BenKoshy Punkte 29349

Einfache Erläuterung mit Analogien

Die oben genannten Beispiele sind sehr gut, und ich brauche sie nicht zu wiederholen. Ich werde mich also darauf konzentrieren, Beispiele zu verwenden, um Ihnen das Verständnis zu erleichtern.

Integrationstests

Integrationstests prüfen, ob alles zusammen funktioniert. Stellen Sie sich eine Reihe von Zahnrädern vor, die in einer Uhr zusammenarbeiten. Ein Integrationstest würde lauten: Zeigt die Uhr die richtige Zeit an? Zeigt sie in 3 Tagen immer noch die richtige Zeit an?

Sie sagt nur aus, ob das Gesamtwerk funktioniert. Wenn es scheitert: Es sagt Ihnen nicht genau, wo es scheitert.

Einheitliche Tests

Es handelt sich dabei um ganz bestimmte Arten von Tests. Sie sagen Ihnen, ob eine bestimmte Sache funktioniert oder nicht. Der Schlüssel zu dieser Art von Test ist, dass er nur eine bestimmte Sache testet, während er davon ausgeht, dass alles andere gut funktioniert. Das ist der springende Punkt.

Ejemplo: Lassen Sie uns diesen Punkt anhand eines Beispiels näher erläutern:

  • Nehmen wir als Beispiel ein Auto.
  • Integration Test für ein Auto: Fährt das Auto z. B. nach Woop Woop und zurück? Wenn es das tut, kann man mit Sicherheit sagen, dass das Auto aus einer Gesamtperspektive heraus funktioniert. Dies ist ein Integrationstest. Wenn der Test fehlschlägt, wissen Sie nicht, woran es liegt: ist es der Kühler, das Getriebe, der Motor oder der Vergaser? Sie haben keine Ahnung. Es könnte alles sein.
  • Einheitstest für ein Auto: Funktioniert der Motor? Dieser Test setzt voraus, dass alles andere im Auto einwandfrei funktioniert. Wenn also dieser spezielle Unit-Test fehlschlägt, können Sie sehr sicher sein, dass das Problem im Motor liegt - so können Sie das Problem schnell eingrenzen und beheben.

Verwendung von Stubs

  • Angenommen, der Integrationstest für Ihr Auto schlägt fehl. Es fährt nicht erfolgreich nach Echuca. Wo liegt das Problem?

  • Nehmen wir nun an, dass Ihr Motor ein spezielles Kraftstoffeinspritzsystem verwendet und dass dieser Motoreinheitstest ebenfalls fehlgeschlagen ist. Mit anderen Worten: Sowohl der Integrationstest als auch der Motoreinheitstest sind fehlgeschlagen. Wo liegt dann das Problem? (Geben Sie sich 10 Sekunden Zeit, um die Antwort zu finden.)

  • Liegt das Problem am Motor oder an der Einspritzanlage?

Verstehen Sie das Problem hier? Sie wissen nicht, was genau schief läuft. Wenn Sie verschiedene externe Abhängigkeiten verwenden, könnte jede einzelne dieser 10 Abhängigkeiten das Problem verursacht haben - und Sie wissen nicht, wo Sie anfangen sollen. Aus diesem Grund verwenden Unit-Tests Stubs, um davon auszugehen, dass alles andere einwandfrei funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X