Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
ens:cvda2016:tpbiblio [2016/05/17 06:30] admin Cordier Amelie () [Contexte] |
ens:cvda2016:tpbiblio [2016/05/29 13:54] (Version actuelle) admin Cordier Amelie () |
||
---|---|---|---|
Ligne 15: | Ligne 15: | ||
* Appréhender le concept de programmation dirigée par les tests (TDD, Test Driven Development). | * Appréhender le concept de programmation dirigée par les tests (TDD, Test Driven Development). | ||
* En bonus : utiliser Git. | * En bonus : utiliser Git. | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | Ce n'est pas obligatoire mais... ce serait une bonne idée que vous utilisiez un gestionnaire de versions tel que Git pour enregistrer les différentes étapes de votre projet... Rappelez-vous que c'est en vous entraînant que vous vous familiariserez le mieux avec ce type d' | ||
+ | </ | ||
===== Partie 1. Création de la classe Personne ===== | ===== Partie 1. Création de la classe Personne ===== | ||
Ligne 33: | Ligne 37: | ||
* Suggestions d' | * Suggestions d' | ||
</ | </ | ||
+ | |||
+ | {{ : | ||
3. Créez une classe de test pour la classe '' | 3. Créez une classe de test pour la classe '' | ||
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 | 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' | doit être le suivant. Notez que pour l' | ||
+ | |||
+ | <note important> | ||
<file java PersonneTest.java> | <file java PersonneTest.java> | ||
Ligne 169: | Ligne 177: | ||
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). | 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' | + | |
+ | <note tip>Ajoutez l' | ||
- Comment gérer l' | - Comment gérer l' | ||
- Quel est l' | - Quel est l' | ||
+ | </ | ||
5. Nous allons maintenant traiter le cas du numéro de personne. | 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 ? | * 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 | + | * Concevez et écrivez |
* Implémentez les méthodes correspondantes | * 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. | * 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 | + | <note warning>Attention : dans le corrigé proposé |
- | De plus, la méthode | + | |
liés à la gestion des numéros de personnes. C'est un choix d' | liés à la gestion des numéros de personnes. C'est un choix d' | ||
+ | </ | ||
+ | |||
+ | ====== Partie 2. Gestion d'une liste de personnes ===== | ||
+ | |||
+ | 6. Créez une nouvelle classe '' | ||
+ | |||
+ | <note tip> | ||
+ | On peut légitimement se demander comment implémenter la méthode " | ||
+ | |||
+ | 7. Cette fois-ci, c'est votre tour d' | ||
+ | Une fois que vous avez fini d' | ||
+ | |||
+ | 8. Complétez maintenant votre classe '' | ||
+ | |||
+ | 9. Il est temps de générer la **javadoc** pour vous assurer que le processus fonctionne correctement. Vous < | ||
+ | ====== Partie 3. Refactoring ====== | ||
+ | |||
+ | 10. Ne trouvez vous pas qu'il est fastidieux de recréer les personnes et les listes de personnes à chaque test ? Nous allons donc utiliser les outils proposés par JUnit (méthodes de '' | ||
+ | |||
+ | <note tip>Le **refactoring** consiste à ré-organiser du code de façon à le rendre plus " | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | ====== Partie 4. Génération de code ====== | ||
+ | |||
+ | 11. Nous allons maintenant nous occuper de la classe '' | ||
+ | |||
+ | Vous trouverez {{: | ||
+ | |||
+ | * Ouvrez le fichier avec ArgoUML. | ||
+ | * Explorez le projet pour afficher la classe '' | ||
+ | * Si la classe apparaît comme vide, cliquez (bouton droit) dessus, et choisissez d' | ||
+ | * Cherchez comment générer du code Java directement à partir de ce diagramme de classes. Magique non ? Imaginez le temps que vous pourriez gagner sur un projet contenant plusieurs dizaines de classes et plusieurs packages ! | ||
+ | |||
+ | 12. Il est temps de finir la classe '' | ||
+ | |||
+ | <file java LivreTest.java> | ||
+ | /** | ||
+ | * Bibliothèque | ||
+ | * TP CVDA 2016 - Amélie Cordier | ||
+ | */ | ||
+ | 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.*; | ||
+ | |||
+ | |||
+ | /** | ||
+ | * Classe LivreTest | ||
+ | * @author Amélie Cordier - IUT Lyon 1 | ||
+ | * @version 1.0 | ||
+ | * mai 2016 | ||
+ | */ | ||
+ | public class LivreTest { | ||
+ | | ||
+ | static Personne alan; | ||
+ | static Livre computing; | ||
+ | | ||
+ | /** | ||
+ | * | ||
+ | */ | ||
+ | public LivreTest() { | ||
+ | } | ||
+ | | ||
+ | /** | ||
+ | * Création d'une personne et d'un livre à l' | ||
+ | * Ces éléments ne seront pas modifiées par la suite. | ||
+ | */ | ||
+ | @BeforeClass | ||
+ | public static void setUpClass() { | ||
+ | alan = new Personne(" | ||
+ | computing = new Livre(" | ||
+ | } | ||
+ | | ||
+ | /** | ||
+ | * | ||
+ | */ | ||
+ | @AfterClass | ||
+ | public static void tearDownClass() { | ||
+ | } | ||
+ | | ||
+ | /** | ||
+ | * | ||
+ | */ | ||
+ | @Before | ||
+ | public void setUp() { | ||
+ | } | ||
+ | | ||
+ | /** | ||
+ | * | ||
+ | */ | ||
+ | @After | ||
+ | public void tearDown() { | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de getNumLivre de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testGetNumLivre() { | ||
+ | assertEquals(0, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de getNumLivre de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testGetNumLivreTwoBooks() { | ||
+ | Livre mind = new Livre(" | ||
+ | Livre mind2 = new Livre(" | ||
+ | assertEquals(mind.getNumLivre()+1, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de getTitre de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testGetTitre() { | ||
+ | String titreAttendu = " | ||
+ | assertTrue(computing.getTitre().equals(titreAttendu)); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de getNombreDePages de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testGetNombreDePages() { | ||
+ | assertEquals(250, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de getAuteur de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testGetAuteur() { | ||
+ | assertEquals(alan, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de setTitre de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testSetTitre() { | ||
+ | Livre mind = new Livre("?", | ||
+ | mind.setTitre(" | ||
+ | assertTrue(mind.getTitre().equals(" | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de setAuteur de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testSetAuteur() { | ||
+ | Livre ged = new Livre("?", | ||
+ | Personne douglas = new Personne(" | ||
+ | ged.setAuteur(douglas); | ||
+ | assertTrue(ged.getAuteur().equals(douglas)); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de setNombreDePages de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testSetNombreDePages() { | ||
+ | Livre mind = new Livre("?", | ||
+ | mind.setNombreDePages(500); | ||
+ | assertEquals(500, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de toString de la classe Livre. | ||
+ | */ | ||
+ | @Test | ||
+ | public void testToString() { | ||
+ | String expStr = " | ||
+ | assertTrue(computing.toString().equals(expStr)); | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | </ | ||
+ | ====== Partie 5. La pause s' | ||
+ | |||
+ | Dans la prochaine partie, vous allez passer à la gestion de la bibliothèque. | ||
+ | Avant cela, il est nécessaire de prendre un peu de recul sur ce que vous avez fait, de vérifier que tout est codé correctement, | ||
+ | Prenez donc quelques minutes pour : | ||
+ | * Vérifier que les parties cruciales de votre code sont commentées correctement | ||
+ | * Vérifier que la Javadoc de ce qui est implémenté est correcte et complète | ||
+ | * Vérifier que vous n'avez pas oublié des tests importants | ||
+ | * Vérifier que vous respectez bien les bonnes pratiques de programmation (pensez au " | ||
+ | * l' | ||
+ | * le respect des conventions de nommage des variables | ||
+ | * le non " | ||
+ | * Vérifier que tous les tests passent, après les avoir refactorés au besoin | ||
+ | * Faire un commit de cette version " | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | ** Couverture des tests ** | ||
+ | |||
+ | Pour évaluer la qualité de vos tests, vous pouvez également analyser la couverture des tests. Il existe de nombreux outils indépendants pour faire cela (Jenkins, Sonar, etc.), mais ici, pour rester simples et efficaces, nous allons utiliser un plugin de Netbeans. | ||
+ | |||
+ | La première fois, il est nécessaire d' | ||
+ | |||
+ | Une fois le plugin installé et Netbeans redémarré, | ||
+ | |||
+ | ====== Partie 6. Gestion de la bibliothèque | ||
+ | |||
+ | Passez maintenant à l' | ||
+ | Pour mémoire : une bibliothèque est une structure dans laquelle on peut mettre des livres. | ||
+ | La classe '' | ||
+ | de la bibliothèque, | ||
+ | pour ces deux derniers cas (i.e. quand le livre n'est pas trouvé). | ||
+ | |||
+ | Essayez d' | ||
+ | * Création du squelette de la classe | ||
+ | * Écriture des tests unitaires | ||
+ | * Complétion de la classe | ||
+ | * Exécution des tests | ||
+ | * Refactoring jusqu' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ====== Partie 7. Finalisation du projet | ||
+ | |||
+ | A nouveau, prenez le temps d' | ||
+ | Refactorez ce qui nécessite de l' | ||
+ | Vérifiez la couverture de vos tests. | ||
- | Partie 2. Gestion d'une liste de personnes | + | Lorsque vous aurez terminé votre projet, il ne vous restera plus qu'à mettre à jour quelques éléments : |
+ | * La Javadoc, pour prendre en compte toutes les nouvelles améliorations que vous avez apportées | ||
+ | * Le diagramme | ||
- | Créez une nouvelle classe " | + | De plus, si vous ne l'avez pas encore fait, il est probablement temps de pousser votre historique |
- | Cette fois-ci, c'est votre tour d' | ||
- | Si vous la générez manuellement, | ||
- | Il n'y a pas trop lieu de tester afficherAppartenance | ||