# junit - frage zu fixtures/test suites



## dermoritz (28. Mai 2010)

ich mache gerade meine ersten Schritte mit JUnit (ich hab schon Erfahrungen mit anderen Unit-Testsystemen) und da Frage ich mich, wie man Testfälle gruppieren kann.
Meine erste Vorstellung war, dass ein "fixture" ein fester Satz von Testfällen sein könnte. Nun war die Frage wie man ein Fixture darstellen. Mit @before hab ich das Problem das damit ja alle @Test betroffen sind. Oder kann man bestimmten "@Test" bestimmte "@Before" zuweisen - also die Testfälle Gruppieren?

Die Alternative wäre ja sich die unterschiedlichen Testsetups in Variablen abzulegen und die entsprechenden Tests auf ihre speziellen Variablen zugreifen zu lassen, aber dann brauche ich ja kein @before mehr?

Also letztendlich will ich irgend wie "data driven" testen. (in QT (c++ Framework) hat man eine "meinTest()" und eine "meinTest_data()" Funktion angelegt und so konnte man sozusagen mehrere Testgruppen anlegen inkl. Testdaten)
Geht das in JUnit mit fixtures oder ganz anders?


----------



## spyboot (28. Mai 2010)

Ich würde es an deiner Stelle mit einer TestSuite versuchen:

Unit Testing mit JUnit

diese Seite war mir persöhnlich eine große hilfe ... ziemlich am ende werden auch TestSuite's behandelt.

[Java]

public class AllTests {
  public static Test suite() {
    TestSuite suite = new TestSuite();
    suite.addTestSuite(CustomerTest.class);
    suite.addTestSuite(EuroTest.class);
    suite.addTestSuite(MovieTest.class);
    return suite;
  }
}


[/Java]

Ich weiß nicht ob dir dass weiterhilft???:L aber auf der Website sind auch möglichkeiten angegeben wie mann den Ablauf eines Tests steuern kann sodass mann zb. nicht immer eine Datenbank persistieren muss.


----------



## dermoritz (28. Mai 2010)

mit meinem beschränktem Wisen vermute ich, das die Seite sich mit junit<4 beschäftigt? Aber ich schätze der einzige Unterschied ist nun, das die Dinge nun per Annotationen "erkannt" und "gefunden" werden. also das "Reflection API nach öffentlichen Methoden, die mit test beginnen und weder Parameter noch Rückgabewert besitzen." sind nun Methoden die mit @Test markiert sind, oder?

Gibts das Buch "Testgetriebene Entwicklung mit JUnit & FIT" eigentlich ein einer neuen Auflage für JUnit4? Gibt es andere JUnit Buchempfehlungen?


----------



## maki (28. Mai 2010)

TestSuiten lässt man sich am besten dynamisch erstellen, Maven2, Ant & Eclipse können das.

@Parameters sagt dir etwas? Parameterized (JUnit API)

TestNG ist eine Erweiterung für JUnit und auch bietet die Möglichkeit, Test zu Parametriesieren bzw. Testdaten bereitzustellen.

TestSuiten statisch erstellen ist eher etwas für funktionale Tests/Systemintegrationstests, also "High level" Box Tests.



> Meine erste Vorstellung war, dass ein "fixture" ein fester Satz von Testfällen sein könnte. Nun war die Frage wie man ein Fixture darstellen. Mit @before hab ich das Problem das damit ja alle @Test betroffen sind. Oder kann man bestimmten "@Test" bestimmte "@Before" zuweisen - also die Testfälle Gruppieren?


Verstehe deine Frage nicht, mit @Before annotierte Methoden werden vor jedem Testfall ausgeführt, ein testfall zur laufzeit ist eine Methode die mit @Test annotiert ist.
@BeforeClass kennst du?



> Gibt es andere JUnit Buchempfehlungen?


Für Testen und passende Muster empfehle ich "XUnit Test Patterns : Refactoring Test Code", ist aber keine triviale Sache.


----------



## dermoritz (2. Jun 2010)

Danke für den Buchtip!
Was meine andere Frage betrifft: ich suche eine Möglichkeit Gruppen von Tests zu bilden. Und dann für diese Gruppen ein@before auszuführen. Z.b. Fall ich einen Überladenen Constructor habe würde ich eine Gruppe für jede Überladung basteln wollen, vor dem Ausführen der Tests jeder Gruppe würde ich den entsprechenden Construktor ausführen und dann die Gruppe.
Oft werden ja weitere Konstruktoren, Methoden eine Klasse hinzugefügt. Dann würde ich gerne den schon geschriebenen Testcode unberührt lassen und einfach eine neue Testgruppe dranhängen wollen - geht das? Die Alternative wäre eine weitere Testklasse - also für jede Gruppe eine Testklasse/ein Datei - wäre gar nicht so unsauber, aber ungewohnt oder?


----------



## JohannisderKaeufer (2. Jun 2010)

was spricht gegen eine private Methode createSetupA() die die Tests zu beginn aufrufen? 

Oder Helper, die bestimmte setups bereitstellen und zu beginn eines Tests aufgerufen werden.


----------



## dermoritz (8. Jun 2010)

Johannis, da spricht natürlich nichts dagegen. Ich dachte nur für solche Steuerungsgeschichten gibts irgendwelche JUnit-Tags.
Hab mal noch ne Frage an Maki oder jemand der das: "TestSuiten lässt man sich am besten dynamisch erstellen, Maven2, Ant & Eclipse können das." versteht.
Was heißt hier dynamisch? Heißt das, dass diese Tools mir Testeingabedaten generieren können? Nach welchen Kriterien? Coverage?


----------



## maki (8. Jun 2010)

Testsuiten dynamisch erstellen heisst: Alle Tests finden, und in zufälliger bzw. beliebiger Reihenfolge ausführen. Ist etwas für isolierte Unittests, vielleciht auch Integrationstests.
Für Akzeptanstests muss man meist Suiten fest vordefinieren, da hier mehr & im Zusammenhang getestet wird.

Hast du dir schon mal TestNG angesehen? Das ist eine Erweiterung für JUnit, bin kein Fan, aber vielleciht ist es etwas für dich.

Ach ja, ohne Mocks wird jeder Test früher oder später zu einem Integrationstests, ich bevorzuge JMock2.


----------



## bygones (8. Jun 2010)

maki hat gesagt.:


> Ach ja, ohne Mocks wird jeder Test früher oder später zu einem Integrationstests, ich bevorzuge JMock2.


Kein Alkohol ist auch keine Lösung... also lieber Mockito ...


----------



## maki (8. Jun 2010)

Vielleicht hilft ja noch dieser Link (war gerade auf der Webseite): SuiteFixture Setup at XUnitPatterns.com

@bygones
Bin nie wirklich warm geworden mit Mockito


----------



## dermoritz (14. Jun 2010)

ohne das großartig gelesen zuhaben mal eine Zusammenfassung:
ein "native" Unterstützung von Data-Driven-Testing gibts in JUnit nicht, aber man kann sich alles selber bauen. Und dabei helfen eventuel "parameterized" Tests?

Über TestNG hab ich tatsächlich schon nachgedacht, aber da ich im Moment auf Maven setze und von Maven keine Ahnung hab, bin ich sehr dankbar das JUnit da als "convention" mit verknotet ist. Es auf TestNG umzuschulen ist mir im Moment zu aufwendig.


----------



## kama (15. Jun 2010)

Hallo,



dermoritz hat gesagt.:


> Über TestNG hab ich tatsächlich schon nachgedacht, aber da ich im Moment auf Maven setze und von Maven keine Ahnung hab, bin ich sehr dankbar das JUnit da als "convention" mit verknotet ist. Es auf TestNG umzuschulen ist mir im Moment zu aufwendig.


Wo ist das Problem denn mit TestNG und Maven ?

Gruß
Karl Heinz Marbaise


----------

