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?

2voto

CVertex Punkte 17701

Als Unit-Tests bezeichne ich die Tests, die eine Klasse in der Whitebox testen. Alle Abhängigkeiten, die die Klasse benötigt, werden durch Fake-Abhängigkeiten (Mocks) ersetzt.

Integrationstests sind Tests, bei denen mehrere Klassen und ihre Interaktionen gleichzeitig getestet werden. In diesen Fällen werden nur einige Abhängigkeiten vorgetäuscht/gespottet.

Ich würde die Integrationstests von Controllern nur dann aufrufen, wenn eine ihrer Abhängigkeiten eine echte (d. h. nicht gefälschte) ist (z. B. IFormsAuthentication).

Die Trennung der beiden Testtypen ist nützlich, um das System auf verschiedenen Ebenen zu testen. Außerdem sind Integrationstests in der Regel langwierig, während Unit-Tests schnell sein sollen. Die Unterscheidung der Ausführungsgeschwindigkeit bedeutet, dass sie unterschiedlich ausgeführt werden. In unseren Entwicklungsprozessen werden Unit-Tests beim Einchecken ausgeführt (was in Ordnung ist, weil sie superschnell sind), und Integrationstests werden ein- oder zweimal am Tag ausgeführt. Ich versuche, Integrationstests so oft wie möglich auszuführen, aber in der Regel verlangsamen sich die Zugriffe auf die Datenbank/das Schreiben in Dateien/die Ausführung von rpc's/etc.

Das wirft einen weiteren wichtigen Punkt auf: Unit-Tests sollten es vermeiden, auf IO zuzugreifen (z. B. Festplatte, Netzwerk, Datenbank). Sonst werden sie sehr langsam. Es erfordert ein wenig Aufwand, diese IO-Abhängigkeiten zu vermeiden - ich kann nicht zugeben, dass ich der Regel "Unit-Tests müssen schnell sein" treu geblieben bin, aber wenn man das tut, werden die Vorteile auf einem viel größeren System sehr schnell deutlich.

1voto

John Smithers Punkte 1539

Ein bisschen akademisch ist diese Frage schon, oder? ;-) Meine Sicht der Dinge: Für mich ist ein Integrationstest der Test des ganzen Teils, nicht ob zwei von zehn Teilen zusammenpassen. Unser Integrationstest zeigt, ob der Master-Build (mit 40 Projekten) erfolgreich sein wird. Für die Projekte haben wir tonnenweise Unit-Tests. Das Wichtigste bei Unit-Tests ist für mich, dass ein Unit-Test nicht von einem anderen Unit-Test abhängig sein darf. Für mich sind also beide Tests, die Sie oben beschreiben, Unit-Tests, wenn sie unabhängig sind. Für Integrationstests muss dies nicht wichtig sein.

1voto

Pavel Feldman Punkte 4451

Sind diese Tests im Wesentlichen zu Integrationstests geworden, weil sie jetzt die Integration dieser 2 Klassen testen? Oder ist es nur ein Unit-Test, der sich über 2 Klassen erstreckt?

Ich denke Ja und Ja. Ihr Unit-Test, der sich über 2 Klassen erstreckt, wurde zu einem Integrationstest.

Sie können dies vermeiden, indem Sie die Klasse Sentence mit einer Mock-Implementierung - der Klasse MockWord - testen, was wichtig ist, wenn die Teile des Systems groß genug sind, um von verschiedenen Entwicklern implementiert zu werden. In diesem Fall wird Word allein unitgetestet, Sentence wird mit Hilfe von MockWord unitgetestet, und dann wird Sentence mit Word integriert.

Ein Beispiel für einen echten Unterschied ist folgendes 1) Ein Array mit 1.000.000 Elementen lässt sich leicht testen und funktioniert einwandfrei. 2) BubbleSort kann leicht mit einem Array von 10 Elementen getestet werden und funktioniert auch einwandfrei. 3) Integrationstests zeigen, dass etwas nicht so gut ist.

Wenn diese Teile von einer einzelnen Person entwickelt werden, wird das Problem höchstwahrscheinlich beim Unit-Test von BubbleSoft gefunden, weil der Entwickler bereits ein echtes Array hat und keine Mock-Implementierung benötigt.

1voto

Paulo Merson Punkte 11246

Darüber hinaus ist es wichtig, daran zu denken, dass sowohl Unit-Tests als auch Integrationstests automatisiert und z. B. mit JUnit geschrieben werden können. In JUnit-Integrationstests kann man die org.junit.Assume Klasse, um die Verfügbarkeit von Umgebungselementen (z. B. Datenbankverbindung) oder andere Bedingungen zu testen.

0voto

StevePoling Punkte 199

Wenn Sie ein TDD-Purist sind, schreiben Sie die Tests, bevor Sie Produktionscode schreiben. Natürlich werden die Tests nicht kompiliert, so dass Sie zuerst die Tests kompilieren und dann die Tests bestehen lassen.

Dies ist mit Unit-Tests möglich, nicht aber mit Integrations- oder Akzeptanztests. Wenn Sie es mit einem Integrationstest versuchen würden, würde nichts kompiliert werden, bis Sie fertig sind!

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