diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 00000000..af9af861 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,28 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +mvnw* +.mvn diff --git a/bin/README.md b/bin/README.md new file mode 100644 index 00000000..aae68124 --- /dev/null +++ b/bin/README.md @@ -0,0 +1,121 @@ +# TD et TP IPI JVA350 Qualité logicielle + +## Pré-requis + +- Avoir installé un IDE : + - IntelliJ Ultimate, avec votre adresse IPI sur Jetbrains Student à https://www.jetbrains.com/student/ + - ou Eclipse, à https://www.eclipse.org/downloads/packages/release/2022-09/r/eclipse-ide-java-developers +- Savoir utiliser Git et les branches. Quelques liens : + - https://learngitbranching.js.org/ + - https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging +- Avoir un compte Github. Voici comment y configurer l'authentification de git par clé SSH : + - https://docs.github.com/en/authentication/connecting-to-github-with-ssh + - https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account + + +## TD + +### Plateforme d'intégration continue + +- forkez ce repository sur votre compte Github. + - Puis après chaque question, committez et pushez vos réponses sur votre repository. +- sur ce repository, configurez un build automatisé Maven. + - indice : Github Actions > Java with Maven > Configure > Start commit + - vérifiez d'abord la configuration proposée +- vérifiez que le workflow correspondant a été committé, et qu'un job de build a été lancé +- suivre les bonnes pratiques : à chaque commit, si son build casse, ne pas le laisser dans cet état ! + +### Plateforme d'évaluation de la qualité + +- Connectez-vous à https://sonarcloud.io/ en vous identifiant à l'aide de votre compte Github +- Créez un projet Sonar Cloud pour votre repository forké : + - New Project > sélectionnez votre repoisitory forké + - Analyse new project > Create a project manually > Créer un token comme indiqué et copiez-le dans un fichier temporaire + - Paramétrez l'analyse avec les actions Github comme indiqué + - ajoutez dans le workflow Github la configuration de l'analyse Sonar Cloud du code +- Rédigez **ci-dessous** une courte analyse du premier rapport produit par Sonar (métriques, état général...) : + +Le premier rapport Sonar indique... + + +### Tests unitaires + +Dans tous les cas : +- créez la classe de test si nécessaire, et une ou plusieurs méthodes de test +- les tests doivent couvrir autant de cas que possible +- vous pouvez corriger le code de la méthode testée si nécessaire + +Questions : +- Tests unitaires simples : Testez unitairement la méthode `SalarieAideADomicile.aDroitADesCongesPayes()` (pensez aux cas aux limites). +- Tests paramétrés : Testez par une méthode de test paramétrée la méthode `SalarieAideADomicile.calculeJoursDeCongeDecomptesPourPlage()`. +- Tests avec mocks : Testez de manière mockée (sans dépendance à la base de données) la méthode `SalarieAideADomicileService.clotureMois()`. + +### Tests d'intégration + +- Tests de repository : Testez la méthode `SalarieAideADomicileRepository.findByNom()`. +- Tests d'intégration de service : Créez un test d'intégration d'un exemple d'usage typique de la méthode `SalarieAideADomicileService.clotureMois()`. + +### Tests d'acceptation + +Cucumber est installé dans le projet : maven exécute dans les tests également les Features cucumber définies dans +src/test/resources, en prenant comme définition de leurs Steps celles trouvées dans des méthodes annotées (suprise !) +@Given, @When, @Then. Tout cela grâce aux bonnes dépendances Maven dans le pom.xml, et la bonne extension Junit +configurée dans la classe RunCucumberTest, fournies par l'exécution de l'archetype Maven comme indiqué dans le +tutorial officiel à https://cucumber.io/docs/guides/10-minute-tutorial/ . + +Regarder l'exemple qui fonctionne dans la classe StepDefinitions et le fichier de Feature is_it_friday.feature, repris +du même tutorial. + +S'en inspirer pour écrire la Feature puis développer les Step nécessaires dans StepDefinitions pour écrirer un test +d'acceptation validant la fonctionnalité de clôture de mois d'un salarié aide à domicile. + +### Maintenabilité + +- conventions de codage : faites les respecter, améliorez la lisibilité du code +- journalisation : rajoutez du logging aux endroits les plus pertinents. Changez la configuration pour que les messages de log aillent en plus dans un nouveau fichier `error.log` +- documentation : améliorez la documentation du code où c'est nécessaire. Générez localement la JavaDoc en utilisant Maven. +- Rajoutez en entrée de ce README les badges Sonar des métriques importantes de votre projet, en utilisant l'API web de Sonar : https://sonarcloud.io/web_api/api/project_badges + + +## TP d'évaluation + +Une fois le TD fini, réalisez les travaux de l'évaluation dans une branche "evaluation" créée à partir de la branche "master" de votre repository forké. + +Dans tous les cas : +- assurez-vous que le build passe (compilation, tests) et qu'il n'y a aucune alerte Sonar bloquante, critique ou majeur (Code Smells, anomalies, bugs). Vous pouvez corriger le code originel si nécessaire. +- efforcez-vous d'avoir une couverture de code à 100% sur les méthodes testées plus bas. BONUS : même chose mais avec la couverture de code avec mutation. + +### Revue de code et pair programming : + +- Si cela vous est permis, vous êtes invités à réaliser travaux de l'évaluation en Pair Programming, en vous associant +avec un autre étudiant. Dans ce cas, partez du repository forké jugé le plus complet ou mieux noté par Sonar des deux, +passez-vous le clavier au moins entre 2 questions, et indiquez qui le tenait par l'utilisateur de votre commit. +- Sinon, une fois le TP d'évaluation fini, créez sur Github une Pull Request de votre branche "evaluation" vers la +branche "master" et demandez à un autre étudiant de faire la revue de votre code. Les cas échéant, faites les +corrections demandées. + +### TDD + +- Faites du TDD pour tester unitairement la méthode `Entreprise.estDansPlage()` : écrire d'abord les tests entièrement (pensez aux cas limites) et seulement ensuite écrivez le code de la méthode. Indiquez dans un commentaire une chose ou deux que vous auriez peut-être fait différemment sans faire de TDD. + +### Tests unitaires + +- Tester unitairement (de manière paramétrée) la méthode `Entreprise.estJourFerie()` OU BIEN `Entreprise.proportionPondereeDuMois()` et `Entreprise.getPremierJourAnneeDeConges()`. **Attention**, elles contiennent des erreurs, bon débogage ! Améliorez l'ensemble de la qualité de cette méthode, avec l'aide de Sonar. +- Testez sans dépendance à la base de données la méthode `SalarieAideADomicileService.calculeLimiteEntrepriseCongesPermis()` + +### Tests d'intégration + +- Tests de repository : Testez la méthode `SalarieAideADomicileRepository.partCongesPrisTotauxAnneeNMoins1()` +- Tests d'intégration de service : Créez un test d'intégration d'un exemple d'usage typique de la méthode `SalarieAideADomicileService.calculeLimiteEntrepriseCongesPermis()` +- TODO RM BONUS Ecrire un test d'acceptation Cucumber pour au moins la partie "ancienneté" la fonctionnalité de calcul + de limite de congés permis par l'entreprise. + +### Maintenabilité + +- conventions de codage : pareil, faites les respecter, améliorez la lisibilité du code +- journalisation : Changez la configuration pour réaliser la rotation des fichiers de logs tous les jours et que chaque +fichier ne dépasse pas 1 MO. +- BONUS : Créez une petite documentation statique en utilisant MkDocs. +- Rédigez **ci-dessous** une courte analyse du rapport produit par Sonar (métriques, évolution, état général...) : + +Le rapport Sonar final indique... diff --git a/bin/pom.xml b/bin/pom.xml new file mode 100644 index 00000000..d8b48dc2 --- /dev/null +++ b/bin/pom.xml @@ -0,0 +1,217 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.5 + + + com.ipi + jva350 + 0.0.1-SNAPSHOT + jva350 + TP qualité logicielle IPI + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-junit-jupiter + test + + + com.thoughtworks.gauge + gauge-java + 0.9.1 + test + + + + + org.junit.platform + junit-platform-suite + test + + + io.cucumber + cucumber-junit-platform-engine + 7.5.0 + test + + + io.cucumber + cucumber-java + 7.5.0 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.jacoco + jacoco-maven-plugin + 0.8.8 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M3 + + + enforce-maven + + enforce + + + + + 3.5.4 + + + + + + + + org.pitest + pitest-maven + 1.9.9 + + + org.pitest + pitest-junit5-plugin + 0.16 + + + + + com.ipiecoles.java.java350.* + + + com.ipiecoles.java.java350.* + + + + + com.thoughtworks.gauge.maven + gauge-maven-plugin + 1.4.3 + + + test + + src/test/resources/specs + + + execute + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + 8 + 8 + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.3.1 + + 1.8 + 1.8 + + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.10.0 + + + org.pitest + pitest-maven + 1.9.9 + + + + report + + + + + + + + diff --git a/bin/src/main/java/com/ipi/jva350/Jva350Application.class b/bin/src/main/java/com/ipi/jva350/Jva350Application.class new file mode 100644 index 00000000..4b1d82ba Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/Jva350Application.class differ diff --git a/bin/src/main/java/com/ipi/jva350/exception/SalarieException.class b/bin/src/main/java/com/ipi/jva350/exception/SalarieException.class new file mode 100644 index 00000000..03aff4f4 Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/exception/SalarieException.class differ diff --git a/bin/src/main/java/com/ipi/jva350/model/Entreprise.class b/bin/src/main/java/com/ipi/jva350/model/Entreprise.class new file mode 100644 index 00000000..a8df33a1 Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/model/Entreprise.class differ diff --git a/bin/src/main/java/com/ipi/jva350/model/LinkedHashSetStringConverter.class b/bin/src/main/java/com/ipi/jva350/model/LinkedHashSetStringConverter.class new file mode 100644 index 00000000..0ea63175 Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/model/LinkedHashSetStringConverter.class differ diff --git a/bin/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.class b/bin/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.class new file mode 100644 index 00000000..8b49bfe5 Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.class differ diff --git a/bin/src/main/java/com/ipi/jva350/repository/SalarieAideADomicileRepository.class b/bin/src/main/java/com/ipi/jva350/repository/SalarieAideADomicileRepository.class new file mode 100644 index 00000000..74349466 Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/repository/SalarieAideADomicileRepository.class differ diff --git a/bin/src/main/java/com/ipi/jva350/service/SalarieAideADomicileService.class b/bin/src/main/java/com/ipi/jva350/service/SalarieAideADomicileService.class new file mode 100644 index 00000000..38ddeaed Binary files /dev/null and b/bin/src/main/java/com/ipi/jva350/service/SalarieAideADomicileService.class differ diff --git a/bin/src/test/java/com/ipi/jva350/IsItFriday.class b/bin/src/test/java/com/ipi/jva350/IsItFriday.class new file mode 100644 index 00000000..25f94d30 Binary files /dev/null and b/bin/src/test/java/com/ipi/jva350/IsItFriday.class differ diff --git a/bin/src/test/java/com/ipi/jva350/RunCucumberTest.class b/bin/src/test/java/com/ipi/jva350/RunCucumberTest.class new file mode 100644 index 00000000..1f2d686c Binary files /dev/null and b/bin/src/test/java/com/ipi/jva350/RunCucumberTest.class differ diff --git a/bin/src/test/java/com/ipi/jva350/StepDefinitions.class b/bin/src/test/java/com/ipi/jva350/StepDefinitions.class new file mode 100644 index 00000000..ded345d2 Binary files /dev/null and b/bin/src/test/java/com/ipi/jva350/StepDefinitions.class differ diff --git a/bin/src/test/resources/com/ipi/jva350/is_it_friday.feature b/bin/src/test/resources/com/ipi/jva350/is_it_friday.feature new file mode 100644 index 00000000..3786d9f5 --- /dev/null +++ b/bin/src/test/resources/com/ipi/jva350/is_it_friday.feature @@ -0,0 +1,7 @@ +Feature: Is it Friday yet? + Everybody wants to know when it's Friday + + Scenario: Sunday isn't Friday + Given today is Sunday + When I ask whether it's Friday yet + Then I should be told "Nope" \ No newline at end of file diff --git a/example.txt b/example.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.java b/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.java index 90fdf2c1..a4444906 100644 --- a/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.java +++ b/src/main/java/com/ipi/jva350/model/SalarieAideADomicile.java @@ -20,13 +20,14 @@ public class SalarieAideADomicile { private String nom; - public static List joursHabituellementTravailles = new ArrayList() {{ - add(DayOfWeek.MONDAY); - add(DayOfWeek.TUESDAY); - add(DayOfWeek.WEDNESDAY); - add(DayOfWeek.THURSDAY); - add(DayOfWeek.FRIDAY); - }}; + public static List joursHabituellementTravailles = new ArrayList(); + static { + joursHabituellementTravailles.add(DayOfWeek.MONDAY); + joursHabituellementTravailles.add(DayOfWeek.TUESDAY); + joursHabituellementTravailles.add(DayOfWeek.WEDNESDAY); + joursHabituellementTravailles.add(DayOfWeek.THURSDAY); + joursHabituellementTravailles.add(DayOfWeek.FRIDAY); + }; private LocalDate moisEnCours; private LocalDate moisDebutContrat; @@ -40,7 +41,7 @@ public class SalarieAideADomicile { private double joursTravaillesAnneeNMoins1= 0; private double congesPayesAcquisAnneeNMoins1= 0; private double congesPayesPrisAnneeNMoins1= 0; - + //commentaire public SalarieAideADomicile() { }