Sollte ich Unit-Tests und Integrationstests trennen?

16

Ich muss Unit-Tests und Integrationstests für ein Projekt schreiben.

  • Sollten alle Tests in einem einzigen Testordner abgelegt werden ?
  • Oder sollten sich Komponententests und Integrationstests jeweils in einem separaten Testordner befinden ?
  • Oder sollte ich sie sogar in getrennte Projekte stecken ?

Wenn ich sie zusammenhalte, gibt es bei diesem Ansatz Vor- oder Nachteile?

Ahmed Ragheb
quelle
1
Wenn Sie in einer CI-Umgebung arbeiten, ist es wichtig, dass sie leicht identifiziert werden können (anhand von Attributen usw.), da Integrationstests nicht immer auf dem Build-Server ausgeführt werden.
Robbie Dee

Antworten:

17

Im Allgemeinen: Ja, Sie sollten Integrationstests und Komponententests in verschiedenen Ordnern ablegen. Oft ziehen Programmierer keine klare Grenze zwischen diesen beiden Arten von Tests und schreiben einfach, welche Art von Test nützlich ist. Integrationstests sind jedoch in der Regel langsamer, da sie häufig Folgendes umfassen:

  • Datenbankabfragen
  • Netzwerkanfragen
  • Zeitabhängiges Verhalten
  • Große Datenmengen

Im Gegensatz dazu würde ein Komponententest teure Vorgänge verspotten, sodass Komponententests in der Regel schnell ausgeführt werden (der langsamste Teil der Testausführung ist häufig das Test-Framework selbst).

Wenn ein Programmierer an dem System arbeitet, befindet er sich in einem Bearbeitungstestzyklus. Je schneller sie Test-Feedback erhalten und je kürzer der Zyklus ist, desto produktiver können sie sein. Dort wollen wir also nur wichtige Tests durchführen, die schnell abgeschlossen sind. Die komplette Testsuite wird nur im Rahmen eines QS-Prozesses ausgeführt, z. B. auf einem CI-Server.

Dies bedeutet, dass große Testsuiten kategorisiert werden sollten. Können wir nur Komponententests für eine bestimmte Komponente auswählen? Können wir langsame Tests ausschließen? Eine einfache Möglichkeit besteht darin, verschiedene Testsuiten in verschiedenen Verzeichnissen zu verwalten. Wenn Sie nur sehr wenige Tests haben, ist ein einzelnes Verzeichnis auch in Ordnung, solange ein Programmierer leicht eine Teilmenge von Tests auswählen kann.

Was auch immer einem Programmierer erlaubt, schnelles Feedback zu erhalten, ist gut. Die umfassendste Testsuite spielt keine Rolle, wenn sie nicht regelmäßig ausgeführt wird.

Weitere Lektüre:

amon
quelle
Bewahren Sie beim Trennen der Ordner alle im selben Paket wie der Produktionscode auf (damit Sie geschützte Methoden testen können)? Sie erstellen beispielsweise ein Maven-Modul für Unit-Tests und ein weiteres Maven-Modul für die Integrationstests. Auf diese Weise können Sie sie trennen und dennoch problemlos geschützte Methoden testen.
ihebiheb
@ihebiheb In Java ist die Verwendung der Paketsichtbarkeit ziemlich verpönt. In einigen Fällen kann es hilfreich sein, es zu verwenden und über Komponententests auf diese APIs zuzugreifen. Aber im Allgemeinen ist das unnötig. Integrationstests benötigen niemals Zugriff auf paketprivate Mitglieder. Ob Sie die Tests in einem separaten Maven-Projekt ausführen oder nicht, hängt davon ab, wie Sie sie ausführen und bereitstellen möchten. Ich stehe nicht so auf Java / Maven, um dir sagen zu können, was hier sinnvoll ist.
amon