2008-09-19 21 views
5

Estoy ejecutando algunas pruebas JUnit en mis aplicaciones. Cada prueba tiene un bucle for llamando al método respectivo 10000 veces. Los métodos probados producen una gran cantidad de registro. Estos registros también se recogen automáticamente por JUnit como salida de prueba. Esta situación lleva a OutOfMemoryError porque el búfer de cadena donde JUnit mantiene la salida se vuelve demasiado grande. No necesito estos registros durante las pruebas, por lo que si hay una forma de decirle a JUnit "no guardes la salida del programa" sería suficiente. Alguna idea?Junit output y OutOfMemoryError

Respuesta

3

¿Qué tipo de registro está utilizando? ¿Hay alguna forma de que pueda anular el comportamiento de registro predeterminado para ignorar todos los mensajes de registro?

1

Algunas opciones:

  1. cambiar su registro para que se vuelca en un archivo en lugar de la salida estándar.
  2. Aumente el tamaño máximo de almacenamiento dinámico con -Xmx <some number>M, como -Xmx 256M.
0

Simplemente aumentaría la memoria disponible .. Intente agregar -Xmx256m -Xmx256m a su máquina virtual.

0

La solución estaba anulando las propiedades de registro. Ahora deshabilité el registro y todo parece funcionar (la prueba aún se está ejecutando). Si funciona, configuraré una forma de iniciar sesión en un archivo. Gracias a todos (y felicidades a Jeff & amigos por este sitio).

0

veo que la respuesta ha sido aceptado ya, pero aquí es lo que habría presentado si hubiera conseguido que escribió a máquina y probado más rápido:

Si por "registro" que quiere decir System.out.println() o System.err.println(), y si está seguro de que su prueba realmente no necesita los registros, puede redirigir stdout y stderr mediante programación.

// Save the original stdout and stderr 
PrintStream psOut = System.out; 
PrintStream psErr = System.err; 
PrintStream psDevNull = null; 
try 
{ 
    // Send stdout and stderr to /dev/null 
    psDevNull = new PrintStream(new ByteArrayOutputStream()); 
    System.setOut(psDevNull); 
    System.setErr(psDevNull); 
    // run tests in loop 
    for (...) 
    { 
    } 
} 
finally 
{ 
    // Restore stdout and stderr 
    System.setOut(psOut); 
    System.setErr(psErr); 
    if (psDevNull != null) 
    { 
     psDevNull.close(); 
     psDevNull = null; 
    } 
} 

esta manera, su salida de prueba se desactivará, pero la otra salida de JUnit no habrá, como lo sería si se ha utilizado la redirección en la línea de comando como este:

ant test &> /dev/null 

El La redirección de línea de comando hace que se redireccione toda la salida de Ant/JUnit, no solo lo que proviene de la clase que está probando, por lo que probablemente no sea lo que quiere. La redirección programática hace que solo las impresiones/escrituras en System.out y System.err en su programa sean redirigidas, y aún obtendrá la salida de Ant y JUnit.

0

Si es de alguna ayuda, establecer outputtoformatters = "no" resolvió todos mis problemas de memoria (en Ant 1.7.1 esto impide que la salida generada por las pruebas se envíe a los formateadores de prueba).