2011-02-06 15 views
10

Me pregunto, por convención, cuando una prueba falla, es oportuno:jUnit fallar() convenciones

  • Di por qué ha fallado (la lógica de negocio)
  • decir por qué se ve el mensaje (excepción debería haber sido lanzado y no es)

Por ejemplo,

fail("Accessed the element which does not exist"); 

o

fail("ArrayIndexOutOfBoundException was expected but something bad happened"); 

¿Cuál es generalmente preferido/aceptado?

Respuesta

9

Dado que se trata de un código de prueba y no debería incluirse en la compilación final, diría que cuanto más detallado sea, mejor. Como tal, me quedaría con el primero: está mucho más claro cuál es la causa raíz del problema, lo que hace que sea más fácil de corregir.

Evitaría el segundo en todas las circunstancias porque no es muy útil para un probador, y si de alguna manera lo hace en la versión final es aún más críptico que el primero para un usuario final, simplemente no es ayuda para probadores o usuarios por igual.

La otra opción que consideraría es, en lugar de indicar que se produjo una excepción, dar detalles de la excepción real, es por eso que se inventaron las trazas de pila. Eso transmitiría más detalles que cualquiera de los métodos enumerados.

+1

también me gusta tu nombre de usuario :) – JAM

4

Si hubiera eran una convención sobre esto lo ignoraría. Debería decir lo que mejor le comunique a alguien que vea este mensaje la naturaleza del problema de tal forma que pueda resolverse lo más fácilmente posible. Con demasiada frecuencia, adherirse a una convención falla en este sentido.

+0

Pero si hay una convención que alguien espera que se ignore, puede causar confusión.Cuando escribes una prueba, no sabes quién podría estar mirando en 10 años. Entonces otra vez ... en 10 años, tal vez la convención ha cambiado. – dantiston

11

En primer lugar, si espera que el API se prueba a una excepción, en vez de hacer un try-catch con un fail() ...

@Test 
public void testMe() { 
    try { 
     api.testThis(); 
     fail("should not reach here"); 
    } 
    catch(MyException e) {} 
} 

... usted debe hacer esto: -

@Test(expected=MyException.class) 
public void testMe() { 
    api.testThis(); 
} 

Dicho esto, rara vez uso fail(). Si necesito para llevar a cabo cierta validación y la condición de falla, lo haré afirmaciones uso más probable que el uso de fail() ... por ejemplo: -

... en lugar de ...

@Test 
public void testMe() { 
    boolean bool = api.testThis(); 
    if (!bool) { 
     fail("should be true because bla bla bla"); 
    } 
} 

... hacer esto: -

@Test 
public void testMe() { 
    boolean bool = api.testThis(); 
    assertTrue("bla bla bla",bool); 
} 

sin embargo, si usted realmente necesita usar fail(), sea más explícito y explicar por qué se produce un error en lugar de "no debería llegar aquí" o "debe dejar aquí", porque eso no ayuda a la gente que lea los cuadros de prueba.

De acuerdo, estos son solo ejemplos simples ... pero creo que entiendo mis puntos. :)

+0

No había visto la excepción esperada en la sintaxis de anotación antes. Ordenado. – dantiston

+0

Advertencia sobre el uso de la anotación: si su método puede arrojar la excepción con diferentes mensajes de error o en más de un lugar, será mejor usar un try-catch y comparar el mensaje de error. Mire esta publicación de blog para más detalles: https://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ –