avec JUnit et SonarQube
Test en Java avec JUnit 4.x Application au programme Graphab Intégration dans la chaîne de développement Couverture de code avec JaCoCo et SonarQube
Test en Java avec JUnit 4.x JUnit : un standard de facto pour Java très utilisé bien intégré dans les IDE beaucoup d'extensions disponibles Autre solution répandue : TestNG
Test en Java avec JUnit 4.x Le code des tests est placé dans un répertoire distinct du code de l'application Avec Maven : code source src/main/java/ code des tests src/test/java/ Eclipse & Netbeans : code source src/ code des tests test/
Test en Java avec JUnit 4.x Aucune obligation de nommage pour les classes et les méthodes de test tout est défini par les annotations @Test : méthode de test @Before : avant chaque test @After : après chaque test @BeforeClass : initialisation des tests @AfterClass : finalisation des tests
Test en Java avec JUnit 4.x public class ProjectTest { @BeforeClass public static void setupclass() { // exécuté une fois avant tous les tests de cette classe } @AfterClass public static void teardownclass() { // exécuté une fois après tous les tests de cette classe } @Before public void setup() { // exécuté avant chaque test de cette classe } @After public void teardown() { // exécuté après chaque test de cette classe } @Test public void testconstructor() { // teste le constructeur } @Test public void testmethod1() { // teste une méthode } @Test public void testmethod2() { // teste une autre méthode } }
Test en Java avec JUnit 4.x Number.java : public class Number { public double value;... public Number multiply(number n) { return new Number(value * n.value); } } NumberTest.java : import static org.junit.assert.*; public class NumberTest { @Test public void testmultiply() { // vérifie que 5*0.2 = 1 assertequals(new Number(5).multiply(new Number(0.2)).value, 1); asserttrue(new Number(5).multiply(new Number(0.2)).value == 1); // vérifie que 0.33*3=1 à une précision de 0.01 assertequals(new Number(0.33).multiply(new Number(3)).value, 1, 0.01); } }
Application des tests au logiciel Graphab Graphab : logiciel de modélisation des réseaux écologiques par les graphes paysagers. Développé au laboratoire ThéMA depuis 2009 http://thema.univ-fcomte.fr/productions/graphab
Application au programme Graphab
Application au programme Graphab
Application au programme Graphab
Application au programme Graphab Entre test unitaire et test d'intégration Objectif : tester les grandes phases de traitement lancé par l'utilisateur sur un jeu de données réel Traitements testés : - création d'un projet - création de plusieurs jeu de liens - création de plusieurs graphes sur les jeux de liens - calcul de toutes les métriques existantes sur tous les graphes
Application au programme Graphab On ne vérifie pas si le résultat est correct mais seulement s'il est toujours le même test de non régression Suppose une première phase manuelle de vérification de la justesse du résultat
Application au programme Graphab Oblige une exactitude des résultats ou bien une mesure de l'imprécision modification du code pour enlever les aléas en cas d'égalité aléa de la parallélisation Demande des corrections en cas de modifications du code L'exécution des tests peut vite devenir très longue
Intégration dans la chaîne de développement Serveur de développement : - code source : Mercurial - intégration : Jenkins - construction : Maven - qualité du code : SonarQube
Intégration des tests Développeur commit/push Mercurial url trigger Jenkins Maven build + test + deploy test results SonarQube Si un des tests échoue l'archive ne sera pas déployé et Jenkins mettra le projet en erreur.
Intégration des tests lancés par maven sont instrumentés par JaCoCo qui trace l'exécution de chaque instruction et chaque condition. SonarQube récupère le résultat de JaCoCo et l'intègre dans sa base. maven sonar:sonar JaCoCo peut être suffisant pour une utilisation en local avec Netbeans ou Eclipse
Intégration des tests
Couverture du code Code coverage : part de code source exécuté par les tests statement coverage : couverture des instructions branch (condition) coverage : couverture des conditions
Couverture du code Couverture des instructions
Couverture du code Couverture des conditions
Couverture du code SonarQube - vue agrégée en graphique ou tableau multi niveaux : projet, module, package, class - vue détaillée sur le code source - intègre beaucoup d'autres indicateurs : documentation, complexité, cycle...
Projets Packages Classes
Mon expérience : - demande un temps non négligeable à développer et à maintenir - temps d'exécution à optimiser - en 6 mois et 22 changements de code, aucune régression détectée. Mais très important, le développeur est beaucoup plus serein!