Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| eadl:bloc3:dev_av:td3 [2025/10/28 17:14] – [Livrables attendus] jcheron | eadl:bloc3:dev_av:td3 [2025/10/29 11:31] (Version actuelle) – [2.3 Concepts clés] jcheron | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== | + | ====== 3 - Tests et CI/CD ====== |
| ===== Objectifs pédagogiques ===== | ===== Objectifs pédagogiques ===== | ||
| Ligne 15: | Ligne 15: | ||
| * Qui a terminé les associations Order/ | * Qui a terminé les associations Order/ | ||
| * Qui a résolu des problèmes N+1 ? | * Qui a résolu des problèmes N+1 ? | ||
| - | | + | * Ceux qui ont fini peuvent commencer les tests, les autres finalisent le TD2 |
| </ | </ | ||
| Ligne 25: | Ligne 25: | ||
| **Objectif :** Séparer les configurations selon l' | **Objectif :** Séparer les configurations selon l' | ||
| </ | </ | ||
| + | |||
| + | === Profiles === | ||
| + | |||
| + | La création de profiles permet de gérer des configurations différentes, | ||
| + | |||
| + | Ajouter la section **profiles** suivante au fichier **pom.xml** | ||
| + | <sxh xml; | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| === Structure des fichiers === | === Structure des fichiers === | ||
| Ligne 42: | Ligne 80: | ||
| spring.application.name=ecommerce-api | spring.application.name=ecommerce-api | ||
| server.port=8080 | server.port=8080 | ||
| + | |||
| + | # Récupération du profile Maven pour def du profile Spring | ||
| + | spring.profiles.active=@activeProfile@ | ||
| # JPA commun | # JPA commun | ||
| Ligne 124: | Ligne 165: | ||
| # Via ligne de commande | # Via ligne de commande | ||
| mvn spring-boot: | mvn spring-boot: | ||
| + | |||
| + | # Avec profil maven | ||
| + | mvn spring-boot: | ||
| </ | </ | ||
| Ligne 310: | Ligne 354: | ||
| <sxh java; | <sxh java; | ||
| + | // @ExtendWith : crée les Mocks et les injecte avant chaque test | ||
| + | @ExtendWith(MockitoExtension.class) | ||
| + | |||
| // @Mock : Crée un faux objet (ne fait rien par défaut) | // @Mock : Crée un faux objet (ne fait rien par défaut) | ||
| @Mock | @Mock | ||
| Ligne 917: | Ligne 964: | ||
| - name: Run unit tests | - name: Run unit tests | ||
| - | run: mvn clean test | + | run: mvn clean test -P test |
| - name: Upload test results | - name: Upload test results | ||
| Ligne 944: | Ligne 991: | ||
| - name: Run integration tests | - name: Run integration tests | ||
| - | run: mvn clean verify -DskipUnitTests | + | run: mvn clean verify |
| - name: Upload test results | - name: Upload test results | ||
| Ligne 971: | Ligne 1018: | ||
| - name: Generate coverage report | - name: Generate coverage report | ||
| - | run: mvn clean verify jacoco: | + | run: mvn clean verify jacoco: |
| - name: Upload coverage to Codecov | - name: Upload coverage to Codecov | ||
| Ligne 1005: | Ligne 1052: | ||
| - name: Build with Maven | - name: Build with Maven | ||
| - | run: mvn clean package -DskipTests | + | run: mvn clean package |
| - name: Upload artifact | - name: Upload artifact | ||
| Ligne 1114: | Ligne 1161: | ||
| # Lancer l'app en mode test | # Lancer l'app en mode test | ||
| mvn spring-boot: | mvn spring-boot: | ||
| + | |||
| + | mvn spring-boot: | ||
| Ligne 1155: | Ligne 1204: | ||
| <WRAP round bloc todo> | <WRAP round bloc todo> | ||
| - | ==== Must have (A faire en priorité) ==== | + | ==== A faire en priorité ==== |
| **Configuration (30min) :** | **Configuration (30min) :** | ||
| Ligne 1184: | Ligne 1233: | ||
| * Pipeline qui passe au vert sur GitHub | * Pipeline qui passe au vert sur GitHub | ||
| - | ==== Nice to have (Si vous avez le temps) ==== | + | ==== En +, Si vous avez le temps ==== |
| * Protection de branche '' | * Protection de branche '' | ||
| Ligne 1196: | Ligne 1245: | ||
| ^ Aspect ^ Test Unitaire ^ Test d' | ^ Aspect ^ Test Unitaire ^ Test d' | ||
| - | | **Vitesse** | ⚡ Très rapide (<10ms) | 🐌 Plus lent (100-500ms) | | + | | **Vitesse** | Très rapide (<10ms) | Plus lent (100-500ms) | |
| | **Base de données** | ❌ Non (mocks) | ✅ Oui (H2 en mémoire) | | | **Base de données** | ❌ Non (mocks) | ✅ Oui (H2 en mémoire) | | ||
| | **Contexte Spring** | ❌ Non | ✅ Oui (toute l'app) | | | **Contexte Spring** | ❌ Non | ✅ Oui (toute l'app) | | ||
| Ligne 1209: | Ligne 1258: | ||
| <WRAP round bloc info> | <WRAP round bloc info> | ||
| ==== Tests unitaires ==== | ==== Tests unitaires ==== | ||
| - | * ✅ **Rapides** : < 10ms par test | + | * **Rapides** : < 10ms par test |
| - | * ✅ **Isolés** : pas de dépendances externes (DB, réseau) | + | * **Isolés** : pas de dépendances externes (DB, réseau) |
| - | * ✅ **AAA Pattern** : Arrange, Act, Assert | + | * **AAA Pattern** : Arrange, Act, Assert |
| - | * ✅ **1 test = 1 comportement** : ne pas tester plusieurs choses | + | * **1 test = 1 comportement** : ne pas tester plusieurs choses |
| - | * ✅ **Nommage explicite** : '' | + | * **Nommage explicite** : '' |
| - | * ✅ **Mocks minimalistes** : seulement les dépendances nécessaires | + | * **Mocks minimalistes** : seulement les dépendances nécessaires |
| ==== Tests d' | ==== Tests d' | ||
| - | * ✅ **Réalistes** : données de test cohérentes | + | * **Réalistes** : données de test cohérentes |
| - | * ✅ **Nettoyage** : '' | + | * **Nettoyage** : '' |
| - | * ✅ **Vérifications complètes** : code HTTP + contenu + headers | + | * **Vérifications complètes** : code HTTP + contenu + headers |
| - | * ✅ **Performance** : détecter les N+1 avec Hypersistence | + | * **Performance** : détecter les N+1 avec Hypersistence |
| - | * ✅ **Cas d' | + | * **Cas d' |
| ==== CI/CD ==== | ==== CI/CD ==== | ||
| - | * ✅ **Fail fast** : tests unitaires avant intégration | + | * **Fail fast** : tests unitaires avant intégration |
| - | * ✅ **Parallélisation** : jobs indépendants | + | * **Parallélisation** : jobs indépendants |
| - | * ✅ **Artifacts** : conserver les rapports et JARs | + | * **Artifacts** : conserver les rapports et JARs |
| - | * ✅ **Protection** : branche '' | + | * **Protection** : branche '' |
| - | * ✅ **Documentation** : badges visibles | + | * **Documentation** : badges visibles |
| </ | </ | ||