Introduction aux tests unitaires - Le talent d'Achille

À l'issue de ce TP, vous devrez rendre un compte-rendu manuscrit. Le compte-rendu devra contenir, pour chaque question posée dans le TP, une réponse argumentée, ainsi qu'une copie manuscrite correctement indentée et colorée syntaxiquement du code permettant de répondre à la question. Rappelez-vous que vous passez beaucoup plus de temps à lire du code qu'à en écrire, et pour que la lecture soit agréable, il faut que le code soit présenté proprement. Comme le montrent plusieurs études récentes, l'écriture manuscrite de code est une étape de formation nécessaire et indispensable qui vous permettra d'acquérir rapidement de bons réflexes de programmation.

Achille, gérant d'une grande société de divertissement a inventé un système de résolution de problème révolutionnaire et vous en confie l'implémentation.

Malheureusement, Achille souffre d'un rare trouble du comportement qui l'empêche d'expliquer quoi que ce soit (ce trouble s'appelle la circophobie). Achille ne sait montrer ce qu'il veut que par l'exemple. Il va donc vous falloir composer avec cette méthode de communication atypique.

Achille se présente devant vous avec des seaux transparents. Il se positionne devant un seau et sort un à un des objets (tous différents). Vous observez que chaque objet qui apparaît est de taille supérieure à celle de l'objet précédent. Il répète l'opération avec d'autres seaux et le même phénomène se produit. Vous observez cependant que le nombre d'objets varie d'un seau à l'autre.

Achille se positionne devant un seau et le retourne. Rien ne tombe. Achille le lance au loin. Manifestement, les seaux vides n'appartiennent pas au monde d'Achille.

Après avoir vidé tous les seaux, Achille en choisi un et remplit avec les objets placés au sol (dans un ordre aléatoire). Au bout de 10 objets, Achille se met en colère car ça ne rentre plus dans le seau. Tous les seaux ont la même taille.

Question 1. En supposant que les objets sont matérialisés par des chaînes de caractères et leurs tailles par la longueur des chaînes de caractères, proposez une modélisation possible de la classe seau.

Achille dépose des seaux contenant des objets devant lui. Il passe devant chaque seau. Parfois il sourit, parfois il fait la grimace. Il réitère l'opération jusqu'à ce que vous compreniez qu'il sourit lorsque le contenu du seau est trié par ordre de taille, et qu'il fait la grimace sinon.

Question 2.a. Proposez un nom pour la méthode qu'Achille vient de vous décrire.

Question 2.b. Écrivez les tests pour cette méthode.

Question 2.c. Écrivez le code de la méthode.

Alors que Bozo traverse la piste en courant, perturbant ainsi la belle organisation d'Achille, vous découvrez que les objets contenus dans les seaux peuvent être lancés. Seuls les objets au sommet du seau peuvent être lancés, ce qui a pour conséquence immédiate et étonnante qu'ils disparaissent du seau, et de calmer un peu Achille. Alors que Bozo continue à courir dans tous les sens et qu'Achille brille par sa dextérité, vous observez à juste titre qu'on ne peut pas lancer un objet depuis un seau vide. Quel talent de détective tout de même !

Question 3.a. Proposer un nom pour cette nouvelle méthode.

Question 3.b. Écrivez les tests pour cette méthode.

Question 3.c. Écrivez le code de la méthode.

Tari est une collaboratrice d'Achille. Olivia, de son prénom, est particulièrement habile pour attraper au vol les objets lancés par Achille… enfin, certains, pas tous… Lorsqu'Olivia attrape consécutivement cinq objets lancés, elle gratifie le public d'un spectacle époustouflant. Malheureusement, jusqu'à aujourd'hui, personne ne savait déterminer les objets attrapables par Olivia et les autres… mais, grâce à l'invention géniale d'Achille et à vos talents de développeur, ce problème est sur le point d'être résolu.

Voici une liste de choses qu'Olivia peut attraper : corde, froid, rhume, coup de soleil. Et voici une liste d'objets qu'Olivia ne parviendra pas à attraper : ballon, main, pain.

Question 4.a. Trouvez la logique.

Question 4.b. Écrivez les tests.

Question 4.c. Écrivez la ou les méthodes qui manquent pour l'achèvement de la machine révolutionnaire d'Achille.

Question 4.d. Olivia adore le poisson, mais déteste le poison. Est-ce que votre méthode de test fonctionne avec ces nouveaux cas ?

Maintenant que vous avez tous les éléments en main, assemblez-les pour construire la machine infernale et révolutionnaire d'Achille, qui permettra à coup sûr de faire faire à Olivia son numéro époustouflant.

Question 5. Devinez donc les questions 5.a, 5.b et 5.c.

Seau.java
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testsunitairesg1;
 
import java.util.ArrayList;
 
/**
 *
 * @author amelie.cordier
 */
public class Seau {
 
    ArrayList seau;
 
    public Seau(){
        seau = new ArrayList();
    }
 
    public Seau(String truc1, String truc2){
        seau = new ArrayList();
        seau.add(truc1);
        seau.add(truc2);
    }
 
    public void ajouter(String chose){
        seau.add(chose);
    }
 
    public void afficher(){
        System.out.println(seau);
    }
 
    public int nbElements(){
        return seau.size();
    }
 
}
SeauTest.java
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testsunitairesg1;
 
import org.junit.Test;
import static org.junit.Assert.*;
 
/**
 *
 * @author amelie.cordier
 */
public class SeauTest {
 
    public SeauTest() {
    }
 
    /**
     * Vérifie qu'un seau vide est bien vide
     */
    @Test
    public void testSeauVide() {
        Seau monseau = new Seau();
        assertEquals(0,monseau.nbElements());
    }
 
    /**
     * Vérifie que l'ajout à un seau vide fait bien passer la taille à 1
     */
    @Test
    public void testAjouterASeauVide() {
        Seau monseau = new Seau();
        monseau.ajouter("patate");
        assertEquals(1,monseau.nbElements());
    }
 
    /**
     * Vérifie que l'ajout à un seau qui contient 2 elts fait bien passer la taille à 3
     */
    @Test
    public void testAjouterASeau2Elts() {
        Seau monseau = new Seau("bli", "bli");
        monseau.ajouter("patate");
        assertEquals(3,monseau.nbElements());
    }
    /**
     * (redondant) vérifie le bon fonctionnement de nbElements
     */
    @Test
    public void testNbElements() {
        Seau monseau = new Seau("chose", "machin");
        assertEquals(2, monseau.nbElements());
    }
 
}