141 votes

Junit - exécuter une fois la méthode d'installation

J'ai créé une classe avec quelques tests et, au lieu d'utiliser la fonction @Before J'aimerais avoir une méthode de configuration qui ne s'exécute qu'une fois avant tous les tests. Est-ce possible avec Junit 4.8 ?

0voto

Sergii Points 91

J'ai résolu ce problème de la manière suivante :

Ajoutez à votre Base classe abstraite (j'entends par là une classe abstraite dans laquelle vous initialisez votre pilote en setUpDriver() ) cette partie du code :

private static boolean started = false;
static{
    if (!started) {
        started = true;
        try {
            setUpDriver();  //method where you initialize your driver
        } catch (MalformedURLException e) {
        }
    }
}

Et maintenant, si vos classes de test s'étendent de Base classe abstraite -> setUpDriver() sera exécutée avant le premier @Test seulement ONE temps par cycle.

0voto

user123456789 Points 23

Après avoir expérimenté pendant un certain temps, voici ma solution. J'en avais besoin pour un test de Spring Boot. J'ai essayé d'utiliser @PostConstruct, malheureusement il est exécuté pour chaque test.

public class TestClass {
    private static TestClass testClass = null;
    @Before
    public void setUp() {
        if (testClass == null) {
            // set up once
            ...
            testClass = this;
        }
    }
    @AfterClass
    public static void cleanUpAfterAll() {
        testClass.cleanUpAfterAllTests();
    }
    private void cleanUpAfterAllTests() {
        // final cleanup after all tests
        ...
    }
    @Test
    public void test1() {
        // test 1
        ...
    }
    @Test
    public void test2() {
        // test 2
        ...
    }
}

0voto

PSIXO Points 583

Voici une suggestion alternative :

Ce que je fais pour que ça marche est Créer une méthode nommée _warmup ou simplement _. Annoter la classe de test avec @FixMethodOrder(MethodSorters.NAME_ASCENDING)

Ceci n'est applicable que si vous exécutez tous les tests de la classe

L'inconvénient est que des tests supplémentaires sont inclus, ce qui entraîne l'exécution d'un @Before et d'un @After supplémentaire. Il est généralement conseillé que vos méthodes de test soient indépendantes de l'ordre, ceci brise cette règle, mais pourquoi quelqu'un voudrait que les tests soient ordonnés de manière aléatoire dans les rapports, je n'en ai aucune idée, donc NAME_ASCENDING est ce que j'utilise toujours.

Mais les avantages de cette méthode sont une configuration simple avec un minimum de code et sans avoir besoin d'étendre les classes/exécutants etc... La durée des tests est plus précise puisque le temps de configuration est reporté dans la méthode _warmup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X