Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention?

Zrebna

Bekanntes Mitglied
Hi!
Frage steht ja schon im Titel - ist das nur Konvention, dass man Unit-Tests in einem Maven-Projekt im src/test/java-Verzeichnis platziert, oder hat das handfeste Gründe, Vorteile oder gar Notwendigkeiten?

Erleichtert oder ermöglicht diese Platzierung z.B. die Integration in eine CI-Pipeline? Oder vereinfacht es den Build-Prozess in Maven, wenn man Uint-Tests automatisiert ausführt?

Oder ist das alles egal und es würde genauso alles gut funktionieren, wenn man Unit-Tests sturr in ein eigenes Maven-(Unter)-Projekt packt, sodass es letztlich eben nur Konventio ist?

Lg
Zrebna
 

KonradN

Super-Moderator
Mitarbeiter
Das ist eine Konvention, die in Maven einmal festgelegt wurde. Dies kannst Du z.B. in der Super POM erkennen:
Super POM (apache.org)
Dort siehst du dann in build die Festlegung testSourceDirectory:
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>

Und ja - das könntest Du einfach umändern. Setz einfach testSourceDirectory in Deiner POM und schon liegt es woanders.

Wenn Du einen guten Grund hast, dann kannst Du es also anpassen. Aber wenn Du keinen guten Grund hast, dann solltest Du es schlicht sein lassen:
  • Clean Code Gedanke - man sollte nur Dinge machen, die Andere auch erwarten. Niemand will erst in deine POM schauen um zu sehen, was für komische Ideen Dir dabei gekommen sind.
  • Konventionen über Konfigurationen - Sich daran zu halten ermöglicht es u.a., dass Du viele Konfigurationen direkt kopieren kannst. Du brauchst etwas in Deinem Maven Projekt? Eine Suche gibt dir auf SO oder so einen Ausschnitt, den Du in der Regel relativ einfach kopieren kannst und fertig. Weich von den Konventionen ab und die Chancen steigen, dass Du ohne Anpassungen Dinge nicht übernehmen kannst!

Unit-Tests sturr in ein eigenes Maven-(Unter)-Projekt packt
Wozu? Du schreibst die Unit Tests direkt mit den zu testenden Units. Wozu das in zwei Projekte packen? Dann müsstest Du entweder bei den Verzeichnissen rumpfuschen (Damit ein Projekt direkt auf das andere Projekt zugreift oder so) oder Du musst bei allen Läufen sicher stellen, dass Du erfolgreich übersetzt und es ins lokale Repository deployed hast. Du verkomplizierst also die Entwicklung schlicht unnötig.

Wenn Du keine Unit Tests sondern Integrationstests oder so machst, dann ist es etwas anderes, dann testest Du ja auch eine fertig übersetzte und (lokal) installierte Software. Das nur als wichtigen Punkt. Schau Dir an, was Du genau machen willst und dann nimm einen Aufbau, der sinnvoll ist. Und das ist halt auch wichtig, wenn es um die Frage geht, in was für Maven Module man etwas unterteilt. Hier von Anfang an eine massive Unterteilung zu haben ohne irgend eine Notwendigkeit dazu, ist einfach unnötig (und daher Quatsch in meinen Augen). Das nur, weil ich da einen Thread im Kopf habe, der wohl auch von Dir war...
 

Zrebna

Bekanntes Mitglied
Das ist eine Konvention, die in Maven einmal festgelegt wurde. Dies kannst Du z.B. in der Super POM erkennen:
Super POM (apache.org)
Dort siehst du dann in build die Festlegung testSourceDirectory:
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>

Und ja - das könntest Du einfach umändern. Setz einfach testSourceDirectory in Deiner POM und schon liegt es woanders.

