2009-03-11 6 views
22

Wir haben sowohl JUnit 4 migriert und Ant 1.7Running "reine" JUnit 4 Tests mit Ameise

Die Tests laufen in Eclipse in Ordnung, aber die Anmerkungen ignoriert werden, wenn die Tests laufen Ameise verwenden.

Nach der Ant junit Aufgabe documentation:

Es funktioniert auch mit JUnit 4.0, einschließlich "reinen" JUnit 4 Tests nur Anmerkungen und keine JUnit4TestAdapter verwenden.

Aber die Dokumentation führt nicht aus, wie es konfiguriert werden sollte.

Gibt es spezielle Einstellungen für die Junit-Aufgabe? Fehle ich etwas? Wir haben beide Tests, die TestCase (d. 3.8 Stil) und "reine" Junit 4 Tests erweitern, könnte das das Problem sein?

Antwort

14

Ich verwende reine JUnit4 Tests mit Ant.

Hier ist der interessante Teil meiner Build-Datei:

<junit printsummary="yes" haltonfailure="yes"> 
    <formatter type="xml"/> 
    <classpath refid="path.test"/> 
    <batchtest fork="yes" todir="${dir.report.unittests.xml}"> 
     <fileset dir="src"> 
      <include name="**/*Test*.java"/> 
     </fileset> 
    </batchtest> 
</junit> 

Stellen Sie sicher, dass die neueste Version der junit.jar Datei im Verzeichnis lib Ant haben. Soweit ich weiß, wird die benötigte Version mit einer Version mit Version 1.7 oder höher geliefert ...

+2

So gibt es keine Möglichkeit zu vermeiden, ein Benennungsmuster für Testklassen (wie "* Test.java") verwenden, obwohl JUnit 4 nicht benötigt Das? – Jonik

+0

@jonik Sie müssen kein Benennungsmuster verwenden, aber Sie können vermeiden, dass JUnit gegen zusätzliche Klassen ausgeführt wird, die möglicherweise keine Tests enthalten, die sich im selben Paket wie Ihre Testklassen befinden. Klassen wie diese geben Fehler in der JUnit-Ausgabe. – MikeD

+3

Was ist, wenn Sie Utility-Klassen haben, die Test am Anfang haben, aber keine Test-Klassen sind? Normalerweise bedeutet "JUnit 4 verwenden", dass "die @Test-Annotation Tests, nicht den Klassennamen markiert". Es sollte möglich sein, alle .java-Dateien einzuschließen und nur diejenigen mit Tests laufen zu lassen. – Trejkaz

0

Dies ist der relevante Teil meines generischen Ameisenskripts ... nicht sicher, ob Ihnen das hilft oder nicht.

<junit fork="true" 
     forkmode="once" 
     haltonfailure="false" 
     haltonerror="false" 
     failureproperty="tests.failures" 
     errorproperty="tests.errors" 
     includeantruntime="true" 
     showoutput="true" 
     printsummary="true"> 
    <classpath> 
     <path refid="path-id.test.classpath.run"/> 
    </classpath> 

    <formatter type="xml"/> 

    <batchtest fork="yes" 
       todir="${dir.build.testresults}"> 
     <fileset dir="${dir.src.tests}"> 
      <include name="**/*Test.java"/> 
     </fileset> 
    </batchtest> 
</junit> 
-1

Was ich am Ende getan habe, war das Hinzufügen einer Ant zu einer meiner Definitionen, die von der Aufgabe> verwendet wird. Et voila.

0

diese Anmerkung zu den anderen Klassen Nehmen

org.junit.Ignore
1

Classpath Definition Überprüfen ... das ist mein Problem gelöst.

<path id="classpath" description="Classpath do Projeto"> 
    <fileset dir="${LIB}"> 
     <include name="**/*.jar" /> 
     <exclude name="**/.SVN/*.*"/> 
    </fileset> 
</path> 
2

Das passierte mir und es war, weil ich sowohl Anmerkungen verwendete als auch TestCase erweiterte.

Wenn Sie TestCase erweitern, nehmen Sie JUnit3-Stil an, sodass JUnit4-Annotationen ignoriert werden.

Die Lösung ist, TestCase zu erweitern.

6

Ant wird standardmäßig mit einer Version von JUnit 3 ausgeliefert. JUnit 3 unterstützt keine Testanmerkungen.

Um die JUnit 4-Annotationen aus der Junit-Task zu verwenden, stellen Sie sicher, dass Sie die Position eines JUnit 4-Jars in einem verschachtelten Klassenpfadelement der Junit-Task angeben (siehe this entry in the ant FAQ).

