Pages

vendredi 8 novembre 2013

Catégoriser ses tests avec Junit

Quand on développe une application informatique, nous avons besoin de faire des tests et de les automatiser pour éviter de faire et refaire sans arrêt les mêmes choses. Bien sûr je parle d'un monde idéal car c'est rarement le cas à cause du coût important de mise en place.

Il existe différents types de tests : les tests unitaires, les tests d'intégration, les tests fonctionnels, les tests de chargement, les tests de charge.... L'exécution des tests peut être plus ou moins longue en fonction de leur nature. Quand nous développons nous avons besoin d'exécuter rapidement les tests pour valider nos changements. Les tests plus longs sont eux lancés sur la plateforme d'intégration continue.

Mais comment faire pour catégoriser nos tests lorsque nous utilisons Junit. Avant la version 4.8 ce n'était pas possible. Il fallait jouer sur l'organisation des tests ou sur le nom des classes pour différencier les différents types. Maintenant nous pouvons utiliser les Categories.

Le principe est simple. Vous définissez une ou plusieurs interfaces correspondant à vos différentes catégories (pour le cas le plus courant des tests rapides ce n'est pas utile)

public interface FunctionalTest { }
public interface IntegrationTest { }

Ensuite vous utilisez l'annotation @Category sur votre classe ou sur vos méthodes de tests

@Category(IntegrationTest.class)
public class ExampleIntegrationTest {
  
    @Test
    public void methodTestIntegration1(){
        System.out.println("Test integration");
    }

    @Test
    public void methodTestIntegration2(){
        System.out.println("Test integration");
    }

}

public class CategorieExampleTest {

    @Test
    public void methodNonLieeCategorie(){
        System.out.println("Pas de catégorie");
    }

    @Test
    @Category(IntegrationTest.class)
    public void methodTestIntegration(){
        System.out.println("Test integration");
    }

    @Test
    @Category(FunctionalTest.class)
    public void methodTestFunctional(){
        System.out.println("Test fonctionnel");
    }

}

Il ne vous reste plus qu'à paramétrer le lancement des tests. Si on reste sur Junit, vous devez définir une TestSuite avec un Runner particulier. Vous pouvez utiliser les annotations @Categories.ExcludeCategory et @Categories.IncludeCategory pour préciser les catégories que vous voulez exclure ou inclure

@RunWith(Categories.class)
@Suite.SuiteClasses(CategorieExampleTest.class)
@Categories.ExcludeCategory(FunctionalTest.class)
public class ExampleTestSuite { }

Il y a très longtemps que je n'écris plus de TestSuite et si vous êtes utilisateurs de Maven vous allez pouvoir passer par le plugin surefire pour définir quelles catégories sont lancées.

             <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <groups>!com.javamind.FunctionalTest</groups>
                </configuration>
            </plugin>

Dans cet exemple comme j'ai préciser un ! devant com.javamind.FunctionalTest, les tests de la catégorie FunctionalTest ne sont pas exécutés. Si je l'enlève seule la catégorie des tests fonctionnels est lancée.

En mixant avec les profils Maven vous pouvez facilement paramétrer le build de votre projet pour qu'il lance plus ou oins de tests en fonction du contexte d'exécution.


Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.