2012-02-07 17 views
37

En la última semana he creado dos clases en las que mi equipo expresó algunas preocupaciones con respecto a su rendimiento. Para evaluar mi código, escribí algunas pruebas simples de JUnit que ejercitaron estas clases construyendo conjuntos completos de datos de prueba y luego alimentando esos datos a través de los métodos relevantes para miles de iteraciones. Grabé el tiempo de ejecución de cada iteración y luego me desconecté de los tiempos alto, bajo y promedio usando los bucles y System.nanoTime(). Finalmente, hice que JUnit afirmara que los tiempos alto y promedio estaban dentro de los límites aceptables. Este enfoque de prueba le dio confianza a mi equipo en este código.¿Es JUnit la herramienta adecuada para escribir pruebas de rendimiento?

¿Es JUnit la herramienta adecuada para probar el rendimiento de esta manera? ¿Hay mejores herramientas para evaluar el rendimiento a nivel de unidad (método y clase)?

Respuesta

37

Puede haber mejores enfoques, pero también hay algunos marcos que ayudan a implementar la evaluación comparativa con JUnit. Algunas prácticas útiles son las ejecuciones de calentamiento, las evaluaciones estadísticas. Echar un vistazo a JUnitBenchmarks y JUnitPerf

EDITAR parece JUnitBenchmarks está obsoleto ya que la cuestión se ha dicho. Los mantenedores del proyecto recomiendan pasar al JMH. Gracias, Barry NL por el heads-up.

+1

Lo acepté porque mi equipo y yo tenemos una gran afinidad por la integración de JUnit con estas opciones. @Pangea tuvo una gran respuesta para la evaluación comparativa sin integración de Junit. – Freiheit

+1

Nuestro proyecto ya ha implementado JUnit para todas nuestras pruebas unitarias. Ampliarlos a pruebas de rendimiento con el marco JUnitPerf fue muy fácil y tiene sentido. –

+0

Genial, me alegro de que esta respuesta todavía sea útil :) – kostja

21

No. JUnit está diseñado para pruebas unitarias. Hay muchas cosas que deben tenerse cuidado al escribir pruebas de rendimiento en Java. Use Google Caliper que está específicamente diseñado para escribir pruebas de micro-benchmark.

Mira How do I write a correct micro-benchmark in Java?

+0

Exactamente lo que estaba por recomendar :) – Brice

+0

Google Caliper no parece ser un proyecto exitoso. Todavía están en beta desde hace 2 años. – JeanValjean

6

Sus pruebas debería definirse mejor como pruebas de referencia. Sí, JUnit puede usarse de esta manera, aunque no es la mejor opción. Pero puede, por ejemplo, definir max. tiempo de evaluación para la prueba, por lo que si se modifica el algoritmo que causó la degradación del rendimiento, la prueba falla. Use @Test(timeout=12345) para la configuración.

Si necesita una prueba de rendimiento real, piense en JMeter.

-5

JUnit está diseñado más para las pruebas unitarias, tal vez TestNG será una mejor opción en este caso, en particular, su característica @Dataprovider:

//This method will provide data to any test method that declares that its Data Provider 
//is named "test1" 
@DataProvider(name = "test1") 
public Object[][] createData1() { 
return new Object[][] { 
    { "Cedric", new Integer(36) }, 
    { "Anne", new Integer(37)}, 
}; 
} 

//This test method declares that its data should be supplied by the Data Provider 
//named "test1" 
@Test(dataProvider = "test1") 
public void verifyData1(String n1, Integer n2) { 
System.out.println(n1 + " " + n2); 
} 

Aquí está el specific doc.

+2

JUnit admite el @Parameterized muy similar. – nes1983

Cuestiones relacionadas