Ant Hudson/Jenkins, Ant und JUnit unter einen Hut bringen

gurkensalat

Mitglied
Hallo,

ich habe folgendes Problem: Es ist ein Jenkins Server gegeben, auf dem Ant-Build/Deploymentscripte ausgeführt werden. Ich möchte gerne, dass JUnit Testklassen ausgeführt werden und das Ergebnis in der Jenkinsoberfläche schön dargestellt wird (Das soll ja anscheinend gehen, wenn man der Homepage von Jenkins glaubt).

Ich habe weder mit Ant, noch mit Jenkins/Hudson vorher was gemacht. In Java bin ich fit, also JUnit auch. Nachdem ich heute schon seit 8 Uhr am rumgooglen bin und es einfach nicht funktioniert, erkläre ich euch mal, was ich alles gemacht habe.

Für den Einstieg habe ich eine einfache Testklasse gemacht:
Code:
package testing;

import junit.framework.TestCase;

public class AusprobierenTest extends TestCase{
	public void testMethode1(){
		assertTrue(true);
	}
}
Und dazu eine build.xml:
Code:
<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">

     <property name="src" value="."/>
     <property name="build" value="build"/>
	 <property name="test.reports" value="./reports" />

     <target name="init">
          <mkdir dir="${build}"/>
     </target>

     <target name="compile" depends="init">
          <javac srcdir="${src}" destdir="${build}"/>
     </target>
	
	 <target name="test-html">
	 	<junit fork="yes" printsummary="no" haltonfailure="no">
	    	<batchtest fork="yes" todir="${test.reports}" >
	        	<fileset dir="${classes}">
	        		<include name="testing/**/AusprobierenTest.class" />
	        	</fileset>
	    	</batchtest>
	    	<formatter type="xml" />
	   	    <classpath refid="test.classpath" />
	  	</junit>

	    <junitreport todir="${test.reports}">
	    	<fileset dir="${test.reports}">
	      		<include name="TEST-*.xml" />
	    	</fileset>
	    	<report todir="${test.reports}" />
	    </junitreport>
	</target>
</project>

Das habe ich mir mehr oder weniger aus den Tutorials von Google zusammengebastelt. Ob das stimmt, kann ich aufgrund meines fehlenden Ant Wissens nicht nachvollziehen.
In Jenkins habe ich einen neuen Job angelegt. Den Sourcecode bekommt er über SVN. Dann habe ich noch ein Häckchen bei "Veröffentliche JUnit-Testergebnisse." gesetzt und überlegt was man bei "Testberichte in XML-Format" darunter angeben soll. Hab da verschiedene Eingaben versucht und dann immer nen Build gemacht, aber immer vergebens.
Habe ich irgendwas grundlegendes falsch gemacht? Gibt es irgendwie ein Beginnertutorial für dieses Problem?
 

dayaftereh

Top Contributor
Hey... also um das ganze nutzen zu können muss du eine Names vorschifft für die JUnit test Klassen festlegen. Ich mache immer alle die auf Test enden!
[XML]
<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">

<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="test.reports" value="reports" />

<target name="init">
<mkdir dir="${build}"/>
</target>

<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}"/>
</target>

<target name="test" depends="compile" description="JUnit-Tests durchführen">
<delete dir="${test.reports}" />
<mkdir dir="${test.reports}" />
<junit printsummary="yes" fork="yes" haltonfailure="no">
<classpath location="${build}" />
<formatter type="xml" />

<batchtest todir="${test.reports}">
<fileset dir="${src}">
<include name="**/*Test.java" />
</fileset>
</batchtest>
</junit>
<echo message="Fertig, Testergebnisse im Verzeichnis ${test.reports}" />
</target>

</project>
[/XML]

Also das Ant-Skript compeilt jetzt alle java Klassen aus dem src Ordnern in den build ordner und führt dann die JUnit tests aus.. wo dann die JUnit Berichte unter dem ordner "reports" abgelegt wird. du musst dem jenkins jetzt nur sagen wo her die JUnit reports findet: reports/

Wenn du Eclipse nutzt kannst du auch so mal das Ant-Skript ausführen und schauen was für fehler in der Console kommen! Oder beim Jenkins mal die Konnsolen ausgabe prüfen!
 

