2016-05-24 31 views
0

Ich verwende Apache Ant, um JUnit-Tests zu kompilieren und auszuführen. Im Moment wird an Umgebungen gearbeitet, in denen die ant JUnit-Bibliothek als Teil von Ant installiert ist, aber nicht in anderen Umgebungen. Ich möchte das beheben. Ich habe versucht, die erforderlichen Gläser (junit-4.12.jar und hamcrest-core-1.3.jar, wenn ich es richtig verstehe), aber es funktioniert nicht. Der relevante Teil meiner build.xml ist wie folgt:Das Ausführen von JUnit von Apache Ant mit enthaltener JAR-Datei führt zu "JUnitTask wurde nicht gefunden"

<property name="build.path" location="build/src"/> 
    <property name="build.test.path" location="build/test"/> 
    <property name="lib.path.rel" value="lib"/> 
    <property name="junit.file" value="${lib.path.rel}/junit/junit-4.12.jar"/> 
    <property name="hamcrest.file" value="${lib.path.rel}/junit/hamcrest-core-1.3.jar"/> 

    <path id="junit.class.path"> 
    <pathelement location="${junit.file}"/> 
    <pathelement location="${hamcrest.file}"/> 
    <pathelement location="${build.path}"/> 
    </path> 

    <target name="test-compile" depends="test-clean"> 
    <mkdir dir="${build.test.path}"/> 

    <javac srcdir="${test.path}" 
      destdir="${build.test.path}" 
      includeantruntime="false"> 
     <classpath refid="junit.class.path" /> 
    </javac> 
    </target> 

    <target name="test" depends="test-compile"> 
    <junit> 
     <classpath> 
     <path refid="junit.class.path"/> 
     <pathelement location="${build.test.path}"/> 
     </classpath> 
     <batchtest> 
     <fileset dir="${build.test.path}"> 
      <include name="**/*Test*"/> 
     </fileset> 
     </batchtest> 
     <formatter type="brief" usefile="false"/> 
    </junit> 
    </target> 

Die Aufgabe test-compile erfolgreich die Tests baut.
Die Aufgabe test führt jedoch zu dem folgenden Fehler:
Problem: failed to create task or type junit Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.

Ich bin mit CentOS 7 mit Ant 1.9.2, und obwohl ich denke, dass es sinnvoll ist es, Benutzer zu verlangen Ant auf die neueste Version zu aktualisieren, verfügbar, Ich habe keine Kontrolle darüber, welche Betriebssysteme und Bibliotheken sie installiert haben. Als solches möchte ich das Problem nicht durch yum install something oder whatnot lösen, sondern indem ich einen Weg finde, die JUnit-Jar-Dateien richtig zu benutzen (wenn das möglich ist). Wenn sie dann das git-Repository abrufen und die Aufgabe ausführen, funktioniert sie auf jedem Betriebssystem oder jeder Umgebung (da sie eine JAR-Datei verwenden, die sie gerade gezogen haben). Offensichtlich bedeutet dies auch, dass "nur die Gläser in die Ant lib dir legen" wird keine praktikable Lösung sein.
Vielen Dank.

+0

Haben Sie darüber nachgedacht Maven mit der notwendigen jar herunterladen? Wenn das nicht helfen könnte: http://stackoverflow.com/questions/25628253/ant-junit-task-where-to-download-ant-junit-jar-and-where-to-put-it – Gildraths

Antwort

1

Um diesen Fehler zu beheben, müssen Sie das JAR übergeben, das die JUnitTask definiert. Dieses Glas ist ant-junit.jar genannt und Sie können entweder (von JUnit task documentation):

  1. sowohl junit.jar Setzen und Ameisen junit.jar in ANT_HOME/lib.
  2. Fügen Sie nicht entweder ANT_HOME/lib ein, und fügen Sie stattdessen ihre Speicherorte in Ihre Umgebungsvariable CLASSPATH ein.
  3. Fügen Sie beide JARs Ihrem Klassenpfad mit -lib hinzu.
  4. Geben Sie die Positionen beider JARs mithilfe eines <classpath> Elements in einer <taskdef> in der Builddatei an.
  5. Belassen Sie an ihrem Standardstandort in ANT_HOME/lib die Datei ant-junit.jar, aber fügen Sie junit.jar in die übergebene Datei ein. (Da Ant 1,7)

Für die Option 4, müssen Sie nur auf Ihre Ameise fügen Sie eine Erklärung bauen wie:

<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"> 
    <classpath> 
    <pathelement location="${lib}/ant-junit.jar"/> 
    <pathelement location="${lib}/ant-junit4.jar"/> 
    </classpath> 
</taskdef> 
+0

Vielleicht ich Du hast dich falsch verstanden, aber deine Lösung scheint das Problem in die richtige Richtung zu bringen, aber nicht zu lösen: Das Ergebnis, das ich bekam, war, wenn ich den junit für JUnit 4 verwende: 'taskdef class org.apache.tools.ant.taskdefs .optional.junit.JUnitTask kann nicht gefunden werden und für die Pre-4-Version werden die Tests tatsächlich ausgeführt, geben aber den Fehler "junit.framework.AssertionFailedError: No tests found". Meine Tests sind für JUnit 4 geschrieben (No 'erweitert TestCase' mit '@Test'-Annotationen) und ich verwende die JUnit 4-Bibliothek. Wenn Sie also weitere Ratschläge haben, wie es für JUnit 4 funktioniert, wäre es das sehr geschätzt. – StubbornShowaGuy

+0

@StubbornShowaGuy Sie haben Recht: Für JUnit 4 Tests müssen Sie auch 'ant-junit4.jar' zum Klassenpfad des Taskdefs hinzufügen (siehe meine bearbeitete Antwort). Ich entferne auch 'junit-4.12.jar' und' hamcrest-core-1.3.jar' aus diesem Klassenpfad, da sie nicht für die Taskdef-Deklaration benötigt werden und Sie diese bereits zum 'junit'-Task-Klassenpfad in Ihrem Build hinzufügen. Hoffe, dass es dein Problem löst –

+0

Ich habe das gerade gemacht, und jetzt funktioniert es perfekt. Vielen Dank! – StubbornShowaGuy