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?

18voto

Jon Limjap Punkte 92084

Ich denke, wenn man über Integrationstests nachdenkt, spricht man eher von einer Kreuzung zwischen physikalischen Schichten als von logischen Schichten.

Wenn sich Ihr Test beispielsweise mit der Generierung von Inhalten befasst, handelt es sich um einen Unit-Test. Wenn sich Ihr Test nur mit dem Schreiben auf die Festplatte befasst, handelt es sich immer noch um einen Unit-Test, aber sobald Sie sowohl E/A als auch den Inhalt der Datei testen, haben Sie einen Integrationstest. Wenn Sie die Ausgabe einer Funktion innerhalb eines Dienstes testen, ist es ein Unit-Test, aber sobald Sie einen Dienst aufrufen und sehen, ob das Ergebnis der Funktion dasselbe ist, ist es ein Integrationstest.

Technisch gesehen können Sie sowieso nicht nur eine Klasse testen. Was ist, wenn Ihre Klasse aus mehreren anderen Klassen zusammengesetzt ist? Wird sie dann automatisch zu einem Integrationstest? Das glaube ich nicht.

15voto

DevelopingChris Punkte 38437

Unter Verwendung des Designs "Alleinige Verantwortung" in Schwarz und Weiß. Bei mehr als 1 Verantwortung ist es ein Integrationstest.

Mit dem Enten-Test (sieht aus, quakt, watschelt, ist eine Ente), ist es nur ein Unit-Test mit mehr als 1 newed Objekt in ihm.

Wenn man sich mit mvc beschäftigt und es testet, sind Controllertests immer Integrationstests, weil der Controller sowohl eine Model Unit als auch eine View Unit enthält. Das Testen der Logik in diesem Modell würde ich einen Unit-Test nennen.

12voto

David Sackstein Punkte 420

Meiner Meinung nach lautet die Antwort: "Warum ist das wichtig?"

Liegt es daran, dass Unit-Tests etwas sind, das man macht, und Integrationstests etwas, das man nicht macht? Oder andersherum? Natürlich nicht, Sie sollten versuchen, beides zu tun.

Liegt es daran, dass Unit-Tests schnell, isoliert, wiederholbar, selbstvalidierend und zeitnah sein müssen und Integrationstests nicht? Natürlich nicht, alle Tests sollten dies sein.

Liegt es daran, dass Sie Mocks in Unit-Tests verwenden, aber nicht in Integrationstests? Nein, natürlich nicht. Das würde bedeuten, dass ich, wenn ich einen nützlichen Integrationstest habe, kein Mock für einen Teil hinzufügen darf, weil ich fürchte, ich müsste meinen Test in "Unit-Test" umbenennen oder ihn einem anderen Programmierer zur Bearbeitung übergeben.

Liegt es daran, dass Unit-Tests eine Einheit testen und Integrationstests eine Reihe von Einheiten testen? Nein, natürlich nicht. Welche praktische Bedeutung hat das? Die theoretische Diskussion über den Umfang von Tests scheitert in der Praxis ohnehin daran, dass der Begriff "Unit" völlig kontextabhängig ist. Auf Klassenebene kann eine Unit eine Methode sein. Auf der Ebene einer Baugruppe kann eine Einheit eine Klasse sein, und auf der Ebene eines Dienstes kann eine Einheit eine Komponente sein. Und selbst Klassen verwenden andere Klassen, welche ist also die Einheit?

Das ist nicht von Bedeutung.

Testen ist wichtig, F.I.R.S.T. ist wichtig, Haarspalterei über Definitionen ist Zeitverschwendung und verwirrt nur die Neulinge im Testbereich.

11voto

Lutz Prechelt Punkte 32254

Die Art Ihrer Tests

A Einheitstest des Moduls X ist ein Test, der Probleme nur in Modul X erwartet (und auf diese prüft).

Eine Integrationstest von vielen Modulen ist ein Test, der Probleme erwartet, die sich aus der Zusammenarbeit zwischen die Module, so dass diese Probleme mit Unit-Tests allein nur schwer zu finden wären.

Stellen Sie sich die Art Ihrer Tests wie folgt vor:

  • Risikominderung : Dafür sind Tests da. Nur ein Kombination von Einheitstests und Integrationstests kann eine vollständige Risikominderung bewirken, da einerseits Unit-Tests von Natur aus nicht die korrekte Interaktion zwischen Modulen testen können und andererseits Integrationstests die Funktionalität eines nicht-trivialen Moduls nur in geringem Umfang testen können.
  • Aufwand für das Schreiben von Tests : Integrationstests können Aufwand sparen, weil Sie dann möglicherweise keine Stubs/Fakes/Mocks schreiben müssen. Aber auch Unit-Tests können Aufwand sparen, wenn die Implementierung (und Pflege!) dieser Stubs/Fakes/Mocks einfacher ist als die Konfiguration der Testumgebung ohne sie.
  • Verzögerung der Testdurchführung : Integrationstests, die schwergewichtige Operationen beinhalten (z.B. Zugriff auf externe Systeme wie DBs oder entfernte Server), neigen dazu, langsam(er) zu sein. Das bedeutet, dass Unit-Tests sehr viel häufiger ausgeführt werden können, was den Debugging-Aufwand im Falle eines Fehlers reduziert, da man besser weiß, was man in der Zwischenzeit geändert hat. Dies ist besonders wichtig, wenn Sie testgetriebene Entwicklung (TDD) verwenden.
  • Aufwand für die Fehlersuche : Wenn ein Integrationstest fehlschlägt, aber keiner der Unit-Tests, kann dies sehr unangenehm sein, weil so viel Code involviert ist, dass peut das Problem einzudämmen. Dies ist kein großes Problem, wenn Sie zuvor nur ein paar Zeilen geändert haben - aber da Integrationstests langsam laufen, haben Sie vielleicht no sie in so kurzen Abständen laufen lassen...

Denken Sie daran, dass ein Integrationstest immer noch stub/fake/mock away sein kann einige seiner Abhängigkeiten. Dies bietet einen guten Mittelweg zwischen Einheitstests und Systemtests (die umfassendsten Integrationstests, die das gesamte System testen).

Pragmatischer Ansatz zur Nutzung beider

Ein pragmatischer Ansatz wäre also folgender: Verlassen Sie sich so weit wie möglich auf Integrationstests und verwenden Sie Unit-Tests, wenn dies zu riskant oder unpraktisch wäre. Diese Denkweise könnte nützlicher sein als eine dogmatische Unterscheidung von Unit-Tests und Integrationstests.

5voto

grom Punkte 15234

Einheitliche Prüfung ist eine Testmethode, mit der überprüft wird, ob die einzelnen Einheiten des Quellcodes ordnungsgemäß funktionieren.

Integrationsprüfung ist die Phase des Softwaretests, in der einzelne Softwaremodule zusammengefasst und als Gruppe getestet werden.

Wikipedia definiert eine Einheit als den kleinsten testbaren Teil einer Anwendung, der in Java/C# eine Methode ist. Aber in Ihrem Beispiel der Word- und Sentence-Klasse würde ich wahrscheinlich nur die Tests für den Satz schreiben, da ich es wahrscheinlich übertrieben fände, eine Nachahmung Wortklasse, um die Satzklasse zu testen. Satz wäre also meine Einheit und Wort ist ein Implementierungsdetail dieser Einheit.

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