Ceci est une ancienne révision du document !
TP Bibliothèque (tests unitaires, TDD, utilisation de Netbeans, et révisions de Java)
Contexte
Ce TP est fortement inspiré de l'exercice de synthèse “série 10” proposé dans les cours de Java au S2, dans lequel il est question de gérer une petite bibliothèque de livres, et d'une liste de personnes. Cela dit, il contient quelques variations par rapport à l'énoncé initial. Par conséquent, vous ne devez pas considérer que c'est un corrigé de l'exercice, mais juste une “façon de faire”.
Les objectifs pédagogiques pour le cours de CVDA sont les suivants :
- Apprendre à mieux maîtriser les différents aspects de Netbeans (ou de tout IDE équivalent).
- Maîtriser les tests unitaires.
- Appréhender le concept de programmation dirigée par les tests (TDD, Test Driven Development).
- En bonus : utiliser Git.
Partie 1. Création de la classe Personne
1. Créez un projet Java nommé TPBibliotheque
.
2. Dans le package bibliotheque
, créez une classe Personne.java
selon les spécifications données ci-dessous.
N'implémentez pas les méthodes. Contentez-vous de retourner des valeurs par défaut lorsque cela est nécessaire.
Assurez-vous qu'aucune erreur n'est présente à la fin de la création de la classe (pas de symbole de Warning ou
d'erreur dans la marge, ni auprès du nom du fichier dans l'explorateur de projet).
<note important>Attention : plus tard dans le TP, vous devrez générer la Javadoc. Pensez-y dès le début, sinon, ce sera très fastidieux.</note>
<note tip> Pendant que vous implémentez votre méthode, observez quelques outils que vous offre votre IDE (Netbeans ou autre) :
- Auto-complétion : lorsque vous créez une méthode, l'accolade fermante s'insère automatiquement.
- Aide à la génération de la Javadoc : lorsque vous tapez le début d'un commentaire de Javadoc, les paramètres sont générés automatiquement.
- Suggestions d'implémentation : Netbeans propose de définir comme
Final
certaines variables. Pourquoi ?
</note>
3. Créez une classe de test pour la classe Personne.java
. Vous pouvez choisir d'utiliser les fonctionnalités de génération automatique, ou bien
le faire à la main, mais dans tous les cas, prenez bien garde à séparer le code de test du code métier. Le contenu de votre classe de test
doit être le suivant. Notez que pour l'instant, on ne se préoccupe pas de la gestion du numéro de personne. Exécutez les tests et observer qu'aucun d'eux ne passe.
- PersonneTest.java
package bibliotheque; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; /** * * @author Amélie Cordier */ public class PersonneTest { public PersonneTest() { } @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { } @After public void tearDown() { } /** * Test of getNumero method, of class Personne. */ @Test public void testGetNumero() { fail("Test à implémenter plus tard"); } /** * Test of getNom method, of class Personne. */ @Test public void testGetNom() { Personne alan = new Personne("Turing", "Alan", 1912); assertEquals("Turing", alan.getNom()); } /** * Test of getPrenom method, of class Personne. */ @Test public void testGetPrenom() { Personne alan = new Personne("Turing", "Alan", 1912); assertEquals("Alan", alan.getPrenom()); } /** * Test of getAnNaissance method, of class Personne. */ @Test public void testGetAnNaissance() { Personne alan = new Personne("Turing", "Alan", 1912); assertEquals(1912, alan.getAnNaissance()); } /** * Test of getDernierNum method, of class Personne. */ @Test public void testGetDernierNum() { fail("Test à implémenter plus tard"); } /** * Test of setNumPers method, of class Personne. */ @Test public void testSetNumPers() { Personne alan = new Personne("Turing", "Alan", 1912); alan.setNumPers(18); assertEquals(18, alan.getNumero()); } /** * Test of setNomPers method, of class Personne. */ @Test public void testSetNomPers() { Personne alan = new Personne("Turing", "Alan", 1912); alan.setNomPers("Minsky"); assertEquals("Minsky", alan.getNom()); } /** * Test of setPrenomPerso method, of class Personne. */ @Test public void testSetPrenomPers() { Personne alan = new Personne("Turing", "Alan", 1912); alan.setPrenomPers("Marvin"); assertEquals("Marvin", alan.getPrenom()); } /** * Test of setAnNaissance method, of class Personne. */ @Test public void testSetAnNaissance() { Personne alan = new Personne("Turing", "Alan", 1912); alan.setAnNaissance(1990); assertEquals(1990, alan.getAnNaissance()); } /** * Test of toString method, of class Personne. */ @Test public void testToString() { Personne alan = new Personne("Turing", "Alan", 1912); assertEquals("Turing, Alan, 1912", alan.toString()); } }
4. Implémentez les méthodes de la classe Personne de sorte à ce que tous les tests (sauf les deux tests relatifs à la gestion des numéros). Ajoutez l'annotation @Ignore pour ignorer ces deux tests. Observez :
- Comment gérer l'import nécessaire ?
- Quel est l'impact de @Ignore sur le résultat de l'évaluation des tests ?
5. Nous allons maintenant traiter le cas du numéro de personne.
- Quelles sont les différentes stratégies pour gérer le numéro de personne ? Quels sont les avantages et les inconvénients de chacune ?
- Ecrivez les tests permettant de vérifier le bon fonctionnement de l'affectation des numéros de personne.
- Implémentez les méthodes correspondantes
- Mettez à jour la méthode toString() de Personne pour afficher les n° de personne, et mettez également à jour le test correspondant.
Attention : dans le corrigé proposé, la solution retenue n'est pas conforme aux spécifications initiales du sujet ! La méthode “getDernierNum” n'existe plus. De plus, la méthode “setNumPers” est remplacée par “getNextNumPers”. Notez enfin que cette dernière méthode est privée, de sorte à éviter les mauvais usages liés à la gestion des numéros de personnes. C'est un choix d'implémentation. D'autres solutions auraient été possibles.
Partie 2. Gestion d'une liste de personnes
Créez une nouvelle classe “ListePersonnes” dont la mission sera de gérer une liste de Personnes. Comme dans la question 2 : n'implémentez pas les méthodes. Contentez-vous d'écrire un squelette fonctionnel.
Cette fois-ci, c'est votre tour d'écrire les tests de cette classe. Générez la classe de test (manuellement, ou automatiquement, à votre convenance). Si vous la générez manuellement, observez qu'il est parfois nécessaire de modifier le code automatiquement généré ;)
Il n'y a pas trop lieu de tester afficherAppartenance