Les tests Ant Junit tournent beaucoup plus lentement via ant que via IDE - que regarder?


9

Je cours mes tests de junit via ant et ils courent sensiblement plus lentement que via l'IDE. Mon appel est fourmi:

<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> 

Le même test qui fonctionne dans près instantanément dans mon IDE (0.067s) prend 4.632s lorsqu'il est exécuté par Ant. Dans le passé, j'ai pu accélérer les problèmes de test en utilisant le paramètre junit fork mais cela ne semble pas aider dans ce cas. Quelles propriétés ou paramètres puis-je examiner pour accélérer ces tests?

Plus d'infos:

J'utilise le temps rapporté de l'IDE par rapport au temps que les sorties de la tâche JUnit. Ce n'est pas la somme des temps totaux rapportés à la fin de la course des fourmis.

Donc, bizarrement, ce problème s'est résolu. Qu'est-ce qui aurait pu causer ce problème? Le système fonctionne sur un disque local, ce qui n'est pas le problème.

+1

Est-ce que fork n'indiquerait pas une performance négative en générant un nouveau processus pour exécuter un seul test? Quel est le résultat lorsque vous ne l'utilisez pas? 23 sept.. 082008-09-23 19:13:09

+1

avec forkmode = "une fois" Je pensais qu'il exécuterait tous les tests junit dans un seul thread séparé. Il n'y a pas de changement de performance matérielle entre fork = "no et fork =" yes " 23 sept.. 082008-09-23 19:20:11

  0

Utilise-t-on le temps d'exécution de Ant ou JUnit? Ant fait beaucoup plus de travail (déterminer quels tests exécuter, probablement compiler) que de simplement lancer le test via l'IDE 23 sept.. 082008-09-23 21:18:10

1

Difficile à dire avec cette information. La première chose que je ferais est de regarder les résultats du test et de déterminer si tous les tests individuels sont exécutés uniformément plus lentement ou s'il peut être réduit à un certain sous-ensemble de cas de test.

(La chose zero'th je ferais est de vous assurer que ma tâche fourmi utilise la même machine virtuelle Java comme Eclipse et que les dépendances de classpath et JARs importés sont réellement et véritablement identiques)

+1

Les jars et la JVM sont les mêmes.Il semble que partout le test qui s'exécute en <1.0 seconde dans un IDE s'exécute en 3.5-4.5 secondes via ant 23 sept.. 082008-09-23 19:21:22


1

Peut-être que vous voyez que parce que Eclipse fait une compilation incrémentale et Ant ne le fait pas. Pouvez-vous confirmer que ce temps n'est perdu que dans la cible de test?

  0

Je vois aussi la tâche 'junit' Ce n'est vraiment pas la phase de compilation Le temps réel rapporté par JUnit est faible (par exemple: 'Tests exécutés: 21, Echecs: 0, Erreurs: 0, Temps écoulé: 0.034 s''), donc je m'attends à temps L'exécution de tous les tests dans IntelliJ prend environ deux secondes, mais les exécuter via la tâche 'junit' de Ant prend plus de 20 secondes 30 déc.. 122012-12-30 19:14:26


4

Voici une supposition aveugle: essayez d'augmenter la taille maximale du tas disponible pour la VM fourchue en utilisant une balise imbriquée <jvmarg> pour définir l'option -Xmx.

  0

J'allais le suggérer, tout en augmentant la taille du tas disponible pour Ant lui-même, aussi bien. 24 oct.. 082008-10-24 19:21:33


0

Pour la petite histoire, j'ai trouvé mon problème. Nous avons utilisé un obfuscator de code pour ce projet, et la partie de chiffrement de chaîne de cet obfuscator a été définie sur "maximum". Cela a ralenti toute opération où les chaînes étaient présentes. La réduction du cryptage des chaînes à un mode plus rapide a permis de résoudre le problème.


4

Je suppose que c'est parce que votre antscript affiche les résultats dans des fichiers XML, alors que l'IDE les garde en mémoire. Il faut plus de temps pour écrire un fichier que pour ne pas écrire un fichier.

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

C'est la partie du < batchtest> appel qui dit à coller les résultats dans ce répertoire. On dirait que ça ne marche pas, mais on lui dit de coller les résultats dans le "répertoire courant", quel qu'il soit. À première vue, je n'ai rien vu pour l'éteindre complètement.


0

fourchette réglage Essayez, forkmode et fils à ces valeurs:

<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> 

Voir aussi https://ant.apache.org/manual/Tasks/junit.html


0

Pour moi, ajoutant forkmode="once" pour l'élément <junit> et en ajoutant usefile="false" pour l'élément <formatter> rend l'exécution des tests beaucoup plus rapide. Retirez également les formateurs dont vous n'avez pas besoin.