web-dev-qa-db-fra.com

Comment définir une commande pour exécuter des tests junit dans Intellij?

J'ai un test Junit feuilleté qui échoue uniquement si j'exécute tous mes tests. Je pense qu'un test fait échouer un autre test, je veux le prouver avant d'essayer de le réparer.

Si j'exécute tous les tests, il exécute la "mauvaise configuration" puis il exécute le "test qui échoue après une mauvaise configuration". Il exécute également beaucoup de tests lents et non pertinents entre les deux. Mais si j'utilise un modèle pour exécuter uniquement ces deux, il exécute "test qui échoue après une mauvaise configuration" puis "mauvaise configuration". En conséquence, les deux passent.

Comment exécuter uniquement "une mauvaise configuration" et "un test qui échoue après une mauvaise configuration", dans cet ordre?

12
Daniel Kaplan

Selon wiki de JUnit :

De par sa conception, JUnit ne spécifie pas l'ordre d'exécution des appels de méthode de test. Jusqu'à présent, les méthodes étaient simplement invoquées dans l'ordre renvoyé par l'API de réflexion. Cependant, utiliser l'ordre JVM est imprudent car la plate-forme Java ne spécifie aucun ordre particulier, et en fait JDK 7 renvoie un ordre plus ou moins aléatoire. Bien sûr, un code de test bien écrit serait n'assume aucun ordre, mais certains le font, et un échec prévisible vaut mieux qu'un échec aléatoire sur certaines plateformes.

À partir de la version 4.11, JUnit utilisera par défaut un ordre déterministe mais non prévisible (MethodSorters.DEFAULT). Pour modifier l'ordre d'exécution des tests, annotez simplement votre classe de test à l'aide de @FixMethodOrder et spécifiez l'un des MethodSorters disponibles:

@FixMethodOrder(MethodSorters.JVM): laisse les méthodes de test dans l'ordre renvoyé par la JVM. Cette commande peut varier d'une exécution à l'autre.

@FixMethodOrder(MethodSorters.NAME_ASCENDING): Trie les méthodes de test par nom de méthode, dans l'ordre lexicographique.

Vous pouvez utiliser MethodSorters.NAME_ASCENDING et modifiez les noms de vos méthodes pour qu'elles correspondent à votre commande spécifique. Je sais que vous l'utilisez juste pour le débogage, mais c'est une odeur de test pour s'appuyer sur l'ordre d'exécution de vos méthodes de test et JUnit ne fournit pas de grain plus fin contrôle de l'ordre d'exécution des méthodes de test

25
Ali Dehghani

Comme l'a dit ALi Dehghani, vous pouvez ordonner l'exécution de la méthode de test par

@FixMethodOrder (MethodSorters.NAME_ASCENDING): Trie les méthodes de test par nom de méthode, dans l'ordre lexicographique.

Code:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public ApplicationTest() {
        super(MainActivity.class);
    }

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    void t1AttachUI(){
        // testing code goes here
    }

    @Test
    void t2InitializeViews(){
        // testing code goes here
    };

    @Test
    void t3SettingValues(){
        // testing code goes here
    };

    @Test
    void t4Validation(){
        // testing code goes here
    };

    @Test
    void t3AfterButtonPress(){
        // testing code goes here
    };
}
4
Abish R

Les tests unitaires doivent être indépendants afin que la plupart des frameworks ne garantissent ni n'appliquent l'ordre dans lequel ils sont exécutés. Mais comme vous voulez appliquer un ordre de la manière la plus simple que j'ai faite dans le passé, il a créé une suite de tests ou une méthode de test "jetable" qui appelle les tests dans l'ordre que je veux qu'ils s'exécutent. Les tests unitaires sont des méthodes , appelez-les. C'est facile à faire si vous avez affaire à des dizaines de tests, pas du tout attrayant si vous avez affaire à des centaines ou des milliers.

Essayez d'isoler autant que possible l'interaction instable, puis inversez l'ordre des tests qui interagissent mal dans la méthode d'appel jetable.

1
pdmoore