Skip to content
Snippets Groups Projects
Unverified Commit e38ae9f5 authored by Thomas Clavier's avatar Thomas Clavier
Browse files

Ça doit être bon

parent 7a2b7dae
No related branches found
No related tags found
No related merge requests found
Showing with 52 additions and 204 deletions
# TP 3 - Qualité de développement # TP - Qualité de développement
## Documentation à partir des tests ## Documentation à partir des tests
...@@ -17,9 +17,7 @@ Il existe différentes façons d'utiliser les tests pour documenter un projet.· ...@@ -17,9 +17,7 @@ Il existe différentes façons d'utiliser les tests pour documenter un projet.·
* Utiliser du **Gherkin pour décrire les scénarios** de tests * Utiliser du **Gherkin pour décrire les scénarios** de tests
* **Générer des fichiers structurés** de documentation depuis les tests * **Générer des fichiers structurés** de documentation depuis les tests
### Retour sur le TP 2 Dans ce TP nous allons utiliser du **Gherkin** pour produire la documentation executable.
Dans le [TP2](../tp2/) nous avons testé la dernière option, dans ce TP nous allons utiliser du **Gherkin**.
## Gherkin ## Gherkin
...@@ -70,15 +68,16 @@ Créez un fichier `src/test/resources/fr/univlille/iut/info/r402/CasSimple.en.fe ...@@ -70,15 +68,16 @@ Créez un fichier `src/test/resources/fr/univlille/iut/info/r402/CasSimple.en.fe
# language: en # language: en
# https://cucumber.io/docs/gherkin/reference/ # https://cucumber.io/docs/gherkin/reference/
Feature: Ma première fonctionalité : Feature: Ma première fonctionalité :
En tant qu'étudiant, En tant que joueur
il "suffit" d'avoir la moyenne dans toutes les UE de la formation je peux préparer une pizza
afin d'avoir son diplome. afin de la vendre
Scenario: Un élève moyen Scenario: Un pizza reine
Given un élève Given un four
And son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1 And un pizzaiolo
When il passe en jury de Semestre 1 And le pizzaiolo prépare une pizza reine
Then son UE 1 du Semestre 1 est validée When le pizzaiolo met la pizza reine au four
Then au bout de 30 ticks d'horloge, la pizza est cuite
``` ```
En Gherkin, une "**Feature**" (Fonctionalité en français) correspond à une histoire utilisateur dans le monde de l'agilité. En Gherkin, une "**Feature**" (Fonctionalité en français) correspond à une histoire utilisateur dans le monde de l'agilité.
...@@ -112,24 +111,27 @@ public class RunCucumberTest { ...@@ -112,24 +111,27 @@ public class RunCucumberTest {
#### Créer un fichier java #### Créer un fichier java
Créez un fichier `src/test/java/fr/univlille/iut/info/r402/fr.univlille.iut.info.r402.JuryStepdefs.java` et définissez-y les étapes suivantes : Créez un fichier `src/test/java/fr/univlille/iut/info/r402/fr.univlille.iut.info.r402.PizzaStepdefs.java` et définissez-y les étapes suivantes :
```java ```java
public class JuryStepdefs { public class PizzaStepdefs {
@Given("^un élève") @Given("^un four")
public void unEleve() { public void unFour() {
} }
@And("son dossier présente une moyenne de {double} dans l'UE {int} au Semestre {int}") @And("^un pizzaiolo")
public void sonDossierPresenteUneMoyenneDeDansLUEAuSemestre(double evaluation, int UEId, int semestreId) { public void unPizzaiolo() {
} }
@When("^il passe en jury de Semestre (\\d+)$") @And("^le pizzaiolo prépare une pizza reine")
public void ilPasseEnJuryDeSemestre(int SemestreId) { public void preparerReine() {
}
@When("^le pizzaiolo met la pizza reine au four$")
public void pizzaAuFour() {
} }
@Then("son UE {int} du Semestre {int} est validée") @Then("au bout de {int} ticks d'horloge, la pizza est cuite")
public void sonUEDuSemestreEstValidee(int UEid, int semestreID) { public void pizzaCuite(int ticks) {
} }
} }
``` ```
...@@ -143,9 +145,7 @@ En effet, il n'y a aucun assert dans notre code. ...@@ -143,9 +145,7 @@ En effet, il n'y a aucun assert dans notre code.
## Codons la glue ## Codons la glue
Dans la méthode `sonUEDuSemestreEstValidee` nous nous attendons à avoir quelques chose qui raconte que : Dans la méthode `pizzaCuite` nous nous attendons à avoir quelques chose qui raconte que si l'on interroge
* pour l'élève défini en première étape,
* en allant rechercher son semestre 1 * en allant rechercher son semestre 1
* puis l'UE 1 * puis l'UE 1
* on peut voir que l'UE 1 est Validée * on peut voir que l'UE 1 est Validée
...@@ -169,21 +169,6 @@ L'étape `ilPasseEnJuryDeSemestre()` va appeler la méthode `deliberation` du ju ...@@ -169,21 +169,6 @@ L'étape `ilPasseEnJuryDeSemestre()` va appeler la méthode `deliberation` du ju
Finir le code de glue et l'implémentation minimum pour faire passer ce premier test au vert. Finir le code de glue et l'implémentation minimum pour faire passer ce premier test au vert.
## Nouveau test
Ajouter le scénario suivant dans le fichier `.feature`
```gherkin
Scenario: Un mauvais élève
Given un élève
And son dossier présente une moyenne de 8 dans l'UE 1 au Semestre 1
When il passe en jury de Semestre 1
Then son UE 1 du Semestre 1 n'est pas validée
```
* Ajouter la définition d'étape cucumber correspondante
* Le faire passer au vert.
## Gherkin en français ## Gherkin en français
#### Gherkin #### Gherkin
...@@ -194,92 +179,36 @@ Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/CasSimple.fr.f ...@@ -194,92 +179,36 @@ Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/CasSimple.fr.f
# language: fr # language: fr
# https://cucumber.io/docs/gherkin/reference/ # https://cucumber.io/docs/gherkin/reference/
Fonctionnalité: Ma première fonctionalité : Fonctionnalité: Ma première fonctionalité :
En tant qu'étudiant, En tant que joueur
il "suffit" d'avoir la moyenne dans toutes les UE de la formation je peux préparer une pizza
afin d'avoir son diplome. afin de la vendre
Scénario: Un élève moyen Scénario: Un pizza reine
Étant donné un élève Étant donné un four
Et que son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1 Et un pizzaiolo
Quand il passe en jury de Semestre 1 Et le pizzaiolo prépare une pizza reine
Alors son UE 1 du Semestre 1 est validée Quand le pizzaiolo met la pizza reine au four
Alors au bout de 30 ticks d'horloge, la pizza est cuite
Scénario: Un mauvais élève
Étant donné un élève
Et que son dossier présente une moyenne de 8 dans l'UE 1 au Semestre 1
Quand il passe en jury de Semestre 1
Alors son UE 1 du Semestre 1 n'est pas validée
``` ```
# Implémentation des règles pour valider son année de BUT # Le jeu de pizza
Écrire et implémenter toutes les règles de validation du BUT en TDD avec les tests rédigés en Gherkin.
## Règlementation
Le journal officiel présente les conditions de validation du BUT de la façon suivante :
### 4.3 Conditions de validation
```txt
Le bachelor universitaire de technologie s'obtient soit par acquisition de chaque unité d'enseignement constitutive, soit par application des modalités decompensation.
Le bachelor universitaire de technologie obtenu par l'une ou l'autre voie confère la totalité des 180 crédits européens.
Une unité d'enseignement est définitivement acquise et capitalisable dès lors que la moyenne obtenue à l’ensemble « pôle ressources » et « SAÉ » est égale ou supérieure à 10.
L'acquisition de l'unité d'enseignement emporte l'acquisition des crédits européens correspondants.
À l'intérieur de chaque unité d'enseignement, le poids relatif des éléments constitutifs, soit des pôles «ressources » et « SAÉ », varie dans un rapport de 40 à 60%. En troisième année ce rapport peut toutefois être apprécié sur l’ensemble des deux unités d’enseignement d’une même compétence. Ajouter de nouvelles fonctionnalités en ATDD ou BDD. Vous pouvez vérifier le taux de couverture technique en utilisant la commande `mvn install site surefire-report:report` avant d'ouvrir la page `x-www-browser target/site/jacoco/index.html`.
La validation des deux UE du niveau d’une compétence emporte la validation de l’ensemble des UE du niveau inférieur de cette même compétence. Toutes les interactions se ferons au clavier à travers une interface texte avec un prompte comme un shell dans lequel on entrera les commandes d'actions : `cuire pizza reine`, `préparer pizza reine`, `voir four`, etc.
```
### 4.4 Compensation
```txt
La compensation s’effectue au sein de chaque unité d’enseignement ainsi qu’au sein de chaque regroupement cohérent d’UE.
Seules les UE se référant à un même niveau d’une même compétence finale peuvent ensemble constituer un regroupement cohérent.
Des UE se référant à des niveaux de compétence finales différents ou
à des compétences finales différentes ne peuvent pas appartenir à un même
regroupement cohérent. Aucune UE ne peut appartenir à plus d’un regroupement cohérent.
Au sein de chaque regroupement cohérent d’UE, la compensation est intégrale. Si une UE n’a pas été acquise en raison d’une moyenne inférieure à 10, cette UE sera acquise par compensation si et seulement si l’étudiant a obtenu la moyenne au regroupement cohérent auquel l’UE appartient.
```
### 4.5 Règles de progression
```txt
La poursuite d'études dans un semestre pair d’une même année est de droit pour tout étudiant.
La poursuite d’études dans un semestre impair est possible si et
seulement si l’étudiant a obtenu : la moyenne à plus de la moitié des
regroupements cohérents d’UE ; et une moyenne égale ou supérieure à 8 sur 20 àchaque regroupement cohérent d’UE.
La poursuite d'études dans le semestre 5
nécessite de plus la validation de toutes les UE des semestres 1 et 2 dans les conditions de validation des points 4.3 et 4.4, ou par décision de jury.
Durant la totalité du cursus conduisant au bachelor universitaire de
technologie, l'étudiant peut être autorisé à redoubler une seule fois chaque
semestre dans la limite de 4 redoublements.
Le directeur de l'IUT peut autoriser un redoublement supplémentaire en cas de force majeure dûment
justifiée et appréciée par ses soins.
Tout refus d'autorisation de redoubler est pris après avoir entendu l'étudiant à sa demande.
Il doit être motivé et assorti de conseils d'orientation.
```
### 4.6 Jury
```txt
Le jury présidé par le directeur de l’IUT délibère souverainement à partir del'ensemble des résultats obtenus par l'étudiant.
Il se réunit chaque semestre pour se prononcer sur la progression des étudiants, la validation des unités d’enseignement, l’attribution du diplôme universitaire de technologie au terme de l’acquisition des 120 premiers crédits européens du cursus et l’attribution de la licence professionnelle « bachelor universitaire de technologie ».
```
### Références Fonctionnalités à ajouter :
Les textes de références étants : * Une pizza est cuite au bout de 30s, ajouter une commande pour voir combien il y a de pizza dans le four
* La capacité du four est limité, il n'est pas possible de mettre plus de 3 pizzas dedans
* Il faut faire une action pour vendre une pizza cuite, ajouter l'action `vendre`
* Ajouter le montant de la caisse
* Une pizza cuite depuis plus de 60s est invendable, ajouter une action mettre à la poubelle
* maintenant que vous avez des sous, il va falloir acheter les ingrédients, ajouter l'achat des ingrédients de base pour faire vos différentes pizzas, il n'est alors possible de faire une pizza que si les ingrédients sont en stock.
* Ajouter l'achat d'un four plus grand
* Ajouter des prix différents en fonction des pizzas, avec des prix différents pour les ingrédients.
* Ajouter le fait que les ingrédients ne peuvent pas se garder indéfiniment.
* etc.
* https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm # Lancer des traitements en tache de fond
* https://cache.media.education.gouv.fr/file/SP4-MESRI-26-5-2022/10/0/spe617_annexe1_1426100.pdf
Avec la classe `Timer` et la méthode `scheduleAtFixedRate` il est possible de lancer un traitement à interval régulier. Il existe aussi une classe `CountDownLatch` pour gérer les comptes à rebourg
package fr.univlille.iut.info.r402;
public class Etudiant {
public void ajouteSemestre(Semestre semestre) {
}
public UniteEnseignement getUEForSemestre(int uEid, int semestreID) {
return null;
}
public Semestre getSemestre(int semestreId) {
return null;
}
}
package fr.univlille.iut.info.r402;
public class Jury {
public Semestre deliberation(Semestre semestre) {
return null;
}
}
package fr.univlille.iut.info.r402;
public class Semestre {
public Semestre(int id, UniteEnseignement... toutesLesUe) {
}
public UniteEnseignement getUE(int uEid) {
return null;
}
}
package fr.univlille.iut.info.r402;
public enum UEAcquisition {
Validee, NonValidee;
}
package fr.univlille.iut.info.r402;
public class UniteEnseignement {
private final double note;
private int id = 0;
private UEAcquisition acquisition = UEAcquisition.NonValidee;
public UniteEnseignement(int id, double note) {
this.id = id;
this.note = note;
}
public UEAcquisition getAcquisition() {
return this.acquisition;
}
public void setAcquisition(UEAcquisition acquisition) {
this.acquisition = acquisition;
}
public double getNote() {
return note;
}
}
package fr.univlille.iut.info.r402;
public class JuryStepdefs {
}
# language: en
# https://cucumber.io/docs/gherkin/reference/
Feature:
Scenario: Un élève moyen
Given un élève
And son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1
When il passe en jury de Semestre 1
Then son UE 1 du Semestre 1 est validée
Scenario: Un mauvais élève
Given un élève
And son dossier présente une moyenne de 8 dans l'UE 1 au Semestre 1
When il passe en jury de Semestre 1
Then son UE 1 du Semestre 1 n'est pas validée
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment