web-dev-qa-db-fra.com

Comment faire pour exécuter les cas de test JUnit dans un ordre séquentiel?

J'utilise JUnit4.

J'ai un ensemble de méthodes de test dans un cas de test.

Chaque méthode de test insère certains enregistrements et vérifie un résultat de test et finalement supprime les enregistrements insérés.

Étant donné que JUnit s'exécute en parallèle, les méthodes de test échouent en raison de certains enregistrements présents lors de l'exécution de la méthode de test précédente. Cela se produit uniquement sur ma machine collègue (Windows 7), pas sur ma machine (Cent OS 6).

Ce dont nous avons besoin, c'est que les méthodes de test doivent réussir dans toutes nos machines.

J'ai essayé d'effacer les enregistrements dans la méthode Setup () mais encore une fois, cela ne fonctionne que sur ma machine. Existe-t-il une option disponible dans JUnit pour que les méthodes de test s'exécutent dans un ordre séquentiel uniforme?

Merci,

22
Athiruban

MethodSorters est une nouvelle classe introduite après la sortie de Junit 4.6. Cette classe a déclaré trois types d'ordre d'exécution, qui peuvent être utilisés dans vos cas de test lors de leur exécution.

  1. NAME_ASCENDING (MethodSorters.NAME_ASCENDING) - Trie les méthodes de test par leur nom, dans l'ordre lexicographique.

  2. JVM (null) - Laisse les méthodes de test dans l'ordre renvoyé par la JVM. Notez que l'ordre de la JVM my varie d'une exécution à l'autre.

  3. DEFAULT (MethodSorter.DEFAULT) - Trie les méthodes de test dans un ordre déterministe, mais non prévisible.

.

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

//Running test cases in order of method names in ascending order

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution {

    @Test
    public void secondTest() {
        System.out.println("Executing second test");
    }

    @Test
    public void firstTest() {
        System.out.println("Executing first test");
    }

    @Test
    public void thirdTest() {
        System.out.println("Executing third test");
    }
}

Production:

Executing first test
Executing second test
Executing third test

Référence: http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

27
Ranga Reddy

JUnit 4.11 prend désormais en charge la spécification de l'ordre d'exécution à l'aide de @FixMethodOrder annotation.

26
Aleksandr Dubinsky

L'ordre des tests n'est pas garanti dans JUnit.

La raison en est que les tests unitaires sont censés être atomiques - toute la configuration doit se produire dans les méthodes de configuration/démontage, mais pas par d'autres tests.

Pensez à déplacer le code qui insère des données dans une autre classe d'assistance qui peut être appelée à la fois par le test qui est en train d'insérer et la classe à vérifier, et à appeler cette classe dans vos méthodes @Before.

Vous devriez également envisager une solution de moquerie (par exemple Mockito) au lieu de frapper la base de données directement si vous le pouvez - la moquerie contribuera grandement à garantir que vos tests sont agréables et isolés, et, comme avantage secondaire de Nice, aide généralement à souligner où vous pourriez utiliser une refactorisation.

8
Roy Truelove

Parce que vous exécutez les tests en parallèle et que vous frappez la base de données, vous êtes très susceptible d'avoir des problèmes, car la base de données ne sera pas nécessairement dans un état cohérent pour chaque test.

Solution: ne lancez pas vos tests en parallèle. JUnit n'exécute pas les tests en parallèle par défaut, donc vous définissez l'option dans maven ou vous utilisez l'un des exécuteurs parallèles dans JUnit.

Si vous rencontrez toujours des problèmes entre les tests qui échouent sur Windows mais pas sur Cent OS, c'est peut-être un problème avec l'ordre d'exécution, que vous devrez corriger. Voir ma réponse à JUnit4 a-t-il commencé à prendre en charge la commande de test? Est-ce intentionnel? .

Le moyen de contourner cela (au moins en termes JUnit) est de supprimer les dépendances entre les tests. Fondamentalement, JUnit ne prend pas en charge la commande et les tests devraient pouvoir être exécutés dans n'importe quel ordre.

Si vous avez vraiment besoin d'avoir des dépendances entre les tests, utilisez TestNG, où vous pouvez avoir des dépendances.

2
Matthew Farwell