Testy-box: Le bon goût des tests unitaires

Dans notre environnement micro-service constitué de beaucoup de projets différents, il est fréquent de retrouver certains besoins en termes de tests unitaires. Lors de notre passage à Junit 5, nous en avons profité pour mettre au propre nos outils de test pour pouvoir les Open Sourcer.

testy-box project

Le projet java est disponible sur github: testy-box.

Les différents modules

Le projet est divisé en modules, chacun fournissant des outils pour faciliter les tests dans un domaine particulier.

testy-core-box

Le module principal, utilisé dans les tests de presque toutes nos applications. Il contient entre autres une Extension Junit capable de chaîner d’autres extensions et d’assurer l’ordre d’exécution de ces dernières. Un peu comme le faisait la RuleChain avec Junit 4.

<dependency>
    <groupId>fr.irun</groupId>
    <artifactId>testy-core-box</artifactId>
    <version>1.3.1</version>
</dependency>
@RegisterExtension
static final ChainedExtension chain = ChainedExtension
        .outer(wDataSource)
        .append(wIrunDatabase)
        .register();

testy-beat-box

testy-beat-box

Ce module permet de faciliter les tests qui font intervenir des Event Broker type RabbitMQ. Grâce à Apache Qpid une extension monte un Event Broker standard (compatible AMQP) en mémoire et simule n’importe quel Event Broker physique sans avoir à monter un environnement de test trop lourd.

<dependency>
    <groupId>fr.irun</groupId>
    <artifactId>testy-beat-box</artifactId>
    <version>1.3.1</version>
</dependency>
@RegisterExtension
static final WithRabbitMock withRabbitMock = WithRabbitMock
            .builder()
            .build();

@BeforeAll
static void beforeClass(SenderOptions senderOptions,
                        ReceiverOptions receiverOptions) {
    // (...)
}

testy-jooq-box

testy-jooq-box

Ce module fournit les outils de test impliquant une base de données. Nous utilisons jOOQ dans nos projets c’est pourquoi ces outils sont très orientés vers ce DSL.

Parmi les outils disponibles, une extension qui permettra de monter une BDD H2 en mémoire pour les tests :

<dependency>
    <groupId>fr.irun</groupId>
    <artifactId>testy-jooq-box</artifactId>
    <version>1.3.1</version>
</dependency>
@RegisterExtension
static final WithInMemoryDatasource wDataSource = WithInMemoryDatasource
            .builder()
            .setTraceLevel(DatabaseTraceLevel.ERROR)
            .setCatalog("my_catalog")
            .build();

En plus de cette extension, testy-jooq-box fournit des extensions pour injecter simplement les composants jOOQ dans les tests (DSLContext par exemple).

Enfin, ce module fournit une extension qui permet de charger des données de test dans la base in-memory. En fonction du test exécuté, les données peuvent être remises à zéro ou conservées en l’état afin d’optimiser la vitesse d’exécution des tests.

testy-mongo-box

testy-mongo-box

Enfin, il y a le module mongo pour les tests nécessitant la base de données du même nom. Mongo ne possède pas encore de version in-memory de sa base, le module utilise donc de.flapdoodle.embed.mongo qui va s’occuper de télécharger la version de Mongo cité dans le pom pour ensuite l’exécuter sur la machine de test. Cette alternative n’est pas très subtile, mais elle a su faire ses preuves et fonctionne bien.

<dependency>
    <groupId>fr.irun</groupId>
    <artifactId>testy-mongo-box</artifactId>
    <version>1.3.1</version>
</dependency>
@RegisterExtension
static final WithEmbeddedMongo wMongo = WithEmbeddedMongo
        .builder()
        .setDatabaseName("my_database")
        .build();

Comme pour jOOQ, le module fournit aussi des extensions pour gérer les données de test de façon optimisée.


Si ces quelques fonctionnalités vous intéressent, n’attendez plus pour “tester” ce projet ! Rendez-vous sur le Github d’i-Run, nous accueillerons vos retours avec intérêt.