eadl:bloc3:dev_av:td3

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
eadl:bloc3:dev_av:td3 [2025/10/28 17:06] – créée jcheroneadl:bloc3:dev_av:td3 [2025/10/29 11:31] (Version actuelle) – [2.3 Concepts clés] jcheron
Ligne 1: Ligne 1:
-====== Séance 3 - Tests et CI/CD (4h) ======+====== 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/OrderItem/User ?   * Qui a terminé les associations Order/OrderItem/User ?
   * Qui a résolu des problèmes N+1 ?   * Qui a résolu des problèmes N+1 ?
-  * **Décision :** Ceux qui ont fini peuvent commencer les tests, les autres finalisent le TD2+  * Ceux qui ont fini peuvent commencer les tests, les autres finalisent le TD2
 </WRAP> </WRAP>
  
Ligne 25: Ligne 25:
 **Objectif :** Séparer les configurations selon l'environnement (dev, test, prod) **Objectif :** Séparer les configurations selon l'environnement (dev, test, prod)
 </WRAP> </WRAP>
 +
 +=== Profiles ===
 +
 +La création de profiles permet de gérer des configurations différentes, et des fichiers de configuration spécifiques à chaque profile.
 +
 +Ajouter la section **profiles** suivante au fichier **pom.xml**
 +<sxh xml;title:pom.xml>
 +    <profiles>
 +        <profile>
 +            <id>dev</id>
 +            <activation>
 +                <activeByDefault>true</activeByDefault>
 +            </activation>
 +            <properties>
 +                <activeProfile>dev</activeProfile>
 +            </properties>
 +        </profile>
 +        <profile>
 +            <id>prod</id>
 +            <properties>
 +                <activeProfile>prod</activeProfile>
 +            </properties>
 +            <dependencies>
 +                <dependency>
 +                    <groupId>org.postgresql</groupId>
 +                    <artifactId>postgresql</artifactId>
 +                    <scope>runtime</scope>
 +                </dependency>
 +            </dependencies>            
 +        </profile>
 +        <profile>
 +            <id>test</id>
 +            <properties>
 +                <activeProfile>test</activeProfile>
 +            </properties>
 +        </profile>
 +    </profiles>
 +</sxh>
  
 === 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:run -Dspring-boot.run.profiles=dev mvn spring-boot:run -Dspring-boot.run.profiles=dev
 +
 +# Avec profil maven
 +mvn spring-boot:run -P dev
 </sxh> </sxh>
  
Ligne 310: Ligne 354:
  
 <sxh java;gutter:false> <sxh java;gutter:false>
 +// @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 -P test -DskipUnitTests
  
       - 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:report+        run: mvn clean verify jacoco:report -P test
  
       - 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 -P prod -DskipTests
  
       - 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:run -Dspring-boot.run.profiles=test mvn spring-boot:run -Dspring-boot.run.profiles=test
 +
 +mvn spring-boot:run -P test
  
  
Ligne 1152: Ligne 1201:
 </sxh> </sxh>
  
-===== Livrables attendus (réaliste pour 4h) =====+===== Livrables attendus =====
  
 <WRAP round bloc todo> <WRAP round bloc todo>
-==== Must have (priorité absolue) ====+==== 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'environnement documentées+  * Variables d'environnement documentées
  
 **Tests unitaires (1h15) :** **Tests unitaires (1h15) :**
-  * ✅ ''ProductServiceTest'' complet (≥5 tests) +  * ''ProductServiceTest'' complet (≥5 tests) 
-  * ✅ ''UserServiceTest'' complet (≥5 tests) +  * ''UserServiceTest'' complet (≥5 tests) 
-  * ✅ 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 (''mvn test'')+  * Tous les tests passent (''mvn test'')
  
 **Tests d'intégration (1h15) :** **Tests d'intégration (1h15) :**
-  * ✅ ''ProductControllerIntegrationTest'' complet (≥6 tests) +  * ''ProductControllerIntegrationTest'' complet (≥6 tests) 
-  * ✅ ''UserControllerIntegrationTest'' complet (≥5 tests) +  * ''UserControllerIntegrationTest'' complet (≥5 tests) 
-  * ✅ ''OrderControllerIntegrationTest'' complet (≥4 tests) +  * ''OrderControllerIntegrationTest'' complet (≥4 tests) 
-  * ✅ 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 (''mvn verify'')+  * Tous les tests passent (''mvn verify'')
  
 **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 ''main'' configurée   * Protection de branche ''main'' configurée
Ligne 1196: Ligne 1245:
  
 ^ Aspect ^ Test Unitaire ^ Test d'Intégration ^ ^ Aspect ^ Test Unitaire ^ Test d'Intégration ^
-| **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** : ''methodName_WhenCondition_ShouldExpectedBehavior'' +  * **Nommage explicite** : ''methodName_WhenCondition_ShouldExpectedBehavior'' 
-  * ✅ **Mocks minimalistes** : seulement les dépendances nécessaires+  * **Mocks minimalistes** : seulement les dépendances nécessaires
  
 ==== Tests d'intégration ==== ==== Tests d'intégration ====
-  * ✅ **Réalistes** : données de test cohérentes +  * **Réalistes** : données de test cohérentes 
-  * ✅ **Nettoyage** : ''@Transactional'' ou ''@BeforeEach'' avec ''deleteAll()'' +  * **Nettoyage** : ''@Transactional'' ou ''@BeforeEach'' avec ''deleteAll()'' 
-  * ✅ **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'erreur** : tester les 400, 404, 409, 500+  * **Cas d'erreur** : tester les 400, 404, 409, 500
  
 ==== 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 ''main'' protégée +  * **Protection** : branche ''main'' protégée 
-  * ✅ **Documentation** : badges visibles+  * **Documentation** : badges visibles
 </WRAP> </WRAP>
  
  • eadl/bloc3/dev_av/td3.1761667564.txt.gz
  • Dernière modification : il y a 5 jours
  • de jcheron