Wenn Du einen guten Grund hast, dann kannst Du es also anpassen. Aber wenn Du keinen guten Grund hast, dann solltest Du es schlicht sein lassen:
  • Clean Code Gedanke - man sollte nur Dinge machen, die Andere auch erwarten. Niemand will erst in deine POM schauen um zu sehen, was für komische Ideen Dir dabei gekommen sind.
  • Konventionen über Konfigurationen - Sich daran zu halten ermöglicht es u.a., dass Du viele Konfigurationen direkt kopieren kannst. Du brauchst etwas in Deinem Maven Projekt? Eine Suche gibt dir auf SO oder so einen Ausschnitt, den Du in der Regel relativ einfach kopieren kannst und fertig. Weich von den Konventionen ab und die Chancen steigen, dass Du ohne Anpassungen Dinge nicht übernehmen kannst!


Wozu? Du schreibst die Unit Tests direkt mit den zu testenden Units. Wozu das in zwei Projekte packen? Dann müsstest Du entweder bei den Verzeichnissen rumpfuschen (Damit ein Projekt direkt auf das andere Projekt zugreift oder so) oder Du musst bei allen Läufen sicher stellen, dass Du erfolgreich übersetzt und es ins lokale Repository deployed hast. Du verkomplizierst also die Entwicklung schlicht unnötig.

Wenn Du keine Unit Tests sondern Integrationstests oder so machst, dann ist es etwas anderes, dann testest Du ja auch eine fertig übersetzte und (lokal) installierte Software. Das nur als wichtigen Punkt. Schau Dir an, was Du genau machen willst und dann nimm einen Aufbau, der sinnvoll ist. Und das ist halt auch wichtig, wenn es um die Frage geht, in was für Maven Module man etwas unterteilt. Hier von Anfang an eine massive Unterteilung zu haben ohne irgend eine Notwendigkeit dazu, ist einfach unnötig (und daher Quatsch in meinen Augen). Das nur, weil ich da einen Thread im Kopf habe, der wohl auch von Dir war...

Zur Klarstellung:
Ich will nicht Unit-Tests in ein eigenes maven-Unterprojekt auslagern und habe mich aber nur gefragt, ob so ein Vorgehen Konsequenzen hätte - und zwar Konsequenzen, die über eine Verletzung von best practices und Konventionen hinausgehen.

Das könnte so ein Punkt sein, der "wirkliche" Probleme machen könnte:
"Dann müsstest Du entweder bei den Verzeichnissen rumpfuschen (Damit ein Projekt direkt auf das andere Projekt zugreift oder so)..."

Bei Unit-Tests verwendet man ja keine externen Abhängigkeiten und will nach Möglichkeit auch wenig mocken müssen. Daher ist es alleine schon aus Zugriffsgründen gut, wenn die zu testende Klasse und die testende Klasse im selben Projekt liegen.

Nochmal, ich suche eben Contra-Argumente gegen das Auslagern von Unit-Tests in eigene Maven-Projekte, und somit gegen das Brechen der gängigen Konvention.
 

LimDul

Top Contributor
Unit-Tests sind Bestandteil der Unit die sie testen. Warum anders machen? Wenn man etwas anders macht, als die Konventionen, braucht man erst mal keine Argumente warum es schlechter ist - es ist gegen die Konventionen, sondern Argumente warum es besser sein soll. Diverse Tools werden dann nicht mehr out of the box funktionieren, wie z.B. die Messung der Code-Abdeckung, weil die in Sonar beispielsweise nur innerhalb des Moduls gemessen wird. Und mit Sicherheit zig andere Tools auch.

Wenn man Konventionen verletzt, bricht man implizit alle Tools die sich auf diese Konventionen verlassen. Das ist schon ein extrem starkes Argument, wo man erst mal ein Pro Argument braucht um überhaupt weiter zu diskutieren, warum es sinnvoll sein könnte.
 

KonradN

Super-Moderator
Mitarbeiter
Bei Unit-Tests verwendet man ja keine externen Abhängigkeiten
Doch natürlich hast Du Abhängigkeiten. Du hast mindestens das Unit-Test Framework wie JUnit aber oft auch weitere Libraries, die Du für effektive Tests benötigst wie z.B. Mockito.