<junit showoutput="yes" fork="true"> 
    <classpath> 
     <!-- The location of the JUnit version that you want to use --> 
     <pathelement location="lib/junit-4.9b1.jar"/> 
    </classpath> 

    <formatter type="plain" usefile="false" /> 

    <batchtest> 
     <fileset dir="${tests.dir}"/> 
    </batchtest> 
</junit> 

Dies ist eine bevorzugte Lösung, um die Ameisen junit.jar in ANT_HOME/lib zu überschreiben, da es bedeutet, dass Sie Ihr JUnit Glas in der Quellcodeverwaltung neben Ihrem Code macht Upgrades zu höheren Versionen einfach zu halten.

Beachten Sie, dass, obwohl ich oben kein Include-Muster in meiner Dateigruppe angegeben habe, dass der Junit-Task versucht, JUnit gegen alle Klassen in dieser Verzeichnisstruktur auszuführen, was dazu führen könnte, dass eine Anzahl von Klassen enthalten ist enthalten keine Tests, abhängig davon, wie Sie Ihre Quelldateien strukturiert haben.

+0

Ich habe genau das gleiche Problem in Debian: ant 1.8.0, junit 4.10, der classpath zu junit-4.10.jar wurde als Teil der junit-Aufgabe hinzugefügt und trotzdem wird die Annotation @Task nicht erkannt, nur das Umbenennen der Methoden, um mit test zu beginnen * funktioniert ... –

+0

@ MenelaosPerdikeas Meintest du '@ Task'? Ich würde erwarten, dass Sie "@ Test" als Anmerkung verwenden. Angenommen, Sie verwenden '@ Test', versuchen Sie, ant mit dem Flag -v auszuführen, und die Ausgabe der Junit-Task zeigt einen Klassenpfad an. Sie können dann sicherstellen, dass der Klassenpfad junit-4.10.jar, den Sie der Aufgabe hinzugefügt haben, vorhanden ist. Ich fand -V wirklich hilfreich, wenn Sie versuchen, dieses Problem zu diagnostizieren. – MikeD

+0

Ich hatte genau dieses '' Element mit Ausnahme der Option 'fork =" true "'. Hinzufügen dieser Option löste es für mich. – Darkhogg

3

Sie können schließlich nur Tests finden und ausführen mit dem skipNonTests Parameter in Ant 1.9.3 + hinzugefügt!

Dies ist der Code-Schnipsel aus der akzeptierten Antwort oben (mit Ausnahme die neuen skipNonTests Parameter und immer von dem „Test“ im Dateinamen Anforderung befreien):

<junit printsummary="yes" haltonfailure="yes"> 
    <formatter type="xml"/> 
    <classpath refid="path.test"/> 
    <batchtest skipNonTests="true" fork="yes" todir="${dir.report.unittests.xml}"> 
     <fileset dir="src"> 
      <include name="**/*.java"/> 
     </fileset> 
    </batchtest> 
</junit> 
+0

Ja, es ist großartig, dass sie das endlich hinzugefügt haben. Nun, wenn sie nur alles reparieren könnten - sonst in Ant, könnte Ant tatsächlich ein nettes Werkzeug werden. Haha. – Trejkaz

0

Ich versuchte auch Tests zu tun mit JUnit 4.0 ohne JUnit4TestAdapter, dh ohne Methode
public static junit.framework.Test suite() { return neues JUnit4TestAdapter (SomeTestClass.class); }

Ich benutze Ant 1.9.4. Lauf ant-Test ausführliche (ant -v) zeigt

[junit] Ausführen mehrerer Tests in der gleichen VM
[junit] Implizit Zugabe /usr/share/java/junit.jar:/usr/sharejava/ ant-launcher.jar: /usr/share/java/ant.jar: /usr/share/java/ant/ant-junit.jar

Aha ClassPath, aber noch gibt es einige Ameisen junit- Aufgabe. Das Herunterladen zeigt zusätzlich /usr/share/java/ant/ant-junit4.jar, das nicht implizit hinzugefügt wird. Ich habe es nur ausdrücklich:

<junit printsummary="yes" 
    fork="yes" 
    forkmode="once" 
    maxmemory="1023m" 
    showoutput="no"> 
    ... 
    <classpath> 
    <pathelement path="...:${junitJar}:${hamcrestJar}:/usr/share/java/ant/ant-junit4.jar" /> 
    </classpath> 
... 
</junit> 

und es funktionierte. Ohne: nein. Ich bin mir bewusst, dass diese Lösung nicht schön ist ...