Las pruebas Ant Junit se están ejecutando mucho más lentamente a través de la hormiga que a través de IDE, ¿qué mirar?


9

Estoy ejecutando mis pruebas junit a través de ant y están funcionando mucho más lento que a través del IDE. Mi llamado hormiga es:

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

La misma prueba que se ejecuta en casi instantáneamente en mi IDE (0.067s) toma 4.632s cuando se ejecuta a través de la hormiga. En el pasado, he podido acelerar los problemas de prueba utilizando el parámetro junit fork, pero esto no parece ser de ayuda en este caso. ¿Qué propiedades o parámetros puedo ver para acelerar estas pruebas?

Más información:

estoy usando el tiempo reportado desde el IDE contra el tiempo que las salidas de tareas JUnit. Esta no es la suma del tiempo total informado al final de la ejecución de la hormiga.

Así que, curiosamente, este problema se ha resuelto solo. ¿Qué pudo haber causado este problema? El sistema se ejecuta en un disco local, por lo que ese no es el problema.

+1

¿No dolería = sí, perjudicó el rendimiento al generar un nuevo proceso para ejecutar una sola prueba? ¿Cuál es el resultado cuando no lo usas? 23 sep. 082008-09-23 19:13:09

+1

con forkmode = "una vez", pensé que ejecutaría todas las pruebas junit en un solo hilo separado. No hay ningún cambio de rendimiento material entre fork = "no y fork =" yes ". 23 sep. 082008-09-23 19:20:11

  0

¿Está utilizando el tiempo de ejecución reportado de Ant o JUnit? Ant está haciendo mucho más trabajo (determinando qué pruebas ejecutar, probablemente compilando) que solo ejecutar el prueba a través del IDE. 23 sep. 082008-09-23 21:18:10

1

Difícil de decir con esa información. Lo primero que haría sería examinar los resultados de la prueba y determinar si todas las pruebas individuales se ejecutan uniformemente más despacio o si se puede reducir a un cierto subconjunto de casos de prueba.

(Lo zero'th Me gustaría hacer es asegurarse de que mi tarea ant está utilizando la misma JVM que Eclipse y que las dependencias de ruta de clases y JAR importados son real y verdaderamente idéntico)

+1

Los archivos jar y JVM son iguales. Parece que en general cualquier prueba que se ejecute en <1.0 segundo en un IDE se ejecuta en 3.5-4.5 segundos a través de la hormiga 23 sep. 082008-09-23 19:21:22


1

Quizás esté viendo que porque Eclipse hace compilación incremental y Ant no lo hace. ¿Puedes confirmar que este tiempo se desperdicia solo en el objetivo de la prueba?

  0

. También estoy viendo la tarea 'junit' tomar un largo tiempo. Definitivamente no es la fase de compilación. El tiempo real reportado por JUnit es bajo (por ejemplo: 'Pruebas ejecutadas: 21, Fallas: 0, Errores: 0, Tiempo transcurrido: 0.034 seg'), así que espero que sea hora La ejecución de todas las pruebas en IntelliJ lleva unos dos segundos, sin embargo, ejecutarlas a través de la tarea 'junit' de Ant lleva más cerca de 20 segundos. 30 dic. 122012-12-30 19:14:26


4

Aquí hay una suposición ciega: intente aumentar el tamaño máximo de almacenamiento dinámico disponible para la máquina virtual bifurcada utilizando una etiqueta anidada <jvmarg> para establecer la opción -Xmx.

  0

Iba a sugerir esto, junto con aumentar el tamaño de almacenamiento disponible para Ant sí mismo, también. 24 oct. 082008-10-24 19:21:33


0

Para el registro, encontré mi problema. Hemos estado utilizando un ofuscador de código para este proyecto, y la parte de cifrado de cadena de ese ofuscador se estableció en "máximo". Esto desaceleró cualquier operación donde las cadenas estuvieran presentes.

Al desactivar el cifrado de cadenas a un modo más rápido solucionó el problema.


4

Supongo que es porque su antscript está generando resultados en archivos XML, mientras que el IDE los conserva en la memoria. Lleva más tiempo escribir un archivo que no escribir un archivo.

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

Esa es la parte de la < batchtest llamada> que le dice que se adhieren los resultados en ese directorio. Parece que al dejarlo solo le dice que pegue los resultados en el "directorio actual", sea lo que sea. A primera vista, no vi nada para apagarlo por completo.


0

intente configurar tenedor, forkmode y los hilos de estos valores:

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

Véase también https://ant.apache.org/manual/Tasks/junit.html


0

Para mí, añadiendo forkmode="once" para el elemento <junit> y añadiendo usefile="false" para el elemento <formatter> hace que las pruebas se ejecutan mucho Más rápido. También elimine los formateadores que no necesita.