2010-11-22 19 views
14

tengo una prueba JUnit 4 que los bucles a través de un conjunto de datos de prueba:Loop a través de la matriz, cada elemento de una prueba JUnit

public @Test void testAll() { 

    final Object[][] sets = new Object[][] { 
      // SET        TYPE VALUE 

      // --- valid sets 

      // groups 
      x(s(A,1, B,1, C,1),     G), 
      x(s(A,4, B,4, D,4),     G), 
      x(s(A,8, B,8, D,8, C,8),   G), 
      x(s(J,J, B,4, D,4),     G, 4*3), 
      x(s(A,9, J,J, D,9),     G, 9*3), 
      x(s(A,2, B,2, C,2),     G), 
      x(s(A,4, B,4, J,J),     G, 4*3), 
      x(s(A,4, B,4, C,4, D,4),   G), 

      // runs 
      x(s(A,1, A,2, A,3),     R), 
      x(s(B,8, B,9, B,10),    R), 
      x(s(J,J, C,2, C,3),     R, 6), 
      x(s(D,8, D,9, J,J, D,11),   R, 38), 
      x(s(D,8, D,9, J,J, J,J),   R, 38), 

      // sames 
      x(s(A,1, A,1),      S), 
      x(s(B,4, B,4, B,4),     S), 
      x(s(C,8, C,8),      S), 
      x(s(D,3, D,3),      S), 

      // doubt-cases, assume group (TODO: verify this is correct) 
      x(s(J,J, J,J, D,4),     G, 4*3), 
      x(s(A,7, J,J, J,J),     G, 7*3), 
      x(s(J,J, D,9, J,J),     G, 9*3), 
      x(s(J,J, J,J, J,J),     G, 1), 

      // --- invalid sets 
      x(s(B,1, A,2, A,3),     I), // not same colour 
      x(s(D,11, D,12, J,J, J,J),   I), // last joker is 14 
      x(s(B,1, B,1, A,1),     I), // duplicate B1 
      x(s(A,1, A,2, A,3, A,5),   I), // gap A4 
      x(s(J,J, A,1, J,J, B,1, C,1),  I), // one J replaces D1, then nothing left to replace 
      x(s(A,1, A,2),      I), // short 
      x(s(B,1),       I), // shorter 
      x(s(A,5, A,6),      I), // short 
    }; 

    for (Object[] o : sets) { 

     TileSet s = (TileSet) o[0]; 
     Type t = (Type) o[1]; 
     int v = (Integer) o[2]; 

     System.out.println(s); 

     assertEquals(t, s.getType()); 
     assertEquals(v, s.getValue()); 

     // test isValid, though it's Too Simple To Break(R) 
     if (t == Type.INVALID) assertFalse(s.isValid()); 
     else assertTrue(s.isValid()); 
    } 

} 

Debido a que es todo en un método de ensayo, toda la prueba se detiene tan pronto como uno elemento en la matriz falla. ¿Hay alguna forma de evitar eso, sin hacer un método para cada elemento de prueba? Tal vez algo con la reflexión?

+1

Si necesita que continúe a través afirmar fracasos, ¿qué hay de la construcción una lista de elementos que fallan, mientras haces un bucle, y luego afirmas que la lista está vacía después del ciclo? Si no está vacío, imprima la lista de fallas. – birryree

+0

@birryree ¿cómo harías esto? ¿no se detendría el bucle una vez que falla un elemento? Soy un principiante por cierto. – papercuts

Respuesta

21
+0

Esto es exactamente lo que necesito. Sin embargo, una cosa es, ¿hay alguna manera de mostrar el toString() de los datos de prueba en los resultados de la prueba? Es inconveniente tener que seguir buscándolos por índice de matriz. –

+0

es posible que desee considerar la subclasificación del corredor parametrizado o proporcionar su propia implementación y anular el método 'getName()' dentro de la clase interna 'TestClassRunnerForParameters' –

+0

¿Es posible algo así en el nivel de método (@Test)? Quiero repetir solo algunos métodos en la clase y ya uso @RunWith para otra cosa. –

3

capture AssertionError y agregue el error capturado a la lista de errores, al final compruebe que la lista esté vacía plantee un compuesto AssertionError si no.

+0

¿La lista de errores? ¿Es solo una lista que tendré que hacer, o una cosa incorporada de JUnit? –

+0

@Bart tienes que hacerlo. Por cierto, es una buena costumbre crear instancias de datos de prueba en 'setUp' y hacer pequeños métodos' test ... '. – khachik

+0

Lo sé, pero tengo demasiados datos de prueba para eso (lo que hay actualmente se ampliará un poco más). –

Cuestiones relacionadas