Dernière modification : Dec 08 , 2024

Gestion des timeouts dans vos tests unitaires

Cette fonctionnalité est pratique dans les cas suivants :

  • S'assurer de la performance de certaines fonctionnalités
  • Maintenir un temps de build raisonnable en cas de ralentissement du système (en forcant tous les tests unitaires à tourner sous X secondes)

Le temps d'exécution sous Java varie énormément (entre votre poste, l'intégration continue etc).

Il vaut mieux ne pas mettre des timeouts trop bas.

Exemple d'utilisation

class TimeoutDemo {

    @BeforeEach
    @Timeout(5)
    void setUp() {
        // le test échoue si le temps d'exécution du test dépasse 5 secondes
    }

    @Test
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void echoueSiTempsExecutionSuperieurA100Millisecondes() {
        // Surchage et définit le temps d'exécution maximum du test à 100ms
    }
}

Configuration du timeout par propriété

JUnit 5 propose également un ensemble de propriétés pour définir une configuration globale aux tests dont les timeouts.

Propriété Utilisation
junit.jupiter.execution.timeout.default timeout pour toutes les méthodes testables et le cycle de vie
junit.jupiter.execution.timeout.testable.method.default timeout pour toutes les méthodes testables
junit.jupiter.execution.timeout.test.method.default timeout pour les méthodes @Test
junit.jupiter.execution.timeout.testtemplate.method.default timeout pour les méthodes @TestTemplate
junit.jupiter.execution.timeout.testfactory.method.default timeout pour les méthodes @TestFactory
junit.jupiter.execution.timeout.lifecycle.method.default timeout pour les méthodes du cycle de vie
junit.jupiter.execution.timeout.beforeall.method.default timeout pour les méthodes @BeforeAll
junit.jupiter.execution.timeout.beforeeach.method.default timeout pour les méthodes @BeforeEach
junit.jupiter.execution.timeout.aftereach.method.default timeout pour les méthodes @AfterEach
junit.jupiter.execution.timeout.afterall.method.default timeout pour les méthodes @AfterAll

Configurer la plateforme JUnit

Pour configurer JUnit, il faut créer un fichier junit-platform.properties par exemple dans src/test/resources.

Il est aussi possible de passer les propriétés via le plugin Surefire de Maven :

<!-- ... -->
<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <properties>
                    <configurationParameters>
                        junit.jupiter.conditions.deactivate = *
                        junit.jupiter.extensions.autodetection.enabled = true
                        junit.jupiter.testinstance.lifecycle.default = per_class
                    </configurationParameters>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

Gestion des timeouts dans vos tests unitaires

Created by Sylvain Leroy