2008-09-23 6 views
9

Ich starte meine Junit-Tests über ant und sie laufen wesentlich langsamer als über die IDE. Mein ant Anruf ist:Ant Junit Tests laufen viel langsamer über ant als über IDE - was zu sehen?

<junit fork="yes" forkmode="once" printsummary="off"> 
     <classpath refid="test.classpath"/> 
     <formatter type="brief" usefile="false"/> 
     <batchtest todir="${test.results.dir}/xml"> 
      <formatter type="xml"/> 
      <fileset dir="src" includes="**/*Test.java" /> 
     </batchtest> 
    </junit> 

Der gleiche Test, der augenblicklich in meinem IDE in der Nähe läuft (0.067s) 4.632s nimmt, wenn sie durch Ant laufen. In der Vergangenheit war ich in der Lage, Testprobleme wie diese zu beschleunigen, indem ich den junit fork-Parameter verwendete, aber dies scheint in diesem Fall nicht hilfreich zu sein. Welche Eigenschaften oder Parameter kann ich betrachten, um diese Tests zu beschleunigen?

Weitere Informationen:

Ich bin mit der gemeldeten Zeit von dem IDE gegen die Zeit, dass die junit Aufgabe Ausgänge. Dies ist nicht die Gesamtzeit, die am Ende des Ameisenlaufs gemeldet wird.

Also, bizarrerweise hat sich dieses Problem selbst gelöst. Was könnte dieses Problem verursacht haben? Das System läuft auf einer lokalen Festplatte, so dass das nicht das Problem ist.

+1

Würde nicht fork = ja die Leistung beeinträchtigen, indem ein neuer Prozess erzeugt wird, um einen einzelnen Test auszuführen? Was ist das Ergebnis, wenn Sie es nicht benutzen? –

+1

mit forkmode = "einmal" Ich dachte, dass es alle Junit-Tests in einem einzigen Thread ausführen würde. Es gibt keine wesentliche Leistungsänderung zwischen fork = "no" und fork = "yes". –

+0

Verwenden Sie Ant 'gemeldete Laufzeit oder JUnit's? Ant macht viel mehr Arbeit (Bestimmen, welche Tests ausgeführt werden sollen, wahrscheinlich Kompilieren) als nur das Ausführen des Testen Sie über die IDE –

Antwort

1

Schwer mit diesen Informationen zu sagen. Als erstes würde ich die Testergebnisse betrachten und feststellen, ob alle einzelnen Tests gleichmäßig langsamer laufen oder ob sie auf eine bestimmte Teilmenge von Testfällen beschränkt werden können.

(Die nullten, was ich machen tun würde, ist sicher, dass meine Ant-Task die gleiche JVM wie Eclipse verwenden und dass die Classpath Abhängigkeiten und importierte JAR-Dateien sind wirklich und wahrhaftig identisch)

+1

Die Gläser und JVM sind die gleichen.Es scheint, dass auf der ganzen Linie jeder Test, der in <1,0 Sekunde in einer IDE läuft in 3,5-4,5 Sekunden über Ant. –

1

Vielleicht, dass Sie sehen, weil Eclipse inkrementelles Kompilieren und Ant nicht tut. Können Sie bestätigen, dass diese Zeit nur im Testziel verschwendet wird?

+0

Ich sehe auch die 'Junit' Aufgabe Es dauert nicht lange, es ist definitiv nicht die Kompilierungsphase, die von JUnit gemeldete Zeit ist gering (zB: Tests laufen: 21, Fehler: 0, Fehler: 0, Zeit abgelaufen: 0.034 sec), also erwarte ich es ist Zeit Zwischen den Testsuiten dauert das Add-up. Die Ausführung aller Tests in IntelliJ dauert ungefähr zwei Sekunden, aber die Ausführung über Ant ''junit'-Task dauert näher bei 20 Sekunden. –

4

Hier ist eine blinde Schätzung: Versuchen Sie, die maximale verfügbare Heap-Größe für die gegabelte VM zu erhöhen, indem Sie einen verschachtelten <jvmarg>-Tag verwenden, um die Option -Xmx festzulegen.

+0

Ich würde dies vorschlagen, zusammen mit der für Ant verfügbaren Heap-Größe auch selbst. –

0

Für das Protokoll habe ich mein Problem gefunden. Wir haben einen Code-Obfuscator für dieses Projekt verwendet, und der String-Verschlüsselungsbereich dieses Obfuscators wurde auf "Maximum" gesetzt. Dies verlangsamte jeden Vorgang, bei dem Zeichenfolgen vorhanden waren.

Die Umstellung der String-Verschlüsselung auf einen schnelleren Modus hat das Problem behoben.

4

Ich vermute, bin es, weil Ihr antscript wird Ergebnisse in XML-Dateien outputing, während die IDE sind jene im Speicher zu halten. Das Schreiben einer Datei dauert länger als das Schreiben einer Datei.

todir="${test.results.dir}/xml" 

, dass der Teil des < batchtest> Anruf ist, dass es zu bleiben, die Ergebnisse in das Verzeichnis erzählt. Es sieht so aus, als ob er es auslassen würde, sagt ihm nur, dass er die Ergebnisse im "aktuellen Verzeichnis" speichern soll, was auch immer das ist. Auf den ersten Blick habe ich nichts gesehen, um es komplett abzuschalten.

0

Versuchen Sie, Gabel, forkmode und Threads auf diese Werte:

<junit fork="yes" forkmode="perTest" printsummary="off" threads="4"> 
    <classpath refid="test.classpath"/> 
    <formatter type="brief" usefile="false"/> 
    <batchtest todir="${test.results.dir}/xml"> 
     <formatter type="xml"/> 
     <fileset dir="src" includes="**/*Test.java" /> 
    </batchtest> 
</junit> 

Auch https://ant.apache.org/manual/Tasks/junit.html

0

Für mich sehen, das Hinzufügen forkmode="once" für das <junit> Element und das Hinzufügen von usefile="false" für das <formatter> Element macht die Tests laufen viel schneller. Entfernen Sie auch die Formatierer, die Sie nicht benötigen.