2017-05-22 4 views
1

J'ai recherché sur toute la documentation si cela est possible avec junit4 testing paramétré.Comment tester la matrice pour l'égalité avec plusieurs données d'entrée

En fait ce que j'ai est deux classes, GameEntry et Tableau de bord:

public class GameEntry{ 
    private String name; 
    private int score; 

    // Constructor and Getters... 
} 

public class Scoreboard{ 
    private int numEntries = 0; 
    private GameEntry[] board; 

    // Constructor 
    public Scoreboard(int capacity){ 
     board = new GameEntry[capacity]; 
    } 

    // Add method - Only if entry is higher than current entries 
    public void add(GameEntry e){ 
     // Code here...   
    } 

    // Remove method 

    // Reset method 
} 

J'ai lu au sujet des tests paramétrés où vous retournez un tableau de différentes données d'entrée Passing arrays to Parameterized JUnit, mais il est pas tout à fait ce que je voudrais faire. Je suis intéressé par l'exécution de 10 tests différents où je voudrais créer un fichier texte d'entrée avec le nom de gameEntries, les valeurs de score, et un autre fichier texte pour les valeurs attendues pour le nom et le score. Je voudrais garder toutes les données hors de la classe de test au cas où je voudrais changer les données plus tard. Après l'entrée, et les fichiers attendus ont été analysés, alors je voudrais simplement utiliser Assert.assertArrayEquals(expectedResult, result) pour comparer le tableau.

Je n'aurais aucun problème à le faire sans un test Junit paramétré, mais si un test échoue, tout le test échouerait. Je suppose que je pourrais garder un compteur pour suivre les entrées. Je voudrais écrire un seul test pour éviter DRY. Est-ce possible avec Junit ou autre testing framework?

+0

Vous pouvez utiliser TestNG, où les fournisseurs de données sont disponibles pour résoudre des problèmes de ce type. Même avec TestNG si un cas de test échoue pour une entrée, le test est annulé pour ce cas. – biziclop

Répondre

1

JUnit 5 a le concept de "tests dynamiques", qui vous permet de générer des cas de test lors de l'exécution.

Jetez un oeil à cet exemple (emprunté à un JUnit 5 workshop):

public class PrimeNumbersTest { 

    @TestFactory 
    Stream<DynamicTest> test_first_1000_prime_numbers() throws Exception { 
     return primes().mapToObj(p -> DynamicTest.dynamicTest(
       // Test case name. 
       "Prime: " + p, 
       // Test case content. 
       () -> assertTrue(PrimeNumbers.isPrime(p)))); 
    } 

    private LongStream primes() throws Exception { 
     return Files.lines(Paths.get(getClass().getResource("/primes-1000.txt").toURI())) 
       .mapToLong(Long::parseLong); 
    } 

} 

test_first_1000_prime_numbers() utilise @TestFactory pour créer un test pour chaque nombre premier retourné par primes(), qui les charge de la ressource externe primes-1000.txt. Par exemple, IntelliJ affiche ceci comme suit:

enter image description here

Ainsi, vous pouvez créer dynamiquement un test pour chacun de vos configurations. Cela empêche les données de test de sortir de la classe de test et seuls les tests qui échouent contiennent des assertions échouées. Jetez un oeil à la user guide ou à cette excellente blog post pour plus d'informations, mais gardez à l'esprit que JUnit 5 est encore en développement.