Séance 5 — TP : Programmation outillée
(Re-)Positionnement dans le dépôt Git de GitLab
Voici la procédure que nous proposons (dans tous les cas « par défaut »). « En cas de panique », veuillez vous reporter à celle qui suit celle-ci.
-
Procédure
« repositionnement »
-
on repart d'un dépôt mis à jour et on continue dans la
branche develop
-
cd ~/CSC4102
cd csc4102-projet
git fetch # prendre connaissance des nouveautés
git branch # quelle est la branche courante ?
si pas déjà dans la branche develop alors « git checkout develop » # se positionner dans la branche
git pull origin develop # accepter les modifications de la branche
si conflit et besoin d'une fusion, « git mergetool --tool=meld » puis « git commit »
-
cd ~/CSC4102
-
on repart d'un dépôt mis à jour et on continue dans la
branche develop
« En cas de panique », veuillez suivre la procédure qui suit :
-
Procédure « nouveau
clonage »
-
on clone à nouveau le dépôt et on continue dans la
branche develop :
-
cd ~/CSC4102
mv csc4102-projet csc4102-projet_old # garder une copie au cas où du contenu n'ait pas été poussé
git clone URL_DE_VOTRE_PROJET
cd csc4102-projet
git checkout develop # positionnement dans la branche develop
-
cd ~/CSC4102
-
on clone à nouveau le dépôt et on continue dans la
branche develop :
Prise en main du module Maven du projet
- prendre connaissance du module Maven : configuration, compilation, exécution des tests, etc. ;
- prendre en main le code dans l'environnement de développement intégré (Eclipse) ;
- prendre en main l'intégration continue mise en place dans le projet.
Configuration du module Maven
Ouvrez le fichier pom.xml avec emacs (avant de démarrer votre IDE Eclipse) et adaptez les informations à votre binôme-projet : adaptez <artifactId>csc4102-Prenom1Nom1_Prenom2Nom2</artifactId> en y mettant vos prénoms et noms.
Cette configuration est primordiale pour la suite du module.
Module Maven
Des éléments de modélisation et aussi des éléments de programmation sont fournis depuis le début du projet. Les éléments de programmation sont déjà disponibles dans le projet Maven du répertoire src. Commençons par compiler le code avec la commande « mvn clean install ». En plus de l'affichage ci-dessous, vous remarquerez les téléchargements d'archives (fichiers jar) entre autres à partir du dépôt csc4102-util-snapshot.
Observons ce qui s'est passé :
-
le module dépend d'un module mis à disposition dans le
dépôt Maven du module CSC4102 :
csc4102-util-snapshot.
Nous pouvons vérifier que cette dépendance est maintenant
disponible dans notre dépôt Maven local avec la
commande
« ls -R ~/.m2/repository/eu/telecomsudparis/csc4102/csc4102-util/ » ; -
puis, nous voyons l'appel d'une séquence de greffons
(en anglais, plug-ins) :
- maven-clean-plugin : suppression du répertoire target (tout ce qui a été généré lors du processus de construction de l'exécution précédente) ;
- maven-resources-plugin : traitement des ressources autres que des classes JAVA. Nous n'en avons pas ; ce pourrait être des fichiers de données, des fichiers de configuration, etc. ;
- maven-compiler-plugin : compilation des classes JAVA ;
- maven-resources-plugin : traitement des ressources des tests. Nous n'en avons pas non plus ;
- maven-compiler-plugin : compilation des classes de test JAVA ;
- maven-surefire-plugin : exécution des tests ;
- ensuite, l'archive résultat est créée avec le greffon maven-jar-plugin. Cette archive contient les classes compilées de l'application. Nous aurions aussi pu générer l'archive des classes compilées des tests ainsi que les archives des codes source de l'application et des tests ;
-
et enfin, nous atteignons la fin de la construction du
logiciel avec l'installation des archives dans le dépôt
local (répertoire ~/.m2/repository/). La fin
est notifiée avec le message
« BUILD SUCCESS ». Nous
pouvons vérifier l'installation avec la commande
« ls -R ~/.m2/repository/eu/telecomsudparis/csc4102/*/1.0-SNAPSHOT/ ».
Création du projet dans l'IDE (Eclipse ou autre)
Pour créer le projet, Eclipse demande deux fichiers de configuration : .project et .classpath. Voici la manière de procéder :
- il s'agit d'utiliser le greffon m2e (Maven to Eclipse) de Eclipse : au lieu de créer le projet dans Eclipse comme un projet Java, importez-le comme un projet Maven (menu File > Import > Maven > Existing Maven Projects > Next puis Browse > ~/CSC4102/csc4102-projet/ et enfin Finish). Dans ce cas, c'est Eclipse qui crée les fichiers de configuration .project et .classpath. Dans la vue « package explorer » de Eclipse, un « M » est ajouté à côté du « J » sur l'icone du projet et les cibles Maven sont disponibles dans le menu contextuel : click droit > Run As.
Utilisation du projet Eclipse
Vous mettrez des assertions JAVA dans votre code, par exemple avec l'instruction « assert invariant(); » déjà utilisée dans les classes du squelette fourni. Nous proposons d'activer l'utilisation des assertions dans les tests JUnit : menu Window > Preferences > Java > JUnit puis cochez la case « Add '-ea' to VM arguments when creating a new JUnit launch configuration » (l'option « ea » de la machine virtuelle Java signifie « enable assertions »).
Pour exécuter les tests JUnit, sélectionnez tous les tests du module Maven (src/test/java) ou un paquetage (p.ex. .../validation) ou encore une classe de test (p.ex. .../validation/TestXxxx.java) puis le menu contextuel (click droit) Run as > JUnit Test.
Pour vérifier l'activation de l'option, ajoutez l'instruction « assert false; » comme première ligne dans un des tests (dans une classe Test*, dans une méthode annotée @Test) et ré-exécutez les tests de la classe de tests. Votre test modifié est en erreur avec un message du type « java.lang.Exception: [...] java.lang.AssertionError ». Avant de continuer, retirez bien sûr l'instruction « assert false; ».
Intégration continue mise en place avec GitLab CI
Lorsque vous poussez de nouveaux instantanés sur le dépôt Git de votre projet GitLab, la commande Maven indiquée dans le fichier .gitlab-ci.yml est exécutée par le service d'intégration continue GitLab CI. Cette commande compile les classes JAVA de votre projet Maven. Au fur et à mesure que nous avançons dans le projet, nous retirons les options de la commande mvn pour compiler les tests, etc.
À partir de cette séance, si vous poussez du code qui ne compile pas, vous recevrez un courriel avec un sujet de la forme « csc4102-projet | Pipeline ... has failed for branche[...] | beginning of SHA1 ».
Nous attendons que vous poussiez du code qui « passe » les vérifications de l'intégration continue, c'est-à-dire qui compile, etc., et donc que nous ne recevions pas de courriel d'alerte « Pipeline ... has failed ».
Découverte de la bibliothèque csc4102-util
du module
- manipuler des dates,
- saisir des données à la console (si vous décidez de faire une interface textuelle, ce qui n'est pas nécessaire),
- exception OperationImpossible.
Manipulation des dates
Afin de faciliter la programmation, la bibliothèque csc4102-util propose des méthodes pour manipuler des dates (jours), des instants (date avec heure, minute, etc.), des intervalles de dates. Dans le code du dépôt csc4102-exemples, parcourez les classes exemples ExempleManipulationsDatesInstants et ExempleManipulationsIntervalleDates dans le paquetage utilisationdelabibliothequeutil.
Saisies de texte à la console pour une interface textuelle
Si vous pensez que cela peut vous aider ou pour votre plaisir, vous pouvez programmer une interface textuelle, qui ne sera pas évaluée. Afin de faciliter la programmation d'une interface textuelle, la bibliothèque csc4102-util propose des méthodes pour afficher une invite et lire une valeur à la console (ligne, entier, double, et date). La classe ExempleManipulationsConsole dans le paquetage ...csc4102/utilisationdelabibliothequeutil fournit des exemples.
Début de la programmation
- programmer les premiers éléments des classes : les attributs et les constructeurs,
- programmer les premiers cas d'utilisation.
- dans cette séance, selon votre dextérité, peut-être est-il raisonnable de commencer par ne considérer que les situations normales. Nous présentons le traitement des situations avec erreurs dans la prochaine séance avec la gestion des exceptions ;
- cette séance est le début de la programmation ; l'objectif n'est pas de tout programmer avant la prochaine séance.
- quelques alignements entre la modélisation et la programmation sont possibles et presqu'inévitables ;
- les instructions dans les énoncés de TP ne sont pas et ne peuvent pas être complètes ;
- le début de la programmation proposé dans le module Maven en début de projet est modifiable et à modifier selon votre solution.
Classes avec leurs attributs et leurs constructeurs
Pour les classes impliquées dans les premiers cas
d'utilisation, programmez une première « version »
de la classe avec les premiers attributs que vous avez
identifiés et un construteur. Nous proposons que vous étudiiez
les autres méthodes de ces classes relativement à la
programmation des cas d'utilisation
Parmi les classes fournies au début du projet, certaines ont des instances dont les références sont mises dans des collections (listes ou dictionnaires) avec les associations ou compositions ayant des multiplicités « * » dans le diagramme de classes. Ces classes doivent redéfinir les méthodes equals et hashCode. Dans le code existant, vous avez un exemple de programmation d'une composition (avec la multiplicité « * ») de la façade du système vers une classe qui redéfinit les méthodes equals et hashCode.
Premiers cas d'utilisation
Programmez les premiers cas d'utilisation
Mise à disposition du travail effectué dans le dépôt Git de GitLab
Systématiquement, avant de terminer une séance de travail, que ce soit en salle TP ou chez vous, mettez à jour votre dépôt local (au cas où vous ayez travaillé en parallèle), validez et poussez votre travail :
-
git fetch # charger les modifications non
encore connues localement
git pull origin develop # mettre à jour votre branche develop
et si conflit et besoin d'une fusion, git mergetool --tool=meld -
git status # connaître l'état de votre
arborescence
selon les besoins, pour préparer la zone de transit pour la validation du prochain instantané, git add, git mv, git checkout --, etc.
git commit -m "je dis ce que contient le nouvel instantané" # valider les modifications de la zone de transit
git push origin develop# pousser pour mettre à disposition - connectez-vous à GitLab et vérifiez que votre travail a été poussé.
À LA FIN DU TP DE LA SÉANCE
Avant de quitter le TP, veuillez s'il vous plaît remplir dans la page Partage de votre groupe le tableau d'avancement de votre binôme-projet :
- page Partage du groupe de TP 1 pour l'avancement ;
- page Partage du groupe de TP 2 pour l'avancement ;
- page Partage du groupe de TP 3 pour l'avancement ;
- page Partage du groupe de TP 4 pour l'avancement ;
- page Partage du groupe de TP 5 pour l'avancement ;
- page Partage du groupe de TP 6 pour l'avancement.
C'est aussi le moment de parcourir la grille d'auto-évaluation de la séance.