Aufteilung der JUnit-Klassen in ein spezielles Testpaket?

118

Ich lerne die Konzepte der testgetriebenen Entwicklung durch Lesen der Craftsman-Artikel (klicken Sie auf Craftsman unter Nach Thema ), die in einer Antwort auf meine vorherige Frage "Beispielprojekt zum Erlernen von JUnit und zur richtigen Softwareentwicklung" empfohlen wurden . Ich liebe es so weit!

Aber jetzt möchte ich mich hinsetzen und es selbst versuchen. Ich habe eine Frage, von der ich hoffe, dass sie nur eine einfache Antwort benötigt.

Wie organisieren Sie Ihre JUnit-Testklassen und Ihren tatsächlichen Code? Ich spreche hauptsächlich über die Paketstruktur, aber auch andere wichtige Konzepte wären hilfreich.

Fügen Sie Testklassen in org.myname.project.test. * Und normalen Code in org.myname.project. * Ein? Stellen Sie die Testklassen direkt neben die normalen Klassen? Ziehen Sie es vor, den Klassennamen Test voranzustellen, anstatt sie mit einem Suffix zu versehen?

Ich weiß, das scheint mir so schnell keine Sorgen zu machen, aber ich bin eine sehr organisationsorientierte Person. Ich bin fast die Art von Person, die mehr Zeit damit verbringt, Methoden zu finden, um zu verfolgen, was zu tun ist, anstatt Dinge tatsächlich zu erledigen.

Und ich habe ein Projekt, das derzeit ordentlich in Pakete unterteilt ist, aber das Projekt wurde zu einem Chaos. Anstatt zu versuchen, alles umzugestalten und Tests zu schreiben, möchte ich neu anfangen, zuerst Tests. Aber zuerst muss ich wissen, wohin meine Tests gehen.


edit: Ich habe Maven total vergessen, aber es scheint, dass die Mehrheit von euch es benutzt! In der Vergangenheit hatte ich einen speziellen Anwendungsfall, in dem Maven völlig auf mich zusammenbrach, aber Ant mir die Flexibilität gab, die ich brauchte, und so endete ich mit Ant, aber ich denke, ich habe vielleicht nur den falschen Ansatz gewählt. Ich denke, ich werde Maven noch einmal versuchen, weil es so klingt, als würde es gut zu einer testgetriebenen Entwicklung passen.

Ricket
quelle
1
Mögliches Duplikat von Wo soll ich meine JUnit-Tests ablegen?
mmmmmm

Antworten:

154

Ich bevorzuge es, die Testklassen in dasselbe Paket wie die von ihnen getesteten Projektklassen zu legen, jedoch in einem anderen physischen Verzeichnis, wie z.

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

In einem Maven-Projekt würde es so aussehen:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

Der Hauptpunkt dabei ist, dass meine Testklassen auf Klassen und Mitglieder im Paketbereich zugreifen (und diese testen!) Können.

Wie das obige Beispiel zeigt, haben meine Testklassen den Namen der getesteten Klasse plus Testals Suffix. Dies hilft, sie schnell zu finden - es ist nicht sehr lustig, zwischen ein paar hundert Testklassen zu suchen, deren Name jeweils mit Test...

Update inspiriert von @ Rickets Kommentar: Auf diese Weise werden Testklassen (normalerweise) direkt nach ihrem getesteten Kumpel in einer projektbezogenen alphabetischen Liste von Klassennamen angezeigt. (Komisch, dass ich Tag für Tag davon profitiere, ohne bewusst gemerkt zu haben, wie ...)

Update2: Viele Entwickler (einschließlich ich) mögen Maven, aber es scheint mindestens genauso viele zu geben, die dies nicht tun. IMHO ist es sehr nützlich für "Mainstream" -Java-Projekte (ich würde ungefähr 90% der Projekte in diese Kategorie einordnen ... aber die anderen 10% sind immer noch eine beträchtliche Minderheit). Es ist einfach zu bedienen, wenn man die Maven-Konventionen akzeptieren kann; Wenn nicht, macht es das Leben zu einem elenden Kampf. Maven scheint für viele Menschen, die mit Ant sozialisiert sind, schwer zu verstehen zu sein, da es anscheinend eine ganz andere Denkweise erfordert. (Ich selbst, der Ant noch nie verwendet hat, kann die beiden nicht vergleichen.) Eines ist sicher: Dadurch wird das Testen von Einheiten (und Integrationen) zu einem natürlichen, erstklassigen Schritt in diesem Prozess, der Entwicklern hilft, diese wesentliche Praxis zu übernehmen.

