2010-11-22 26 views
14

j'ai JUnit 4 test qui effectue une boucle dans un réseau de données de test:Boucle par matrice, chaque élément d'un test 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()); 
    } 

} 

Parce qu'il est dans une méthode d'essai, l'ensemble du test arrête dès que l'on élément dans le tableau échoue. Y at-il un moyen de contourner cela, sans faire une méthode pour chaque élément de test? Peut-être quelque chose avec réflexion?

+1

Si vous avez besoin de continuer d'affirmer par des échecs, que diriez-vous la construction une liste d'éléments qui échouent lorsque vous bouclez, puis affirmez que la liste est vide après la boucle? Si ce n'est pas vide, imprimez la liste des échecs. – birryree

+0

@birryree comment feriez-vous cela? le bouclage ne s'arrêterait-il pas une fois qu'un élément échouerait? Je suis un débutant. – papercuts

Répondre

21

Utilisez le parameterized tests de JUnit 4. Ils sont parfaitement adaptés à ce type de problème, bien que la documentation manque cruellement.

Voici quelques autres exemples sur la façon de les utiliser .:

+0

C'est exactement ce dont j'ai besoin. Une chose cependant, y at-il un moyen d'afficher le toString() des données de test dans les résultats du test? Il est incommode de devoir continuer à les rechercher par index de tableau. –

+0

vous pourriez vouloir sous-classer le coureur Parameterized ou fournir votre propre implémentation et substituer la méthode 'getName()' dans la classe interne 'TestClassRunnerForParameters' –

+0

Est-ce que quelque chose comme ceci est possible au niveau de la méthode (@Test)? Je veux répéter seulement quelques méthodes dans la classe et j'utilise déjà @RunWith pour autre chose. –

3

attraper AssertionError et ajouter l'erreur interceptée à la liste des erreurs, à la fin de vérifier la liste pour être vide augmenter un composé AssertionError sinon.

+0

La liste des erreurs? Est-ce juste une liste que je vais devoir faire, ou une chose JUnit intégrée? –

+0

@Bart vous devez le faire. BTW, c'est une bonne habitude d'instancier les données de test dans 'setUp' et de faire de petites méthodes' test ... '. – khachik

+0

Je sais, mais j'ai trop de données de test pour ça (ce qui est actuellement là sera encore plus développé). –