Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| eadl:bloc3:dev_av:td3 [2025/10/28 17:06] – créée 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 12: | Ligne 12: | ||
| <WRAP round bloc important> | <WRAP round bloc important> | ||
| - | **Point avancement TD2 | + | **Point avancement TD2** |
| * 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 1152: | Ligne 1201: | ||
| </ | </ | ||
| - | ===== Livrables attendus | + | ===== Livrables attendus ===== |
| <WRAP round bloc todo> | <WRAP round bloc todo> | ||
| - | ==== Must have (priorité | + | ==== A faire en priorité ==== |
| **Configuration (30min) :** | **Configuration (30min) :** | ||
| - | * ✅ 4 profils configurés : commun, dev, test, prod | + | * 4 profils configurés : commun, dev, test, prod |
| - | * ✅ Application démarre avec chaque profil | + | * Application démarre avec chaque profil |
| - | * ✅ Variables d' | + | * Variables d' |
| **Tests unitaires (1h15) :** | **Tests unitaires (1h15) :** | ||
| - | * ✅ '' | + | * '' |
| - | * ✅ '' | + | * '' |
| - | * ✅ Utilisation correcte des mocks | + | * Utilisation correcte des mocks |
| - | * ✅ Tests paramétrés pour au moins 1 cas | + | * Tests paramétrés pour au moins 1 cas |
| - | * ✅ Tous les tests passent ('' | + | * Tous les tests passent ('' |
| **Tests d' | **Tests d' | ||
| - | * ✅ '' | + | * '' |
| - | * ✅ '' | + | * '' |
| - | * ✅ '' | + | * '' |
| - | * ✅ Vérification des codes HTTP (200, 201, 400, 404, 409) | + | * Vérification des codes HTTP (200, 201, 400, 404, 409) |
| - | * ✅ Au moins 1 test de détection N+1 | + | * Au moins 1 test de détection N+1 |
| - | * ✅ Tous les tests passent ('' | + | * Tous les tests passent ('' |
| **Couverture + CI/CD (1h) :** | **Couverture + CI/CD (1h) :** | ||
| - | * ✅ JaCoCo configuré avec seuil minimum 70% | + | * JaCoCo configuré avec seuil minimum 70% |
| - | * ✅ Workflow GitHub Actions complet (4 jobs) | + | * Workflow GitHub Actions complet (4 jobs) |
| - | * ✅ Séparation unit tests / integration tests | + | * Séparation unit tests / integration tests |
| - | * ✅ Badges CI/CD dans le README | + | * Badges CI/CD dans le README |
| - | * ✅ Pipeline qui passe au vert sur GitHub | + | * Pipeline qui passe au vert sur GitHub |
| - | ==== Nice to have (bonus si 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 |
| </ | </ | ||