Wildcard

Top Contributor
Wenn Ant kein hartes Requirement ist, dann würde ich mir eher Maven anschauen. Dann musst du in Hudson/Jenkins gar nichts mehr konfigurierem weil es eine tolle Maven Unterstützung gibt. Die Unit Tests werden automatisch ausgeführt und die Ergebnisse werden automatisch in Hudson dargestellt.
 

gurkensalat

Mitglied
Vielen Dank für eure Hilfe. Habe das Antscript so übernommen und "reports/" in Jenkins angegeben, wo er die Reports findet.
Ant ist eine harte Anforderung, da lässt sich leider nichts machen :)

Also, als ich das ganze in Eclipse ausgeführt habe, kam folgendes:
Code:
Buildfile: /Users/xxxxx/Documents/workspace/JUnittest/build.xml
init:
compile:
    [javac] Compiling 1 source file to /Users/xxxxx/Documents/workspace/JUnittest/build
    [javac] /Users/xxxxx/Documents/workspace/JUnittest/src/testing/AusprobierenTest.java:3: package junit.framework does not exist
    [javac] import junit.framework.TestCase;
    [javac]                       ^
    [javac] /Users/xxxxx/Documents/workspace/JUnittest/src/testing/AusprobierenTest.java:5: cannot find symbol
    [javac] symbol: class TestCase
    [javac] public class AusprobierenTest extends TestCase{
    [javac]                                       ^
    [javac] /Users/xxxxx/Documents/workspace/JUnittest/src/testing/AusprobierenTest.java:7: cannot find symbol
    [javac] symbol  : method assertTrue(boolean)
    [javac] location: class testing.AusprobierenTest
    [javac] 		assertTrue(true);
    [javac] 		^
    [javac] 3 errors

BUILD FAILED
/Users/xxxxx/Documents/workspace/JUnittest/build.xml:13: Compile failed; see the compiler error output for details.

Total time: 939 milliseconds
Das ist komisch, denn ich habe das JUnit Framework 100%ig in den Classpath eingefügt, siehe Screenshot im Anhang.

In Jenkins kam dann folgende Konsolenausgabe:
Code:
Gestartet durch Benutzer anonymous
Updating http://xxxxxx/svn/trunk/JUnittest
U         .classpath
D         src/teesting
A         src/testing
A         src/testing/AusprobierenTest.java
U         build.xml
At revision xxxx
Zeichne Testergebnisse auf.
Keine JUnit-Testergebnisse gefunden. Liegt vielleicht ein Konfigurationsfehler vor?
Build step 'Veröffentliche JUnit-Testergebnisse.' changed build result to FAILURE
Finished: FAILURE

Ich habe entsprechende Informationen mit xxxx zensiert, zur Info.


EDIT: Ich habe ja viel gegoogelt, aber nicht wirklich viel gefunden, weil ich teilweise Suchbegriffe wie "Jenkins JUnit" verwendet habe, obwohl man mit "Hudson JUnit" viel mehr finden würde etc. Gibt es generell (vllt auch offiziell) eine Dokumentation dazu, wie man JUnit auf Hudson/Jenkins ablaufen lassen kann? Ich finde einfach nichts brauchbares. Besonders die Jenkins Homepage sieht sehr mager aus, habe ich das Gefühl.
 

Anhänge

  • eclipse junit.jpg
    eclipse junit.jpg
    68,3 KB · Aufrufe: 50

kama

Top Contributor
Hallo,

der Screenshot ist von einem Mac... ;-)

die Fehlermeldung rührt daher, dass Du für den Ablauf als auch zur Übersetzung junit-x.y.z.jar im Classpath haben musst...also sprich runter laden und in ein Verzeichnis legen (typischerweise lib). Dann muss das auch mit eingecheckt werden. Nach dem Screenshot verwendest Du auch hamcrest, dass heißt auch das runterladen und in das lib Verzeichnis leben und zum classpath für die Compilierung und die Laufzeit hinzufügen...