Péter Török
quelle
6
Ich stimme auch dem Suffix zu. Da die Testklassen in einen anderen physischen Ordner unterteilt sind, müssen Sie nicht versuchen, Test ein Präfix zuzuordnen, um eine alphabetische Sortierung in Gruppierungen zu überführen, und ich denke, SomeClassTest liest sich besser.
Ricket
Ausgezeichnete Konventionen +1
Whiskysierra
1
Eine Sache beim Einfügen von Testklassen in dasselbe Paket: Es erlaubt zwar die Verwendung von paketprivaten Mitgliedern (weshalb ich dieses Schema auch verwende), aber es erlaubt auch nicht, die Sichtbarkeit automatisch zu testen, insb. Wenn Sie TDD verwenden und Ihre IDE die erforderlichen Methodenstubs generieren lässt. Es kann sie mit paketprivater Sichtbarkeit generieren (NetBeans, ich sehe Sie an), wodurch Ihr Test perfekt bestanden wird (nachdem Sie die Implementierung tatsächlich in diese Stubs eingefügt haben), aber bei der tatsächlichen Verwendung fehlschlagen kann (wenn Sie vergessen haben, etwas hinzuzufügen public). .
Sergei Tachenov
Während diese Konvention interessant ist, was machen Sie, wenn die Testsuite wächst? Angenommen, Sie haben 6 Methoden in der Klasse, jede Methode hat 10 Tests. Hast du 60 Tests in deiner Klasse? Normalerweise unterteile ich die Testklasse (eine Testklasse pro Methode). Das Problem dabei ist, dass Sie möglicherweise viele Klassen in Ihrem Testpaket finden.
Mmalmeida
1
@Thick_propheT in Eclipse: Klicken Sie mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Neu - Andere ... und wählen Sie dann im Java-Ordner Quellordner aus. Nennen Sie es "Test". Wenn Sie dann der obigen Konvention folgen möchten, fügen Sie diesem Testordner ein neues Paket hinzu, das denselben Namen wie das Paket der Klasse hat, für die Sie einen Testfall schreiben möchten, und fügen Sie dann im Paket einen neuen JUnit-Testfall hinzu (in den Java / Junit-Ordner, wenn Sie New-Other ausführen ...). In diesem neuen Assistenten können Sie die zu testende Klasse angeben und Ihren Testfall mit dem Suffix "Test"
benennen
15

Ich lege meine Testklassen in dasselbe Paket wie das, was sie testen, aber in einen anderen Quellordner oder ein anderes Projekt . Wenn ich meinen Testcode auf diese Weise organisiere, kann ich ihn einfach kompilieren und separat verpacken, sodass Produktions-JAR-Dateien keinen Testcode enthalten. Außerdem kann der Testcode auf private Felder und Methoden des Pakets zugreifen.

ChrisH
quelle
12

Ich benutze Maven . Die Struktur, die Maven fördert, ist:

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

Das heißt, eine Testklasse mit Test vor dem Namen der zu testenden Klasse befindet sich in einer parallelen Verzeichnisstruktur zum Haupttest.

Ein Vorteil der Testklassen im selben Paket (allerdings nicht unbedingt im Verzeichnis) besteht darin, dass Sie mithilfe von Methoden für den Paketbereich Scheinprüfobjekte untersuchen oder einfügen können.

Martin
quelle
18
Ich dachte es war <class>Test.javanichtTest<class>.java
Mike Rylander
2
Maven akzeptiert beide Muster gemäß der Dokumentation zum Maven Surefire Plugin .
Elijah Woodward
3
Ich würde argumentieren, dass das <class>Test.javaNamensschema sowohl die Hauptklasse als auch die Testklasse bei Verwendung von IDE-Suchfunktionen aus der Nähe zeigt, was es ein bisschen besser macht als Test<class>.java.
Christopheml
1
@christopheml Ich stimme zu, das mache ich jetzt.
Martin
Dies funktionierte für Intellij. MyClassTest.java hat nicht funktioniert.
user2761431