Hoy vi un caso de prueba de JUnit con una aserción de Java en lugar de las aserciones de JUnit. ¿Hay ventajas o desventajas significativas para preferir una sobre la otra?
Hoy vi un caso de prueba de JUnit con una aserción de Java en lugar de las aserciones de JUnit. ¿Hay ventajas o desventajas significativas para preferir una sobre la otra?
Respuestas:
En JUnit4, la excepción (en realidad Error) lanzada por una assert
aserción de JUnit es la misma que el error arrojado por la palabra clave java (AssertionError), por lo que es exactamente igual assertTrue
y diferente al seguimiento de la pila, no podría notar la diferencia.
Dicho esto, las afirmaciones tienen que ejecutarse con un indicador especial en la JVM, lo que hace que muchas pruebas parezcan pasar solo porque alguien olvidó configurar el sistema con ese indicador cuando se ejecutaron las pruebas de JUnit, lo que no es bueno.
En general, debido a esto, yo diría que usar JUnit assertTrue
es la mejor práctica, porque garantiza que se ejecute la prueba, asegura la consistencia (a veces usa assertThat
u otras afirmaciones que no son una palabra clave de Java) y si el comportamiento de JUnit afirma debería cambiar en el futuro (como conectarse a algún tipo de filtro u otra función futura de JUnit) su código podrá aprovechar eso.
El propósito real de la palabra clave assert en Java es poder desactivarla sin penalización en tiempo de ejecución. Eso no se aplica a las pruebas unitarias.
Prefiero las aserciones de JUnit ya que ofrecen una API más rica que la assert
declaración incorporada y, lo que es más importante, no necesitan habilitarse explícitamente a diferencia de lo assert
que requiere el -ea
argumento JVM.
-ea
siempre está habilitado mvn test
, no es necesario -ea
. Api más rico, buena captura. A veces creo que la API se usa incorrectamente en la prueba porque no es parte de la aplicación (a en api), prefiero llamarla solo métodos más ricos.
Cuando una prueba falla, obtienes más información.
assertEquals(1, 2);
resultados en java.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
resultados en java.lang.AssertionError
puede obtener aún más información si agrega el argumento del mensaje a assertEquals
assert 1==2: "1 is not 2";
.
assert
puede ser preferible, para verificaciones de corrección que afectarían el rendimiento y, por lo tanto, es mejor desactivarlas de forma predeterminada. Sin embargo, mi experiencia es que la mayoría de las afirmaciones deben estar siempre activas.
Yo diría que use JUnit asserts en casos de prueba y use Java's assert en el código. En otras palabras, el código real nunca tendrá dependencias JUnit, como es obvio, y si es una prueba, debería usar las variaciones JUnit del mismo, nunca la aserción.
Yo diría que si está usando JUnit, debe usar las aserciones de JUnit. assertTrue()
es básicamente lo mismo que assert
, De lo contrario, ¿por qué usar JUnit?
Assert
requeriría más texto estándar. assert
sin JUnit requeriría que escribieras un marco completo.
Es posible que esto no se aplique si usa exclusivamente cosas brillantes y nuevas, pero assert no se introdujo en Java hasta 1.4SE. Por lo tanto, si debe trabajar en un entorno con tecnología más antigua, puede inclinarse hacia JUnit por razones de compatibilidad.