Exercice 2 / Étape 2 — Plan de tests
Liste des cas de test à écrire, organisée selon la pyramide des tests
(unitaire → intégration → E2E), du plus simple au plus complexe. Suivant
la consigne de cette étape, seuls les cas nominaux (comportement
attendu, pas les erreurs ni les effets de bord) sont listés ici — les
erreurs/validations seront couvertes lors de l'implémentation (étapes 3 à
5) dans la mesure où elles sont nécessaires pour atteindre le seuil de
couverture de 80 %, et documentées à part dans les étapes correspondantes.
Back-end — tests unitaires (Mockito), services
Service
Cas de test
Entrée
Sortie attendue
UserService (existant)
register() cas nominal
User valide
userRepository.save() appelé avec cet utilisateur, mot de passe encodé
UserService
login() cas nominal
login/password valides
JWT non nul retourné (jwtService.generateToken() appelé)
JwtService
generateToken() cas nominal
UserDetails
JWT non nul, avec subject = login, exp = iat + expiration-ms
JwtService
extractUsername() cas nominal
token généré par le service
login d'origine
JwtService
isTokenValid() cas nominal
token + UserDetails correspondant
true
StudentService
create() cas nominal
Student valide
studentRepository.save() appelé
StudentService
findAll() cas nominal
—
liste des étudiants du repository
StudentService
findById() cas nominal
id existant
Student correspondant
StudentService
update() cas nominal
id existant + nouvelles données
étudiant mis à jour et sauvegardé
StudentService
delete() cas nominal
id existant
studentRepository.delete() appelé
Back-end — tests d'intégration (Testcontainers), controllers
Controller
Cas de test
Requête
Réponse attendue
UserController (existant)
POST /api/register cas nominal
corps valide
201
UserController
POST /api/login cas nominal
login/password valides
200 + corps = JWT
StudentController
POST /api/students cas nominal (authentifié)
corps valide + Bearer token
201 + StudentDTO
StudentController
GET /api/students cas nominal (authentifié)
— + Bearer token
200 + liste
StudentController
GET /api/students/{id} cas nominal (authentifié)
id existant + Bearer token
200 + StudentDTO
StudentController
PUT /api/students/{id} cas nominal (authentifié)
id existant + corps valide + Bearer token
200 + StudentDTO mis à jour
StudentController
DELETE /api/students/{id} cas nominal (authentifié)
id existant + Bearer token
204
StudentController
accès sans token
requête sans header Authorization
401 (cas de sécurité — traité comme nominal du point de vue de la spec, pas une "erreur" applicative)
Front-end — tests unitaires/intégration (Jest)
Fichier
Cas de test
Vérifie
UserService
register() cas nominal
POST /api/register appelé avec le bon corps
UserService
login() cas nominal
POST /api/login appelé, token stocké dans localStorage
UserService
isLoggedIn()
reflète la présence du token
StudentService
findAll/findById/create/update/delete
chaque méthode appelle le bon verbe/URL HTTP
RegisterComponent (existant : création only)
soumission valide
userService.register() appelé, navigation vers /login
LoginComponent
soumission valide
userService.login() appelé, navigation vers /students
LoginComponent
formulaire invalide
userService.login() non appelé
StudentListComponent
chargement
findAll() appelé au ngOnInit, liste affichée
StudentFormComponent
mode création
soumission → create() appelé
StudentFormComponent
mode édition (id en route)
findById() appelé au chargement, soumission → update() appelé
StudentDetailComponent
chargement
findById() appelé avec l'id de la route
authGuard
utilisateur connecté
retourne true
authGuard
utilisateur non connecté
retourne false et navigue vers /login
authInterceptor
token présent
header Authorization ajouté à la requête
Front-end — tests E2E (Cypress)
Du plus simple (formulaires) au plus complexe (CRUD complet), API mockée
via cy.intercept() :
Parcours
Étapes
Vérifie
Inscription
remplir le formulaire /register, soumettre
requête POST /api/register envoyée, redirection vers /login
Connexion
remplir le formulaire /login, soumettre
requête POST /api/login envoyée, redirection vers /students
Accès protégé
naviguer vers /students sans session
redirection vers /login (Guard)
Liste des étudiants
connecté, visite /students
liste affichée à partir de la réponse mockée
Création d'un étudiant
connecté, /students/new, soumettre
POST /api/students envoyé, retour sur /students
Suppression d'un étudiant
connecté, clic sur Delete + confirmation
DELETE /api/students/{id} envoyé
Seuils de couverture visés
Back-end (JaCoCo) : ≥ 80 % lignes, sur service, controller,
mapper.
Front-end (Jest) : ≥ 80 % statements/branches/functions/lines.
E2E (Cypress) : tous les écrans listés ci-dessus exécutés avec succès.
openclassrooms
p2
devops
tests
plan