Weiterhin würde ich die sourcen und die unit tests in unterschiedliche Verzeichnisse legen (z.B. src/main/java bzw. src/test/java.). entsprechende Resourcen src/main/resources und src/test/resources...
Apropos ist es wichtig, dass die Unit Tests und der produktive Code die gleiche Package Struktur haben..

Was ich nicht verstehe ist warum Ant gesetzt ist? Das bedeutet doch viel mehr arbeit als die Anwendung von Maven (wie schon von Wildcard angemerkt)...und in Maven bekommt man so viel out-of-the-box geliefert...(unit testing, reporting, dependency management etc.)

Zur Dokumentation von Jenkins / Hudson empfehle ich:
Jenkins: The Definitive Guide

Achso zur Nutzung in Jenkins musst Du jenkins selbstverständlich auch mitteilen, wo der die XML Datei mit den Ergebnissen finden kann (?/reports/*.xml ?)

Gruß
Karl Heinz Marbaise
 

gurkensalat

Mitglied
die Fehlermeldung rührt daher, dass Du für den Ablauf als auch zur Übersetzung junit-x.y.z.jar im Classpath haben musst...also sprich runter laden und in ein Verzeichnis legen (typischerweise lib). Dann muss das auch mit eingecheckt werden. Nach dem Screenshot verwendest Du auch hamcrest, dass heißt auch das runterladen und in das lib Verzeichnis leben und zum classpath für die Compilierung und die Laufzeit hinzufügen...
Ja, das habe ich doch dem Screenshot nach ja schon gemacht? Es ist unter Lib zu sehen. Habe ich eventuell eine falsche JUnit Version? Meinst du das? Welche Version brauch ich denn?

Weiterhin würde ich die sourcen und die unit tests in unterschiedliche Verzeichnisse legen (z.B. src/main/java bzw. src/test/java.). entsprechende Resourcen src/main/resources und src/test/resources...
Da hast du natürlich Recht. Da ich aber erstmal nur "Ausprobieren/Rumspielen" wollte, wie das generell mit JUnit und Jenkins funktioniert, war mir das erstmal egal :D

Was ich nicht verstehe ist warum Ant gesetzt ist? Das bedeutet doch viel mehr arbeit als die Anwendung von Maven (wie schon von Wildcard angemerkt)...und in Maven bekommt man so viel out-of-the-box geliefert...(unit testing, reporting, dependency management etc.)
Ist leider so vorgegeben in unserer Firma. Da kann ich leider nichts machen.
 

kama

Top Contributor
Hi,

Ja, das habe ich doch dem Screenshot nach ja schon gemacht? Es ist unter Lib zu sehen. Habe ich eventuell eine falsche JUnit Version? Meinst du das? Welche Version brauch ich denn?
In Eclipse ist die eingebunden aber nicht in Deinem Ant Script...das bedeutet Du musst die junit.jar runterladen (oder aus dem Ordner von Eclispe kopieren) und in einen Lib Ordner ablegen....und dann entsprechend in Deinem Ant Script nutzen...

Da hast du natürlich Recht. Da ich aber erstmal nur "Ausprobieren/Rumspielen" wollte, wie das generell mit JUnit und Jenkins funktioniert, war mir das erstmal egal :D
Dann ist das ja kein Problem...

Ist leider so vorgegeben in unserer Firma. Da kann ich leider nichts machen.
Dann haben die zu viel Geld...Alleine schon die Zeit die Du jetzt dafür benötigst die einfachsten Sachen ans laufen zu kriegen kostet und mit Maven wäre das schon längst erledigt...und Du würdest Dich um wichtigere Sachen kümmern....

Gruß
Karl Heinz Marbaise
 

gurkensalat

Mitglied
In Eclipse ist die eingebunden aber nicht in Deinem Ant Script...das bedeutet Du musst die junit.jar runterladen (oder aus dem Ordner von Eclispe kopieren) und in einen Lib Ordner ablegen....und dann entsprechend in Deinem Ant Script nutzen...
Okay, habe in meinem Workspace in meinem Projektordner einen Ordner "lib" angelegt und dort dieselber junit.jar Datei hineinkopiert, wie sie auch in meinem Eclipse Build Path ist.

Was noch nicht ganz klar ist: "entsprechend in Deinem Ant Script nutzen".
Code:
<target name="test" depends="compile" description="JUnit-Tests durchführen">
	     <delete dir="${test.reports}" />
	     <mkdir dir="${test.reports}" />
	     <junit printsummary="yes" fork="yes" haltonfailure="no">        
	         <classpath location="${build}" />       
	         <formatter type="xml" />
	 
	         <batchtest todir="${test.reports}">
	             <fileset dir="${src}"> 
	                 <include name="**/*Test.java" /> 
	             </fileset>
	         </batchtest>
	     </junit>
	     <echo message="Fertig, Testergebnisse im Verzeichnis ${test.reports}" />
     </target>
Ich gehe stark davon aus dass es was mit <classpath location="${build}" /> zu tun hat? Soll ich da den Pfad auf den neu angelegten "lib" Ordner setzen?
 

mvitz

Top Contributor
z.B. so:

[XML]...
<classpath>
<pathelement path="${build}" />
<fileset dir="lib" includes="*.jar" />
</classpath>
...[/XML]
 

gurkensalat

Mitglied
Danke, aber das funktioniert noch nicht so ganz.
Code:
<target name="test" depends="compile" description="JUnit-Tests durchführen">
	     <delete dir="${test.reports}" />
	     <mkdir dir="${test.reports}" />
	     <junit printsummary="yes" fork="yes" haltonfailure="no">        
	     	<classpath>
	     	  <pathelement path="${build}" />
	     	  <fileset dir="lib" includes="*.jar" />
	     	</classpath>       
	         <formatter type="xml" />
	 
	         <batchtest todir="${test.reports}">
	             <fileset dir="${src}"> 
	                 <include name="**/*Test.java" /> 
	             </fileset>
	         </batchtest>
	     </junit>
	     <echo message="Fertig, Testergebnisse im Verzeichnis ${test.reports}" />
     </target>
Ich habe den "lib" Ordner erstmal auf der ersten Ebene innerhalb meines Projektordners gelassen. Da hat es nicht geklappt. Da nach deinem Antscript ja <pathelement path="${build}" /> angegeben wurde, dachte ich, das man den Ordner "lib" eventuel in den "build"-Ordner schiebt. Das habe ich getan, auch dann funktionierte es nicht. Mh, reden wir aneinander vorbei? Steh ich auf dem Schlauch?
 

mvitz

Top Contributor
Hab dir mal ein Beispiel gemacht, wie es bei mir ohne Probleme läuft. Das Verzeichnis, welches du anschließend in Jenkins für die Reports referenzieren musst ist: target/testreports

Beachte, dass du die beiden folgenden JARs noch in lib/test packen musst:

http://repo1.maven.org/maven2/junit/junit-dep/4.8.2/junit-dep-4.8.2.jar
http://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar

Edit: Habe mal noch ein paar Sachen hinzugefügt -->
[XML]<?xml version="1.0" encoding="UTF-8"?>
<project name="de.mvitz.examples.ant.junit" default="package" basedir=".">

<property name="src.dir" value="${basedir}/src" />
<property name="src.main.dir" value="${src.dir}/main" />
<property name="src.main.java.dir" value="${src.main.dir}/java" />
<property name="src.test.dir" value="${src.dir}/test" />
<property name="src.test.java.dir" value="${src.test.dir}/java" />

<property name="lib.dir" value="${basedir}/lib" />
<property name="lib.compile.dir" value="${lib.dir}/compile" />
<property name="lib.test.dir" value="${lib.dir}/test" />

<property name="target.dir" value="${basedir}/target" />
<property name="target.classes.dir" value="${target.dir}/classes" />
<property name="target.test.classes.dir" value="${target.dir}/testclasses" />
<property name="target.test.report.dir" value="${target.dir}/test-reports" />
<property name="target.javadoc.dir" value="${target.dir}/javadoc" />

<path id="main.compile.cp">
<fileset dir="${lib.compile.dir}" includes="*.jar" />
</path>
<path id="test.compile.cp">
<path refid="main.compile.cp" />
<path location="${target.classes.dir}" />
<fileset dir="${lib.test.dir}" includes="*.jar" />
</path>
<path id="test.run.cp">
<path refid="test.compile.cp" />
<path location="${target.test.classes.dir}" />
</path>

<target name="clean">
<delete dir="${target.dir}" />
</target>

<target name="prepare">
<mkdir dir="${target.dir}" />
</target>

<target name="main.compile" depends="prepare">
<mkdir dir="${target.classes.dir}" />
<javac srcdir="${src.main.java.dir}" destdir="${target.classes.dir}" classpathref="main.compile.cp" includeantruntime="false" />
</target>

<target name="test.compile" depends="main.compile">
<mkdir dir="${target.test.classes.dir}" />
<javac srcdir="${src.test.java.dir}" destdir="${target.test.classes.dir}" classpathref="test.compile.cp" includeantruntime="false" />
</target>

<target name="test.run" depends="test.compile">
<mkdir dir="${target.test.report.dir}" />
<junit fork="yes">
<formatter type="xml" />
<classpath refid="test.run.cp" />
<batchtest todir="${target.test.report.dir}">
<fileset dir="${src.test.java.dir}" includes="**/*Test.java" />
</batchtest>
</junit>
</target>

<target name="package" depends="test.run">
<jar destfile="${target.dir}/${ant.project.name}.jar" basedir="${target.classes.dir}" />
</target>

<target name="javadoc" depends="javadoc.generate, javadoc.jar" />

<target name="javadoc.generate" depends="prepare">
<mkdir dir="${target.javadoc.dir}" />
<javadoc destdir="${target.javadoc.dir}" sourcepath="${src.main.java.dir}" />
</target>

<target name="javadoc.jar" depends="javadoc.generate">
<jar destfile="${target.dir}/${ant.project.name}-javadoc.jar" basedir="${target.javadoc.dir}" />
</target>

<target name="sources" depends="prepare">
<jar destfile="${target.dir}/${ant.project.name}-sources.jar" basedir="${src.main.java.dir}" />
</target>

</project>[/XML]

Das Jenkins Projekt ist folgendermaßen konfiguriert:
Code:
"Free Style"-Softwareprojekt
+- Buildverfahren
|  \- Ant aufrufen
|      \- Target: clean package javadoc sources
\- Post-Build-Aktionen
   +- Artefakte archivieren
   |   \- Dateien, die archiviert werden sollen: target/*.jar
   +- Javadoc veröffentlichen
   |   \- Javadoc-Verzeichnis: target/javadoc
   \- Veröffentliche JUnit-Testergebnisse.
       \- Testberichte in XML-Format: target/test-reports/*.xml
 

Anhänge

  • de.mvitz.examples.ant.junit.zip
    5,4 KB · Aufrufe: 23
Zuletzt bearbeitet:

gurkensalat

Mitglied
Vielen Dank, das hat mir schon mal sehr viel weiter geholfen :)

Die Konsolenausgabe in Jenkins sieht nun etwas anders aus, dennoch ist der Build nicht erfolgreich (in Eclipse schon).
Code:
BUILD FAILED
Target "javadoc" does not exist in the project "de.mvitz.examples.ant.junit". 

Total time: 1 second
Build step 'Ant aufrufen' marked build as failure
Archiviere Artefakte
Veröffentliche Javadocs
Zeichne Testergebnisse auf.
Finished: FAILURE
Muss man javadoc evtl selber anlegen vorher?
 

mvitz

Top Contributor
Du müsstest die build.xml aus dem ZIP mt der von mir geposteten ersetzen (die gepostete war aktueller als die hochgeladene)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Hudson/Buckminster: Verschiedene Fragen Tools - Maven, Gradle, Ant & mehr 12
A Hudson-Buckminster wirft Exception nach SVN Checkout Tools - Maven, Gradle, Ant & mehr 3
B Hudson - start all jobs Tools - Maven, Gradle, Ant & mehr 6
B Maven Mulimodul projekte in Hudson Tools - Maven, Gradle, Ant & mehr 2
Q Hudson JUnit Testcases durchführen Tools - Maven, Gradle, Ant & mehr 13
T Buckminster-Hudson RCP-Build "CSpec source required" Tools - Maven, Gradle, Ant & mehr 9
B Hudson weiter... Tools - Maven, Gradle, Ant & mehr 3
B Hudson - Resourcen laden Tools - Maven, Gradle, Ant & mehr 11
N Maven2 Projekt unter Hudson mit SVN Repository erstellen Tools - Maven, Gradle, Ant & mehr 4
L Jenkins Build mit git Hashwert Tools - Maven, Gradle, Ant & mehr 2
H Jenkins aktulles Checkstyle Plugin Tools - Maven, Gradle, Ant & mehr 2
OnDemand Jenkins Pipeline Build > Send Info Jira Tools - Maven, Gradle, Ant & mehr 3
H Nutzung einer eigenen checkstyle Konfiguration in Jenkins - Grundsätzliches Tools - Maven, Gradle, Ant & mehr 2
H Jenkins keine Tests gefunden - aber in Maven Tools - Maven, Gradle, Ant & mehr 30
P Mit Maven einen spezifischen Branch nach Tag-Parameter erstellen (in Jenkins-Job) Tools - Maven, Gradle, Ant & mehr 3
H Jenkins - maven-jar-plugin - kein jar-file Tools - Maven, Gradle, Ant & mehr 38
H Jenkins - Publish Coverage Report Tools - Maven, Gradle, Ant & mehr 19
H Maven Verbindung Java Projekt und Jenkins Build job Tools - Maven, Gradle, Ant & mehr 21
H Maven Bekomme cobertura in jenkins nicht zu laufen :-( Tools - Maven, Gradle, Ant & mehr 1
Thallius Jenkins -> git to zip? Tools - Maven, Gradle, Ant & mehr 5
Thallius Jenkins nur zip file erstellen? Tools - Maven, Gradle, Ant & mehr 3
G Maven Continious Integration mit Jenkins, Maven und Nexus - wie richtig? Tools - Maven, Gradle, Ant & mehr 1
B Jenkins Emal-Versand Tools - Maven, Gradle, Ant & mehr 5
K Subversion svn & Jenkins - Änderungen werden nicht angezeigt Tools - Maven, Gradle, Ant & mehr 4
Y Jenkins Zeitsteuerung Tools - Maven, Gradle, Ant & mehr 3
M Jenkins Rechte-Verwaltung Tools - Maven, Gradle, Ant & mehr 3
schalentier Probleme mit Jenkins Tools - Maven, Gradle, Ant & mehr 7
K Jenkins Konfiguration für einen multi-module Maven Projekt Tools - Maven, Gradle, Ant & mehr 2
G Probleme Jenkins mit Maven einzurichten Tools - Maven, Gradle, Ant & mehr 4
G Jenkins Userverwaltung Tools - Maven, Gradle, Ant & mehr 7
G Maven JMeter und Jenkins Tools - Maven, Gradle, Ant & mehr 1
X Maven Jenkins/maven - abhängige Projekte automatisch bauen Tools - Maven, Gradle, Ant & mehr 7
G Jenkins Task starten Tools - Maven, Gradle, Ant & mehr 16
K Spring JUnit Test: Code / Strukturierung / Beratung Tools - Maven, Gradle, Ant & mehr 9
P Maven Test werden nicht ausgeführt . Junit . Maven . Surefire . Eclipse Tools - Maven, Gradle, Ant & mehr 12
H Eclipse JUnit erzeugt Fehler im Maven-Test Tools - Maven, Gradle, Ant & mehr 1
D JUnit Test in Maven fail und in Eclipse erolgreich Tools - Maven, Gradle, Ant & mehr 4
GianaSisters Ant jUnit und Ant Problem Tools - Maven, Gradle, Ant & mehr 2
B Junit-Programm von Kommandozeile über Ant starten Tools - Maven, Gradle, Ant & mehr 20
A Fehler bei Junit Tests über Ant Tools - Maven, Gradle, Ant & mehr 2
H ANT - Kompilieren von JUnit-Tests Tools - Maven, Gradle, Ant & mehr 7
N Problem mit Ant Classpath und Junit: Relative Pfade Tools - Maven, Gradle, Ant & mehr 2
S JUnit-Tests mit Ant und assert Tools - Maven, Gradle, Ant & mehr 3

Ähnliche Java Themen


Oben