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:tests:unit [2025/09/17 00:51] – créée jcheron | eadl:bloc3:dev_av:tests:unit [2025/09/17 15:38] (Version actuelle) – [Tests unitaires] jcheron | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Tests unitaires ====== | ====== Tests unitaires ====== | ||
| - | On utilise souvent la matrice **Given-When-Then** : | + | On utilise souvent la matrice **Given-When-Then** |
| + | |||
| + | <sxh java; | ||
| + | // Given (Arrange) - Préparer les données | ||
| + | // When (Act) - Exécuter l' | ||
| + | // Then (Assert) - Vérifier le résultat | ||
| + | </ | ||
| + | |||
| + | On isole le service à tester en utilisant des Mock objects (objets factices). | ||
| + | |||
| + | * '' | ||
| + | * Les repositories ne font rien de réel | ||
| + | * leurs réponses sont contrôlées avec **when(...).thenReturn(...)** | ||
| + | * '' | ||
| + | |||
| + | Vérification du WorkFlow métier : | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | **Exemple :** | ||
| + | |||
| + | Si la catégorie n' | ||
| + | |||
| + | ===== Bonnes pratiques ===== | ||
| + | * 1 test = 1 comportement | ||
| + | * Noms explicites (should create product when category exists) | ||
| + | * Tests indépendants (pas d' | ||
| + | * Données de test isolées | ||
| + | * Given-When-Then structure | ||
| + | === FIRST === | ||
| + | |||
| + | == Fast == | ||
| + | Feeback rapide après lancement de la suite | ||
| + | |||
| + | == Independant == | ||
| + | Ne pas faire dépendre un test du résultat d' | ||
| + | |||
| + | == Repeatable == | ||
| + | Un test doit toujours produire le même résultat, prédictible | ||
| + | |||
| + | == Self-validating == | ||
| + | Doit être autonome pour déterminer la validité de son résultat | ||
| + | |||
| + | == Timely == | ||
| + | Fait au bon moment (avant l' | ||
| + | |||
| + | |||
| + | ===== Ressources ===== | ||
| + | |||
| + | ==== Annotations Spring/ | ||
| + | |||
| + | <sxh java; | ||
| + | @ExtendWith(MockitoExtension:: | ||
| + | @SpringBootTest | ||
| + | @WebMvcTest(Controller:: | ||
| + | @DataJpaTest | ||
| + | @Mock // Faux objet | ||
| + | @MockBean | ||
| + | @InjectMocks | ||
| + | </ | ||
| + | |||
| + | ==== Mocking concepts ==== | ||
| + | |||
| + | * **when().thenReturn()** : Programmer les réponses | ||
| + | * **verify()** : Vérifier les appels | ||
| + | * **verifyNoInteractions()** : Aucune interaction | ||
| + | * **any()** : Matcher générique | ||
| + | |||
| + | ==== Assertions usuelles ==== | ||
| + | |||
| + | <sxh java; | ||
| + | assertThat(result).isNotNull() | ||
| + | assertThat(result.name).isEqualTo(" | ||
| + | assertThat(result.price).isEqualByComparingTo(BigDecimal(" | ||
| + | assertThatThrownBy { ... }.isInstanceOf(Exception:: | ||
| + | </ | ||
| ===== Exemple de test ===== | ===== Exemple de test ===== | ||