I test di Ant Junit sono in esecuzione molto più lenti tramite ant che tramite IDE: che cosa guardare?


9

Sto eseguendo i miei test junit tramite form e funzionano molto più lentamente rispetto all'IDE. Il mio invito formica è:

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

Lo stesso test che viene eseguito in prossimità istantaneamente nel mio IDE (0.067s) batte 4.632s quando viene eseguito attraverso Ant. In passato, sono stato in grado di velocizzare i problemi di test in questo modo utilizzando il parametro junit fork, ma in questo caso non sembra essere di aiuto. Quali proprietà o parametri posso osservare per accelerare questi test?

Maggiori informazioni:

Sto usando il tempo riportato dall'IDE contro il tempo che le uscite compito JUnit. Questa non è la somma del tempo totale riportato alla fine della corsa della formica.

Quindi, stranamente, questo problema si è risolto da solo. Cosa potrebbe aver causato questo problema? Il sistema funziona su un disco locale, quindi non è questo il problema.

+1

Non forchetta = sì ha danneggiato le prestazioni generando un nuovo processo per eseguire un singolo test? Qual è il risultato quando non lo usi? 23 set. 082008-09-23 19:13:09

+1

con forkmode = "once" Ho pensato che avrebbe eseguito tutti i test di junit in un singolo thread separato. Non c'è nessun cambio di peformance materiale tra fork = "no e fork =" yes ". 23 set. 082008-09-23 19:20:11

  0

Stai usando il tempo di esecuzione segnalato da Ant o JUnit's? Ant sta facendo molto più lavoro (determinando quali test eseguire, probabilmente compilando) che semplicemente eseguendo il test tramite IDE 23 set. 082008-09-23 21:18:10

1

Difficile dire con quella informazione. La prima cosa che farei è esaminare i risultati del test e determinare se tutti i singoli test sono in esecuzione uniformemente più lenti o se possono essere ristretti a un determinato sottoinsieme di casi di test.

(La cosa zero'th che vorrei fare è assicurarsi che il mio compito formica sta usando la stessa JVM come Eclipse e che le dipendenze classpath e barattoli importati sono realmente e veramente identici)

+1

I jar e JVM sono uguali: sembra che su tutta la linea qualsiasi test eseguito in <1,0 secondi in un IDE venga eseguito in 3,5-4,5 secondi tramite ant. 23 set. 082008-09-23 19:21:22


1

Forse si stanno vedendo che perché Eclipse esegue la compilazione incrementale e Ant non lo fa. Puoi confermare che questa volta è sprecato solo nel target di test?

  0

Sto anche visualizzando il task 'junit' richiede molto tempo, non è sicuramente la fase di compilazione, l'ora effettiva riportata da JUnit è bassa (es .: 'Test di esecuzione: 21, Errori: 0, Errori: 0, Tempo trascorso: 0.034 sec'), quindi mi aspetto che sia il momento spesi tra test suite che si sommano. L'esecuzione di tutti i test in IntelliJ richiede circa due secondi, tuttavia eseguirli tramite il task 'junit' di Ant impiega circa 20 secondi. 30 dic. 122012-12-30 19:14:26


4

Ecco un'ipotesi cieca: provare ad aumentare la dimensione massima dell'heap disponibile per la VM biforcuta utilizzando un tag nidificato <jvmarg> per impostare l'opzione -Xmx.

  0

Stavo per suggerire questo, insieme ad aumentare la dimensione heap disponibile per Ant stesso, pure. 24 ott. 082008-10-24 19:21:33


0

Per la cronaca, ho trovato il mio problema. Abbiamo utilizzato un codice offuscatore per questo progetto e la porzione di crittografia delle stringhe di quell'offuscatore è stata impostata su "maximum". Ciò ha rallentato qualsiasi operazione in cui erano presenti stringhe.

Abbassare la crittografia delle stringhe in una modalità più veloce ha risolto il problema.


4

Suppongo che il tuo antscript stia producendo risultati in file XML, mentre l'IDE li tiene in memoria. Ci vuole più tempo per scrivere un file piuttosto che non scrivere un file.

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

che è la parte del < batchtest> chiamata che dice di attaccare i risultati in quella directory. Sembra che lasciarlo fuori gli dica solo di incollare i risultati nella "directory corrente", qualunque essa sia. A prima vista non ho visto nulla per spegnerlo completamente.


0

Prova impostazione forchetta, forkmode e fili di questi valori:

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

vedi anche https://ant.apache.org/manual/Tasks/junit.html


0

Per me, aggiungendo forkmode="once" per l'elemento <junit> e aggiungendo usefile="false" per l'elemento <formatter> rende i test eseguiti molto Più veloce. Rimuovi anche i formattatori che non ti servono.