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?
java
junit
assert
assertions
Robert
fuente
fuente
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 igualassertTrue
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 usaassertThat
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.
fuente
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 loassert
que requiere el-ea
argumento JVM.fuente
-ea
siempre está habilitadomvn 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 enjava.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
resultados enjava.lang.AssertionError
puede obtener aún más información si agrega el argumento del mensaje a
assertEquals
fuente
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.
fuente
Yo diría que si está usando JUnit, debe usar las aserciones de JUnit.
assertTrue()
es básicamente lo mismo queassert
, De lo contrario, ¿por qué usar JUnit?fuente
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.
fuente