und will nach Möglichkeit auch wenig mocken müssen.
Aber genau das bleibt bei Unit Tests - so dies wirklich Unit Tests sind - nicht aus. Denn dann willst Du ja wirklich nur die Unit selbst testen. Damit musst Du alles, was nicht die Unit selbst ist, mocken.

ich suche eben Contra-Argumente gegen das Auslagern von Unit-Tests in eigene Maven-Projekte
Dazu hatte ich ja auch etwas geschrieben:
Dann müsstest Du entweder bei den Verzeichnissen rumpfuschen (Damit ein Projekt direkt auf das andere Projekt zugreift oder so) oder Du musst bei allen Läufen sicher stellen, dass Du erfolgreich übersetzt und es ins lokale Repository deployed hast. Du verkomplizierst also die Entwicklung schlicht unnötig.
Daher kann ich Dir nur empfehlen, es einfach mal zu machen / es zu probieren. Dann wirst Du ja sehen, wie Gut es geht und was für Probleme es mit sich bringt.

Wenn man z.B. nach TDD vorgeht, dann rufst Du ständig Unit Tests auf:
  • Ist der neue Test wirklich rot?
  • Ist durch die (minimale) Anpassung alles grün?
  • Ist nach dem Refactoring alles grün?
Und da ist halt wichtig, dass die Unit Tests immer mit der letzten Version des Sources arbeiten. Was ist notwendig, damit das Test Modul die Änderungen vom Code-Modul hat?

Es ist wichtig, dass Unit Tests schnell laufen und dass du diese einfach aufrufen kannst. Es geht sogar so weit, dass es AddOns für Entwicklungsumgebungen gibt, die im Hintergrund automatisch die Unit-Tests ausführen. (IntelliJ hat in Ultimate das Auto-Test, Eclipse hat das Plugin Infinitest)

Also hier ist die Praxis einfach wichtig. Und wenn Du es ausprobierst und damit einfach mal etwas arbeitest, dann wirst Du merken, ob es noch praktikabel ist oder eben nicht...
 

Zrebna

Bekanntes Mitglied
Doch natürlich hast Du Abhängigkeiten. Du hast mindestens das Unit-Test Framework wie JUnit aber oft auch weitere Libraries, die Du für effektive Tests benötigst wie z.B. Mockito.
Schlecht ausgerückt von mir - meinte:
Units sollen isoliert von externen Abhängigkeiten gestet werden- daher muss man diese mocken, wenn man welche braucht.
Aber genau das bleibt bei Unit Tests - so dies wirklich Unit Tests sind - nicht aus. Denn dann willst Du ja wirklich nur die Unit selbst testen. Damit musst Du alles, was nicht die Unit selbst ist, mocken.


Dazu hatte ich ja auch etwas geschrieben:

Daher kann ich Dir nur empfehlen, es einfach mal zu machen / es zu probieren. Dann wirst Du ja sehen, wie Gut es geht und was für Probleme es mit sich bringt.

Wenn man z.B. nach TDD vorgeht, dann rufst Du ständig Unit Tests auf:
  • Ist der neue Test wirklich rot?
  • Ist durch die (minimale) Anpassung alles grün?
  • Ist nach dem Refactoring alles grün?
Und da ist halt wichtig, dass die Unit Tests immer mit der letzten Version des Sources arbeiten. Was ist notwendig, damit das Test Modul die Änderungen vom Code-Modul hat?

Es ist wichtig, dass Unit Tests schnell laufen und dass du diese einfach aufrufen kannst. Es geht sogar so weit, dass es AddOns für Entwicklungsumgebungen gibt, die im Hintergrund automatisch die Unit-Tests ausführen. (IntelliJ hat in Ultimate das Auto-Test, Eclipse hat das Plugin Infinitest)

