web-dev-qa-db-fra.com

Exécuter plusieurs fois le même scénario de test JUnit avec des données différentes

Existe-t-il un moyen de dire à JUnit d'exécuter plusieurs fois un scénario de test spécifique avec différentes données avant de passer au scénario de test suivant?

74
Giridhar

jetez un oeil à junit 4.4 théories :

import org.junit.Test;
import org.junit.experimental.theories.*;
import org.junit.runner.RunWith;

@RunWith(Theories.class)
public class PrimeTest {

    @Theory
    public void isPrime(int candidate) {
          // called with candidate=1, candidate=2, etc etc  
    }

    public static @DataPoints int[] candidates = {1, 2, 3, 4, 5};
}
66
dfa

Il semble que ce soit un candidat parfait pour les tests paramétrés.

Mais, fondamentalement, les tests paramétrés vous permettent d'exécuter le même ensemble de tests sur différentes données.

Voici quelques bons articles de blog à ce sujet:

24
jjnguy

Récemment, j'ai commencé le projet zohhak . Il vous permet d'écrire:

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}
12
piotrek

Une bien meilleure façon (vous permet d'avoir plus d'une méthode de test) est d'utiliser JUnit avec JUnitParams:

import junitparams.Parameters;
import org.junit.Test;

@RunWith(JUnitParamsRunner.class)
Public class TestClass() {

    @Test
    @Parameters(method = "generateTestData")
    public void test1(int value, String text, MyObject myObject) {
        ... Test Code ...
    }

    .... Other @Test methods ....

    Object[] generateTestData() {
        MyObject objectA1 = new MyObject();
        MyObject objectA2 = new MyObject();
        MyObject objectA3 = new MyObject();

        return $(
            $(400, "First test text.", objectA1),
            $(402, "Second test text.", objectA2),
            $(403, "Third test text.", objectA3)
        );
    }
}

Vous pouvez obtenir le projet junitparams ici .

5
DavidR

Voici un article que j'ai écrit qui montre plusieurs façons d'exécuter les tests à plusieurs reprises avec des exemples de code:

Exécutez un test JUnit à plusieurs reprises

Vous pouvez utiliser le coureur @Parametrized, ou utiliser le coureur spécial inclus dans le message

3
Kreich

Je crée toujours une méthode d'assistance qui exécute le test en fonction des paramètres, puis j'appelle cette méthode à partir de la méthode de test JUnit. Normalement, cela signifierait qu'une seule méthode de test JUnit exécuterait en fait beaucoup de tests, mais ce n'était pas un problème pour moi. Si vous vouliez plusieurs méthodes de test, une pour chaque appel distinct, je recommanderais de générer la classe de test.

Si vous utilisez déjà un @RunWith dans votre classe de test, vous devrez probablement jeter un œil à this .

2
mike rodent

Si vous ne voulez pas ou ne pouvez pas utiliser de coureur personnalisé (par exemple, vous utilisez déjà un autre coureur, comme le coureur Robolectric), vous pouvez essayer ceci DataSet Rule .

1
Miklos Jakab