Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test #1

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions bin/.gitignore
Original file line number Diff line number Diff line change
@@ -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
121 changes: 121 additions & 0 deletions bin/README.md
Original file line number Diff line number Diff line change
@@ -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...
217 changes: 217 additions & 0 deletions bin/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ipi</groupId>
<artifactId>jva350</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jva350</name>
<description>TP qualité logicielle IPI</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.thoughtworks.gauge</groupId>
<artifactId>gauge-java</artifactId>
<version>0.9.1</version>
<scope>test</scope>
</dependency>

<!-- cucumber : -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>7.5.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.5.0</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>3.5.4</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.9.9</version>
<dependencies>
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>0.16</version>
</dependency>
</dependencies>
<configuration>
<targetClasses>
<param>com.ipiecoles.java.java350.*</param>
</targetClasses>
<targetTests>
<param>com.ipiecoles.java.java350.*</param>
</targetTests>
</configuration>
</plugin>
<plugin>
<groupId>com.thoughtworks.gauge.maven</groupId>
<artifactId>gauge-maven-plugin</artifactId>
<version>1.4.3</version>
<executions>
<execution>
<phase>test</phase>
<configuration>
<specsDir>src/test/resources/specs</specsDir>
</configuration>
<goals>
<goal>execute</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.9.0</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>

<!-- TODO rm -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.10.0</version>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.9.9</version>
<reportSets>
<reportSet>
<reports>
<report>report</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>

</project>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added bin/src/test/java/com/ipi/jva350/IsItFriday.class
Binary file not shown.
Binary file not shown.
Binary file not shown.
7 changes: 7 additions & 0 deletions bin/src/test/resources/com/ipi/jva350/is_it_friday.feature
Original file line number Diff line number Diff line change
@@ -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"
Empty file added example.txt
Empty file.
Loading