Also hier ist die Praxis einfach wichtig. Und wenn Du es ausprobierst und damit einfach mal etwas arbeitest, dann wirst Du merken, ob es noch praktikabel ist oder eben nicht...
TDD will ich selber in meinem kleinen Hobbyprojekt ausprobieren, einfach als Lernmittel.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich will nicht Unit-Tests in ein eigenes maven-Unterprojekt auslagern und habe mich aber nur gefragt, ob so ein Vorgehen Konsequenzen hätte - und zwar Konsequenzen, die über eine Verletzung von best practices und Konventionen hinausgehen.
Split-Packages sind ein mögliches Problem, wenn man die Tests im selben Package liegen hat, um default und protected Scope nutzen zu können.
 

KonradN

Super-Moderator
Mitarbeiter
TDD will ich selber in meinem kleinen Hobbyprojekt ausprobieren, einfach als Lernmittel.
Auch wenn das Off Topic ist: Das ist mit das Beste, was man machen kann. Bezüglich TDD in der Praxis mag man durchaus geteilter Meinung sein, so empfinde ich es als ungewohnt, da ich halt gewohnt bin, dass Dinge vorhanden sind und ich dann die Autovervollständigung nutze. Bei dem TDD Ansatz ist es aber so, dass man regelmäßig Dinge nutzt, die noch nicht da sind um da dann mit Hilfe der IDE diese zu erstellen. Das ist nicht schlechter nur eben für mich ungewohnt. Liegt aber garantiert auch mit daran, dass ich bisher kein Projekt hatte, in dem ich das einfach dauerhaft umsetzen konnte - denn ich bin sicher, dass da sehr schnell eine Umgewöhnung statt finden dürfte.

Aber das durchzuführen hilft auf jeden Fall ganz stark bezüglich: Wie sieht gut testbarer Code aus. Ohne diese Übung ist es meiner Erfahrung nach oft so, dass man Code hat, der einfach nicht testbar ist. Und das macht es einem extrem schwer und führt aus meiner Sicht dann oft zu negativen Erfahrungen und damit verbunden der Ablehnung von Unit Tests (da hatten wir hier im Forum schon massive Diskussionen drum, wo einzelne Senior Software Engineers Unit Tests für Zeitverschwendung hielten).

