2008-10-07 10 views
20

Me gustaría que grite "¡hurra!" Cada vez que una afirmación afirmativa tenga éxito, o al menos que muestre la cantidad de afirmaciones afirmativas exitosas que se encontraron.¿Puedo hacer que JUnit sea más detallado?

Estoy usando JUnit4.

¿Alguna sugerencia? Javadoc

+0

¿Por qué exactamente quieres eso? Siempre trato de seguir la regla del silencio (http://www.catb.org/~esr/writings/taoup/html/ch01s06.html#id2878450), es por eso que pregunto –

+0

. Puede ser una forma útil de ver si alguien está "retocando" los casos de prueba para hacerlos pasar eliminando aserciones incómodas ... –

+4

Porque me da escalofríos cuando ese número legítimamente aumenta. :) –

Respuesta

13

Si desea ver alguna salida para cada aserción exitosa, otro enfoque simple que no requiere dependencias externas o código fuente, sería definir su propia clase Assert que delegue todos los métodos al la clase JUNit Assert estándar, así como el registro de aserciones exitosas (las aserciones fallidas serán informadas como de costumbre por la clase JUnit).

Luego ejecuta una búsqueda global y reemplazo en sus clases de prueba de "org.junit.Assert" => "com.myco.test.Assert", que debe arreglar todas las declaraciones de importación estáticas y regulares.

También puede migrar fácilmente a continuación, su acercamiento a la más tranquila-es-mejor-campamento y cambiar la clase de contenedor simplemente informar del total de las afirmaciones # pasaron por pruebas o por clase, etc.

0

Estoy bastante seguro de que puede crear un TestRunner a medida que lo hace. Terminamos con algo similar en nuestro marco de pruebas de unidades caseras (un clon de NUnit).

Oh, espera - ahora que estoy leyendo tu pregunta de nuevo, si realmente quieres resultados para cada afirmación exitosa, tendrás que profundizar más en la fontanería. El TestRunner solo recibe una llamada por cada inicio/fin de la versión de prueba, por lo que contará las pruebas pasadas y fallidas, no las aserciones.

Esto no es un gran problema para mí, ya que tienden a una afirmación por prueba, en general.

2

Difícil de hacer. Todos los métodos assert son miembros estáticos de la clase Assert, lo que implica que RunNotifier (que cuenta las pruebas exitosas y fallidas) no está al alcance.

Si no se abstiene de un hack desagradable: tome las fuentes de JUnit, parcheelas para almacenar el notificador actual en un campo estático de Assert al ejecutar pruebas para que los métodos estáticos puedan informar correctamente a este notificador.

-1

¿Puede considerar?

1) Descargar fuente de JUnit
2) para modificar el org.junit.Assert clase para hacer las modificaciones que estás buscando

4

Puede utilizar AOP (con la primavera o AspectJ) definir puntos de corte en toda aserción métodos en junit.framework.Assert class. Usando spring puedes implementar tu propia clase como después de devolver el consejo (http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning) que solo se invocará si se aprueba el método assert (de lo contrario arroja una excepción: junit.framework.AssertionFailedError ). En tu propia clase puedes implementar un contador simple y imprimirlo al final.

3

¿Está realmente interesado en una afirmación de que tiene éxito? Normalmente, las únicas afirmaciones interesantes son los que fallan.

ser un devoto JUnit ferviente mí, trato de hacer que la salida de la prueba lo más silenciosamente posible porque mejora la relación señal/ruido cuando algo no pasa. La mejor prueba es aquella en la que todo pasa y no hay un pío de la salida estándar.

Siempre puedes trabajar en la prueba de tu unidad hasta que tenga éxito y ejecutar "grep Assert test.java | wc -l ". :-)

+7

Sí, realmente lo soy. –

0

I don' Creo que el objetivo de JUnit es contar las afirmaciones coincidentes o imprimir más información detallada. Si las pruebas son atómicas, obtendrá la mayoría de la información allí. Entonces, revisaría mis pruebas.

También es capaz de establecer un archivo de registro en JUnit. Es posible, pero disminuirá la ejecución rendimiento de la prueba ...

7

Agregando un poco de información que habría sido útil para mí cuando quería JUnit a ser más detallado y topé con esta pregunta. Tal vez ayudará a otros probadores en el futuro.

Si está ejecutando JUnit de hormiga, y quiere ver lo que las pruebas están en ejecución, se puede añadir lo siguiente a su tarea:

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000"> 

Tenga en cuenta que showoutput, printsummary y enabletestlistenerevents son lo ayudó, no los otros atributos de la tarea. Si establece estos, se obtendrá una salida como:

Running com.foo.bar.MyTest 
junit.framework.TestListener: tests to run: 2 
junit.framework.TestListener: startTest(myTestOne) 
junit.framework.TestListener: endTest(myTestOne) 
junit.framework.TestListener: startTest(myTestTwo) 
junit.framework.TestListener: endTest(myTestTwo) 
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec 

Esto fue útil para mí cuando mis pruebas fueron el tiempo de espera y no estaba seguro de qué pruebas se han hecho tomando demasiado tiempo, y qué pruebas fue cancelado debido tuvieron la mala suerte de correr cuando llegó el momento.

Cuestiones relacionadas