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

Templating

parent 285fe0b9
No related branches found
No related tags found
No related merge requests found
...@@ -19,35 +19,46 @@ Dans le [TP2](../tp2/) nous avons testé la dernière option, dans ce TP nous al ...@@ -19,35 +19,46 @@ Dans le [TP2](../tp2/) nous avons testé la dernière option, dans ce TP nous al
## Ajout de la dépendance ## Ajout de la dépendance
Dans le fichier `pom.xml` ajouter la dépendance vers cucumber. Dans le fichier `pom.xml` ajouter le gestionaire de dépendances vers cucumber.
```xml ```xml
<!-- Cucumber -->
<dependencyManagement>
...
<dependency> <dependency>
<groupId>io.cucumber</groupId> <groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId> <artifactId>cucumber-bom</artifactId>
<version>7.11.1</version> <version>7.11.1</version>
<scope>test</scope> <type>pom</type>
<scope>import</scope>
</dependency> </dependency>
<!-- JUnit 5 integration --> ...
</dependencyManagement>
```
ainsi que les dépendances :
```xml
<dependencies>
...
<dependency> <dependency>
<groupId>io.cucumber</groupId> <groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId> <artifactId>cucumber-java</artifactId>
<version>7.11.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- JUnit 5 runner -->
<dependency> <dependency>
<groupId>org.junit.platform</groupId> <groupId>io.cucumber</groupId>
<artifactId>junit-platform-suite</artifactId> <artifactId>cucumber-junit-platform-engine</artifactId>
<version>1.9.2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
...
</dependencies>
``` ```
## Des exemples ou scenario ## Des exemples ou scenario
Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/BUT.en.feature` avec ce contenu : Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/CasSimples.en.feature` avec ce contenu :
```gherkin ```gherkin
# language: en # language: en
...@@ -61,7 +72,7 @@ Feature: Ma première fonctionalité : ...@@ -61,7 +72,7 @@ Feature: Ma première fonctionalité :
Given un élève Given un élève
And son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1 And son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1
When il passe en jury de Semestre 1 When il passe en jury de Semestre 1
Then son UE 1 est validée Then son UE 1 du Semestre 1 est validée
``` ```
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é.
...@@ -69,45 +80,101 @@ On retrouve donc, un titre : `Ma première fonctionalité` et la description de ...@@ -69,45 +80,101 @@ On retrouve donc, un titre : `Ma première fonctionalité` et la description de
> En tant que **Qui** je fais **Quoi** afin de **Pourquoi**. > En tant que **Qui** je fais **Quoi** afin de **Pourquoi**.
Une Feature est illustré par plusieurs exemples, les "Scenario". Le "Scenario" est lui-même découpé en 3 étapes : " Une Feature est illustré par plusieurs exemples, les "Scenario".
Given", "When" et "Then". Le "Scenario" est lui-même découpé en 3 étapes : "Given", "When" et "Then".
## Une suite de test pour tout lancer
Ajouter un fichier `src/test/java/fr/univlille/iut/info/r402/RunCucumberTest.java` pour lancer la suite de tests :
```java
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("fr/univlille/iut/info/r402")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "fr.univlille.iut.info.r402")
public class RunCucumberTest {
}
```
## Lien avec votre code ## Lien avec votre code
Ajouter un fichier `src/test/java/fr/univlille/iut/info/r402/fr.univlille.iut.info.r402.JuryStepdefs.java` pour définir Ajouter un fichier `src/test/java/fr/univlille/iut/info/r402/JuryStepdefs.java` pour définir
les étapes : les étapes Gherkin :
```java ```java
public class JuryStepdefs { public class JuryStepdefs {
@Given("^un élève") @Given("^un élève")
public void unÉlève() { public void unEleve() {
} }
@And("son dossier présente une moyenne de {int} dans l'UE {int} au Semestre {int}") @And("son dossier présente une moyenne de {int} dans l'UE {int} au Semestre {int}")
public void sonDossierPrésenteUneMoyenneDeDansLUEAuSemestre(int evaluation, int UEId, int SemestreId) { public void sonDossierPresenteUneMoyenneDeDansLUEAuSemestre(int evaluation, int UEId, int semestreId) {
} }
@When("^il passe en jury de Semestre (\\d+)$") @When("^il passe en jury de Semestre (\\d+)$")
public void ilPasseEnJuryDeS(int SemestreId) { public void ilPasseEnJuryDeSemestre(int SemestreId) {
} }
@Then("^son UE (\\d+) est validée$") @Then("son UE {int} du Semestre {int} est validée")
public void sonUEEstValidée(int UEId) { public void sonUEDuSemestreEstValidee(int UEid, int semestreID) {
} }
} }
``` ```
C'est ce que nous appelons du code de glue, c'est-à-dire du code qui permet de faire le lien entre le Gherkin et vos C'est ce que nous appelons du code de glue, c'est-à-dire du code qui permet de faire le lien entre le Gherkin et vos
classes métier. classes métier.
Notez que le Gherkin ne nous permet pas de définir la façon d'interagir avec notre code. Le Gherkin ne nous permet pas de définir la façon d'interagir avec notre code, c'est le code de glue qui s'en occupe.
Lancez les tests, ils doivent être verts.
Écrivez le code de glue, ajoutez les appels aux classes présentes dans `src/main/java` dans la classe `JuryStepdefs` Lancez les tests, ils sont verts, en effet, il n'y a aucun assert dans notre code.
Notez que les `assert` vont dans les méthodes annotés `@Then` Notez que les `assert` vont dans les méthodes annotés `@Then`
Faire passer ce premier scénario au vert. ## Codons la glue
Dans la méthode `sonUEDuSemestreEstValidee` nous nous attendons à avoir quelques chose qui raconte que :
* pour l'élève défini en première étape,
* en allant rechercher son semestre 1
* puis l'UE 1
* on peut voir que l'UE 1 est Validée
Ce qui pourrait s'écrire en java comme ceci :
```java
assertEquals(Validee, eleve.getUEForSemestre(UEid, semestreID).getAcquisition());
```
Sauf que l'élève n'existe pas, on peut donc l'ajouter dans l'étape `unEleve()` :
```java
eleve = new Etudiant();
```
De la même façon, l'étape `sonDossierPresenteUneMoyenneDeDansLUEAuSemestre()` va créer une UE avec la bonne moyenne,
l'ajouter au semestre qui va lui-même être rattaché à l'élève.
L'étape `ilPasseEnJuryDeSemestre()` va appeler la méthode `deliberation` du jury puis mettre à jour les UEs concernées.
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
Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/BUT.fr.feature` avec ce contenu : Ajoutez un fichier `src/test/resources/fr/univlille/iut/info/r402/BUT.fr.feature` avec ce contenu :
...@@ -123,14 +190,19 @@ Fonctionnalité: Ma première fonctionalité : ...@@ -123,14 +190,19 @@ Fonctionnalité: Ma première fonctionalité :
Étant donné un élève Étant donné un élève
Et que son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1 Et que son dossier présente une moyenne de 12 dans l'UE 1 au Semestre 1
Quand il passe en jury de Semestre 1 Quand il passe en jury de Semestre 1
Alors son UE 1 est validée Alors son UE 1 du Semestre 1 est validée
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
``` ```
# BUT # BUT
Écrire et implémenter toutes les règles de validation du BUT en TDD avec les tests rédigés en Gherkin. Écrire et implémenter toutes les règles de validation du BUT en TDD avec les tests rédigés en Gherkin.
Le journal officiel présente les conditions de validation du BUT de la façon suivante : Le journal officiel présente les conditions de validation du BUT de la façon suivante :
4.3 Conditions de validation 4.3 Conditions de validation
...@@ -186,7 +258,7 @@ d’enseignement, l’attribution du diplôme universitaire de technologie au te ...@@ -186,7 +258,7 @@ d’enseignement, l’attribution du diplôme universitaire de technologie au te
de l’acquisition des 120 premiers crédits européens du cursus et l’attribution de l’acquisition des 120 premiers crédits européens du cursus et l’attribution
de la licence professionnelle « bachelor universitaire de technologie ». de la licence professionnelle « bachelor universitaire de technologie ».
Les textes de références étants : Les textes de références sont :
* https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm * https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm
* https://cache.media.education.gouv.fr/file/SP4-MESRI-26-5-2022/10/0/spe617_annexe1_1426100.pdf * https://cache.media.education.gouv.fr/file/SP4-MESRI-26-5-2022/10/0/spe617_annexe1_1426100.pdf
......
package fr.univlille.iut.info.r402; package fr.univlille.iut.info.r402;
public class Etudiant { 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; package fr.univlille.iut.info.r402;
public class Jury { public class Jury {
public Jury(Etudiant etudiant) {
}
public UEAcquisition deliberation(Semestre semestre) { public Semestre deliberation(Semestre semestre) {
return UEAcquisition.NonValidee; return null;
} }
} }
package fr.univlille.iut.info.r402; package fr.univlille.iut.info.r402;
public class Semestre { public class Semestre {
public Semestre(int id, UniteEnseignement... toutesLesUe) {
}
public Semestre(UniteDEnseignement... ue) { public UniteEnseignement getUE(int uEid) {
return null;
} }
} }
package fr.univlille.iut.info.r402;
public class UniteEnseignement {
private final double note;
private int id = 0;
private UEAcquisition acquisition;
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; package fr.univlille.iut.info.r402;
public class UniteDEnseignement { public class JuryStepdefs {
private int id = 0;
private double note;
} }
# language: en
# https://cucumber.io/docs/gherkin/reference/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment