Les tests unitaires avec JUnit

L'objectif de ce TP est de vous permettre de prendre en main rapidement JUnit pour mettre en place des tests unitaires en Java. Le TP se décompose en 3 parties. Un compte-rendu est à remettre à la fin du TP. Le travail en binôme est autorisé.

Soit le code de la classe à tester suivant :

BinString.java
public class BinString {
    public BinString() {}
 
        public String convert(String s) {
            return binarise(sum(s));
        }
 
        public int sum(String s) {
            if (s=="") return 0;
            if (s.length ()==1) return ((int)(s.charAt(0)));
            return ((int)(s.charAt(0))) + sum(s.substring(1));
        }
 
        public String binarise(int x) {
            if (x==0) return "";
            if (x%2==1) return "1" + binarise(x/2);
            return "0"+binarise(x/2);
        }
} 

Soit le code de la classe de test suivant :

BinStringTest.java
import junit.framework.∗;
public class BinStringTest extends TestCase {
   private BinString binString ;
 
    public BinStringTest(String name) {
        super (name);
    }
 
    protected void setUp(){
        binString = new BinString();
    }
 
    public void testSumFunction(){
        int expected = 0;
        assertEquals(expected, binString.sum(""));
        expected = 100;
        assertEquals(expected, binString.sum("d"));
        expected = 265;
        assertEquals(expected, binString.sum("Add"));
    }
 
    public void testBinariseFunction() { 
        String expected = "101";
        assertEquals(expected, binString.binarise(5));
        expected = "11111100";
        assertEquals(expected, binString.binarise(252));
    }
 
    public void testTotalConversion() {
        String expected = "1000001";
        assertEquals(expected, binString.convert("A"));
    }
}   
  • En vous aidant de la javadoc de JUnit, expliquez dans votre compte-rendu ce que fait la classe BinStringTest.java.
  • Adaptez cette classe de test pour la faire fonctionner avec JUnit 4.
  • Exécutez les tests et commentez le résultat dans votre compte-rendu.
  • En vous aidant des résultats des tests, corrigez les erreurs dans la classe principale.
  • Relancez les tests jusqu’à ce que vous arriviez à faire fonctionner le programme.
  • Détaillez la démarche que vous avez suivie dans votre compte-rendu.

Dans cette partie, vous devez commencer par écrire les tests, puis écrire le code qui passe les tests. Rapportez tous les éléments de votre démarche, ainsi que les résultats obtenus dans votre compte-rendu.

1. Étant donné une chaîne de caractères, aboutir à une classe de code qui échange les 2 derniers caractères de cette chaîne. Les conditions de test à vérifier sont :

  • “AB” ⇒ “BA”
  • “RAIN” ⇒ “RANI”
  • “A” ⇒ “A”
  • “ “ ⇒ “ “

2. Aboutir à une classe de code qui enlève ‘A’ d’une chaîne de caractères s’il est présent dans les 2 premiers caractères de cette chaîne. Si ‘A’ est présent après les 2 premiers caractères, il ne doit pas être enlevé. Les conditions de test à vérifier sont :

  • “ABCD” ⇒ “BCD”,
  • “AACD” ⇒ “CD”,
  • “BACD” ⇒ “BCD”,
  • “BBAA” ⇒ “BBAA”,
  • “AABAA” ⇒ “BAA”
  • “A” ⇒ “”
  • “” ⇒ “”

Question subsidiaire : pensez-vous à d'autres tests qui seraient pertinents mains qui ne figurent pas dans cette liste ?

Appelez l'enseignant avant de commencer cette partie.

1. Sélection du sujet.

En fonction du chiffre qui vous aura été attribué, réalisez l'un des deux sujets ci-dessous.

Sujet 1. Écrire un programme permettant de calculer toutes les racines carrées des nombres compris entre A et B, A et B étant deux nombres entiers tels que A < B.

Sujet 2. Écrire un programme permettant d'afficher une matrice de taille MxN remplie de nombres aléatoires compris entre A et B. Les valeurs M, N, A et B doivent être passées en paramètre.

2. Travail à faire.

  • Écrivez le squelette de la classe principale et commentez-le.
  • Écrivez l'intégralité de la classe test. Cette classe doit comprendre :
    • des assertions,
    • des tests vérifiant que les exceptions sont bien levées quand elles doivent l'être,
    • des tests vérifiant que les boucles s'effectuent dans des temps raisonnables.
  • Formatez correctement les sorties de vos tests en utilisant les annotations @Before et @After.
  • Décrivez votre démarche dans votre compte-rendu.

3. Échangez votre travail avec votre voisin.

4. Sur le nouveau code obtenu :

  • Implémentez la classe principale.
  • Appliquez les tests.
  • Itérez jusqu'à obtention d'un programme fonctionnel et satisfaisant l'ensemble des tests.
  • Décrivez votre démarche dans votre compte-rendu.