Daher auch hier die Off Topic Antwort, um Dich in dem Punkt zu bestärken! Das ist auf jeden Fall super und wird Dir aus meiner Sicht durchaus viel bringen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
P Wieso benutzen PriorityQueues Heaps? Allgemeine Java-Themen 2
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
I Wieso funktioniert das nich? Allgemeine Java-Themen 5
F Input/Output NullPointerException, aber wieso? [Apache POI] Allgemeine Java-Themen 11
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7
P Best Practice Wieso funktioniert der Modulo - Operator nicht? Allgemeine Java-Themen 2
J Jasper ireport - wieso beendet die Anwendung wenn ich die Preview schließe Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
S RemoteException wieso ? Allgemeine Java-Themen 6
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
P wieso kann ich auf bluej exportieren aber auf eclipse nicht? Allgemeine Java-Themen 2
DEvent Wieso ist Javadoc mit Html Tags? Allgemeine Java-Themen 47
D java.util.InputMismatchException im Scanner -wieso? Allgemeine Java-Themen 5
E Wieso returnt das hier 1? Allgemeine Java-Themen 3
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
C Wieso funktioniert das? Allgemeine Java-Themen 6
W Wieso funktioniert dieser Code hier? Allgemeine Java-Themen 6
S Wieso stehen in der API immer wieder abstrakte Methoden ? Allgemeine Java-Themen 7
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
V Wieso meckert FindBugs da? Allgemeine Java-Themen 7
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
V Wieso Heap Space Problem? Allgemeine Java-Themen 14
J Wieso implementiert HTTPServlet Serializable? Allgemeine Java-Themen 2
P Wieso skalieren diese beiden Threads unterschiedlich gut? Allgemeine Java-Themen 16
zilti Wieso geht der StreamReader/Writer nicht? Allgemeine Java-Themen 5
T Wieso erfolgt keine Ausgabe. /Excel Allgemeine Java-Themen 19
G wieso wird der String des StringBuilder immer länger? Allgemeine Java-Themen 2
G wieso "implements" Allgemeine Java-Themen 13
S Problem mit generics -> ClassCastException und ka wieso Allgemeine Java-Themen 20
G Übergabe funzt nicht, aber wieso? Allgemeine Java-Themen 3
G NullPointer ? wieso? Allgemeine Java-Themen 7
I Wieso läuft Programm bei Kollegen aber nicht bei mir? Allgemeine Java-Themen 10
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
L Bewerberaufgaben sind nur Zeitverschwendung... Allgemeine Java-Themen 10
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
D Was sind Bibliotheken in Java/Pyhton? Allgemeine Java-Themen 1
F Java Installationen sind unterschiedlich Allgemeine Java-Themen 11
N Was sind Logger in Java? (bzgl. SonarLint) Allgemeine Java-Themen 3
Kaffeevertilger Warum nullable Booleans doof sind ... Allgemeine Java-Themen 22
Sogomn OOP Sind Helferklassen böse? Allgemeine Java-Themen 3
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Wie groß sind die Adressen in Java? Allgemeine Java-Themen 4
E Funktion sperren bis Unterfunktionen ferig sind Allgemeine Java-Themen 3
S Hash-Bereiche erstellen die gleichverteilt sind..? Allgemeine Java-Themen 8
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
S ThreadPoolExecutor: wie stelle ich fest dass meine Threads im Pool mit ihrer Arbeit fertig sind? Allgemeine Java-Themen 3
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
N URL einlesen -> Daten sind nicht vollständig bzw. korrekt Allgemeine Java-Themen 9
G Datei einlesen: Umlaute sind Fragezeichen Allgemeine Java-Themen 23
aokai Testen von Klassen die abhängig von Stdlibs URL sind Allgemeine Java-Themen 3
M Methodenaufrufe sind über Interfaces langsamer. Allgemeine Java-Themen 43
G Sind Applets noch uptodate Allgemeine Java-Themen 24
D Problem mit Tooltips und JFrame (Tooltips sind zu kurz!) Allgemeine Java-Themen 4
T Überprüfen ob zwei Farben ähnlich sind Allgemeine Java-Themen 14
M Sind Streams asynchron? Allgemeine Java-Themen 2
G Prüfen ob Ziffern einer Zahl pandigital sind? Allgemeine Java-Themen 15
O Warten bis alle gestarteten Threads beendet sind? Allgemeine Java-Themen 6
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
M wie dateien speichern damit sie platform unabhängig sind? Allgemeine Java-Themen 2
D gewisse Zeichen sind nach dem entschlüsseln anders Allgemeine Java-Themen 2
K Wie gut sind java.util - ADTs ? Allgemeine Java-Themen 2
Bleiglanz Benchmarks sind sehr schwierig Allgemeine Java-Themen 2
P Woher weiß ein Programm wo seine Ressourcen sind? Allgemeine Java-Themen 4
U wie groß sind Verzeichnisse Allgemeine Java-Themen 11
N String überprüfen ob nur Ziffern enthalten sind!! Allgemeine Java-Themen 8
S Was sind eigentlich Java Beans? Allgemeine Java-Themen 2
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
M Warum eigentlich JAVA? Allgemeine Java-Themen 18
D Zufallsgererator der eigentlich keiner ist Allgemeine Java-Themen 24
M Wie schwer kann es eigentlich sein. Allgemeine Java-Themen 7
M Was produzieren die ganzen Java-Programmierer eigentlich so? Allgemeine Java-Themen 23
H wie viel speicher braucht eigentlich ein array? Allgemeine Java-Themen 2
M Gibt es eigentlich einen Standalone-Java-ICQ-clone Allgemeine Java-Themen 19
A Was ist eigentlich ein Thread? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben