# Hudson JUnit Testcases durchführen



## quiddix (4. Dez 2009)

Hallo,

ich bin aktuell am Einrichten von Hudson. Ich kann im Moment mein Produkt erfolgreich builden.

Nun habe ich ein paar JUnit TestCases geschrieben. Wenn ich diese in Eclipse ausführe dann wird mir angezeigt dass alle Tests ohne Fehler durchgelaufen sind. 

Nun würde ich das ganze gerne von Hudson aus machen, da es dort eine Option gibt. Leider steht dort nur etwas von einer JUNIT Report Datei. 

Da ich von selbst keine Report Datei bekommen habe ich mir gedacht das ganze geht eventuell mit ANT-Skripten ?
Kann mir da jemand weiterhelfen, bzw. wie bekomme ich aus meine .java JUnit Testklassen einen .xml Report?

Eventuell auch gerne Beispielcode.
MFG Quiddix


----------



## fastjack (4. Dez 2009)

Zum Beispiel mit den Anttasks junit und junitreport : 

[XML]        
       <junit printsummary="on" haltonfailure="false" dir="${testdir}" fork="true">
            <classpath refid="test-cp" />
            <jvmarg value="-ea"/>
            <jvmarg value="-Dlog4j.configuration=file:log4j.xml"/>
            <test name="${testdir}.MyTests" outfile="xml-dir"/>
            <formatter type="xml" />
        </junit>
        <junitreport todir="html-dir">
            <fileset dir="xml-dir">
                <include name="*.xml" />
            </fileset>
            <report format="frames" todir="html-dir" />
        </junitreport>
[/XML]

Du mußt nur die Verzeichnisse entsprechend setzen.


----------



## maki (4. Dez 2009)

... oder mit Maven2, da läuft das alles schon automatisch


----------



## Wildcard (5. Dez 2009)

Oder mit dem Buckminster Plugin für Hudson.
Du fügst einen Buckminster build step hinzu und führst das Kommando 'junit' aus und übergibst den Pfad zu einer Eclipse Launch Configuration an für die Unit Tests die du ausführen möchtest. Die Tests laufen dann genau so wie in deiner IDE:


----------



## quiddix (7. Dez 2009)

Hmm,

irgendwie scheint das ganze bei mir nicht zu funktionieren.
Ich dachte mit eigentlich, dass ich mir ein Ant-Skript schreibe, wie es auch fastjack vorgeschlagen hat.

Leider weiß ich nicht genau wie ich die entsprechenden Pfade anpasse:


> <junit printsummary="on" haltonfailure="false" dir="${testdir}" fork="true">
> <classpath refid="test-cp" />
> <jvmarg value="-ea"/>
> <jvmarg value="-Dlog4j.configuration=file:log4j.xml"/>
> ...



Ich muss doch irgendwann Verzeichnisse löschen und neue erstellen bevor ich irgendwo etwas reinschreiben kann. Meine testdir ist aber doch genau das gleich oder?

Eventuell könnte mir jemand die einzelnen Tags näher erläutern oder einfach mal eine komplette Beispiel ant Datei anhängen, sodass ich dann den gesamt Zusammenhang erkennen kann.
Stehe irgendwie aufm Schlauch.


Und noch eine Frage:
Muss ich nicht noch ein target zum kompilieren der Tests schreiben (haben viele andere User gemacht)
Danke

Beim classpath gebe ich die location der JUnit Datei an ? Was mach ich wenn die in unterschiedlichen locations liegen?


----------



## fastjack (7. Dez 2009)

Du mußt vorher natürlich Verzeichnisse löschen und erstellen  Das ganze läuft dann so, das der junit-Task eine XML-Dateien in das Verzeichnis outfile="xml-dir" generiert und der Reporttask diese Dateien dann einliest und in HTML-verwandelt.

siehe hier : JUnit Task

und hier : JUnitReport Task


----------



## quiddix (7. Dez 2009)

Hi,

das heißt dann also, dass ich den junitreport task garnicht brauche, da mir für mein hudson job sowieso die xml datei reicht.

Was war mit meinen anderen Fragen:

1. Ist classpath = der Pfad zu den Testklassen?
2. was soll das jvmarg ?
3. Ist ${testdir} nicht auch der Pfad zu den Testklassen und deshalb = classpath
4. Muss ich irgendetwas kompilieren (wird in vielen Tutorials gemacht)
5. woher weiß Hudson wo meine junit*.jar Bibliothek liegt?

Wie gesagt ne kurze Beispiel Ant-Skript Datei wäre eventuell sinnvoll


----------



## fastjack (7. Dez 2009)

> 1. Ist classpath = der Pfad zu den Testklassen?
> 2. was soll das jvmarg ?
> 3. Ist ${testdir} nicht auch der Pfad zu den Testklassen und deshalb = classpath
> 4. Muss ich irgendetwas kompilieren (wird in vielen Tutorials gemacht)
> 5. woher weiß Hudson wo meine junit*.jar Bibliothek liegt?


1. Das wäre Dein Klassenpfad, der die kompilierten tests beinhaltet und alle Libs, die diese brauchen.
2. kannst Du weglassen, dient z.B. das den Speicher hochzusetzen.
3. Sry, Fehlerteufel. "${testdir}.MyTests" soll eigentlich die vollqualifizierte TestSuite sein, also a.b.c.MyTests
${testdir} ist der Pfad indem die VM gestartet werden soll.
4. Vorher Tests kompilieren und z.B. Test-Jardatei erzeugen, oder Klassenpfad so machen, das er auf die Testclasses zeigt.
5. weis ich jetzt gerad selbst net  Bei mir ist es so, das die Projekte immer alle Libs beinhalten, z.B. in einem Lib-Verzeichnis. Dann hat Hudson auch keine Probleme.


----------



## quiddix (7. Dez 2009)

Hi

leider verstehe ich das ganze Ding nicht.
1. Klassenpfad = Pfad zu einer Klasse/n , wieso Libs bzw. welche Libs werden von Testfälle gebraucht? (eventuell 5.)
2. ok
3. TestSuite? also Pfad in dem sich die Tests befinden ? Also gleich wie 1. nur nicht kompiliert ?
4.  Bahnhof
5. 

Sorry das ich es noch einmal schreibe,
ich finde im Netz entweder nur Beispiele die Teilausschnitte zeigen (kompilieren wird nicht gemacht, keine Verzeichnisse erstellt ...) oder sehr komplexe Codeausschnitte via Google code Search.

Eventuell gibt es hier jemand, der ein einzelnes Ant-Skript für einen Test hat und das hier beispielhaft zur Vefüfung stellen könnte.

@Wildcard:
Kurze Nachfrage:
Ist ein Buckminster build Step die Auswahl "Run Buckminster" und könntest du deinen Tipp etwas genauer erläutern?
Was ist der Unterschied bzw. Vor-/Nachteil zur Methode mit Ant-Skripten?

Danke


----------



## Wildcard (7. Dez 2009)

Oh je, du hast von der Thematik noch nicht so viel Ahnung, oder? 
Vielleicht solltest du Hudson erstmal ganz aussen vor lassen und dich darauf konzentrieren wie man lokal Unit Tests ohne IDE ausführt.


> Ist ein Buckminster build Step die Auswahl "Run Buckminster" und könntest du deinen Tipp etwas genauer erläutern?


Ja, "Run Buckminster". Allerdings sollte dein Build selbst dann auch mit Buckminster laufen anstatt mit Ant oder was auch immer du zur Zeit verwendest.


> Was ist der Unterschied bzw. Vor-/Nachteil zur Methode mit Ant-Skripten?


Der Vorteil ist, das du keine extra Ant-Scripts brauchst, dich nicht darum kümmern musst wie man die Tests kompiliert und wo man die Dependencies herbekommt, du keine TestSuite brauchst und die Tests out of the box genau so ablaufen wie in Eclipse.


----------



## quiddix (7. Dez 2009)

Hi,
bis jetzt habe ich nur JUnittests geschreiben und direkt in Eclipse die Analyse gemacht. Auch mit Ant Buckminster Hudson etc. hatte ich bis vor 2-3 Woche noch garnichts zu tun. Mein Build läuft aktuell mit Buckminster und nicht mit Ant. Lediglich Checkstyle verwendet ein Ant skript, das aber viel leichter zum schreiben war.

Könntest du mir schnell beschreiben was für ein Kommando ich übergeben muss.


----------



## Wildcard (7. Dez 2009)

Das macht die Sache natürlich einfacher.
Du brauchst allerdings den aktuellen Milestone von Buckminster 3.6 da viel Arbeit in Eclipse JDT/PDE getan werden musst bis der JUnit Code auch Headless läuft und diese Änderung konnten erst nach Galileo eingepflegt werden. 
Die Headless Update Site für 3.6 ist:
http://download.eclipse.org/tools/buckminster/headless-3.6
Sobald du auf Hudson ein Headless Buckminster 3.6 mit den benötigten Features installiert hast gehst du wie folgt vor:
Du öffnest den Lauch Configuration Wizard (Run -> Launch Configurations..., wählst deine Junit Launch Config aus (oder erstellst eine neue) und gehst dann auf Common -> Save As -> Shared File
Nun sollte beim ausführen eine *.launch erzeugt werden die du mit deinem Projekt eincheckst.
In Hudson musst du dann nur noch als eines der Buckminster commands

```
junit -l <path/to/yourJunit.launch> -o <path/where/your/junit/report/should/end/up>
```
ausführen.

Mit der 3.6er Version kannst du übrigens auch jede andere Art von Launch Configuration out of the box ausführen und es gibt auch support für Code Coverage Reports mit emma.


----------



## quiddix (8. Dez 2009)

Hi,

coole Sache danke für die Antwort.

Wie sieht es mit der Stabilität der 3.6 Version aus gibt es da irgendwelche Probleme?

Ich muss mich zunächst mit ein paar anderen Sachen beschäftigen, werde mich aber melden wenn alles geklappt hat.
Danke


----------



## quiddix (8. Dez 2009)

Hallo,

ich hab das ganze nun getestet und muss leider melden, dass es nicht funktioniert.
Ich habe mir den Buckminster headless build 3.6 mit dem p2 director heruntergeladen und die beiden Features hinzugefügt.
Danach habe ich alles in Hudson entsprechende konfiguriert.

In meinen Projekt wurde erfolgreiche eine launch Konfiguration angegeben.

UPDATE:

Hatte zwar ein paar kleien Probleme, aber jetzt läuft alles

bei -l darf man wohl nichts mit ${Workspace} angeben, sondern man befindet sich bereits im workspace und muss einfach /com.example.mail/<name>.launch angeben

Danke soweit


----------

