Testing - loyde07/RDI25 GitHub Wiki
Résumé coaching 8
PAR GROUPE
+ Le groupe présente bien, sur le wiki, la stratégie de testing mise en place : Quels tests (unitaire, intégration, API, end2end, …) et pourquoi?
+ Tous les étudiants comprennent les différences entre les types de tests utilisés
+ Les étudiants ont mis en place au moins des tests unitaires
+ Les étudiants indiquent s'ils ont mis d'autres types de tests en place : tests d'intégration, d'API, End2End et montre des exempes
+ Sur le wiki, le groupe présente le choix de l'outil pour chaque type de tests
+ Le groupe indique ce qu'ils ont utilisé comme DB pour leurs tests (autre que production?)
INDIVIDUEL
+ Chaque étudiant a mis des tests unitaires en oeuvre pour son US personnelle (ou une autre au besoin, en concertation avec le coach).
+ Chaque étudiant a écrit sur le wiki un bilan des tests qu'il a réalisés, sur base d'un rapport de testing et de son interprétation, avec le code coverage.
+ Chaque étudiant a réfléchi aux valeurs d'input à utiliser pour les tests, et présente cette analyse dans la page "Tests" du wiki, notamment en fournissant un tableau valeurs d'input/résultat attendu
+ Les tests sont intéressants, couvrent bien l'US et passent. L'étudiant est capable de les expliquer.
1. Présentation globale des tests
[Méthodologie globale, liste des types de test (unitaire, intégration, ...), et pour chacun, quelle technologie de test a été utilisée + justification]
2. Tests effectués
2.1 Tests unitaires : Outils et Bilan
[A indiquer :
- l'outil de test
- le nombre de test,
- le code coverage
- la méthodologie pour le choix des valeurs d'input,
- les tableaux input/output utilisés pour construire les tests
- si possible la couverture des tests concernés.
- Le lien vers le code des tests en question
- si cela est relevant, l'étudiant qui a mis en place le système permettant d'effectuer les tests. ]
2.2 Tests d'intégration et Tests d'API : Outils et Bilan
[Idem]
2.3 Tests end-to-end : Bilan
[Idem]
3. Rapport de test et interprétation
4. Tests individuels (a priori pour US personnelles)
4.1 Etudiant 1
[Bilan personnel de la réalisation des tests, ce que l'étudiant a testé.]
Coverage
Test pour créer ou rejoindre une Team
Cas testé | Entrée | Comportement attendu | Type |
---|---|---|---|
Nom vide | '' | Appelle axios.post, appelle axios.patch, user devient capitaine | Cas extrême accepté (nom vide) |
Nom très long (256 caractères) | 'A'.repeat(256) | Appelle axios.post, création réussie | Cas extrême (longueur) |
Nom avec caractères spéciaux | 'Équipe_@#$_2025' | Appelle axios.post, création réussie | Cas extrême (caractères) |
Nom classique | 'TeamPhoenix' | Appelle axios.post, création réussie | Cas standard |
Admin crée une équipe | User admin | Appelle axios.post, PAS de axios.patch, PAS d'updateProfile | Cas particulier admin |
Erreur équipe existante | Nom d'équipe déjà existante (simulateur API) | Throw générique, toast spécifique 'Ce nom d’équipe est déjà utilisé' | Erreur spécifique |
Erreur générique | Toute autre erreur API | Throw générique, toast générique 'Erreur lors de la création de l’équipe. Veuillez réessayer...' | Erreur générique |
Test unitaires sur la barre de recherche des joueurs
Fonction | Cas testé | Entrée | Sortie attendue / Comportement | Type de test |
---|---|---|---|---|
rechercherJoueurs | Succès normal | 'Player' | Retourne [{ _id: '1', pseudo: 'Player1' }, ...] | Normal |
rechercherJoueurs | Échec API | 'Player' | Lève erreur : 'Erreur API' | Erreur |
rechercherJoueurs | Recherche vide (ne devrait pas appeler API, à sécuriser côté front) | '' | Peut être bloqué côté estRechercheValide (ne pas lancer API) | Extrême (vide) |
rechercherJoueurs | Recherche espace seul (même comportement que vide) | ' ' | Idem, bloqué par estRechercheValide | Extrême (vide) |
rechercherJoueurs | Recherche caractères spéciaux | '@#$%^' | Selon API : soit retour vide, soit erreur filtrée | Extrême |
rechercherJoueurs | Recherche longue (> 100 caractères) | 'a'.repeat(150) | Doit soit être bloqué par validation avancée, soit renvoyer vide | Extrême |
rechercherJoueurs | Recherche très courte (1 lettre) | 'a' | Comportement à valider (retourne beaucoup de résultats ou bloqué ?) | Extrême |
rechercherJoueurs | Recherche avec accents ou majuscules | 'Équipe' ou 'JOUEUR' | Doit fonctionner (selon backend), vérifier normalisation/casse | Norme / I18n |
estRechercheValide | Vide | '' | false | Normal |
estRechercheValide | Uniquement espaces | ' ' | false | Normal |
estRechercheValide | Texte normal | 'test' | true | Normal |
estRechercheValide | Texte avec espaces autour | ' joueur ' | true | Normal |
estRechercheValide | Texte avec caractères spéciaux | '@#$%' | true (car non vide, mais à sécuriser côté API) | Extrême |
estRechercheValide | Texte très long (> 100 caractères) | 'a'.repeat(150) | true (car non vide, à gérer côté API ou validation avancée front) | Extrême |
Test unitaires sur les composants de updateTeam
Fonction | Cas testé | Entrée | Sortie attendue / Comportement |
---|---|---|---|
ajouterJoueurAListe | Ajouter joueur non présent | Liste: ['1'], Joueur: '2' | ['1', '2'] |
ajouterJoueurAListe | Ajouter joueur déjà présent (doit throw) | Liste: ['1'], Joueur: '1' | Erreur : "Joueur déjà présent" |
retirerJoueurDeListe | Retirer joueur existant | Liste: ['1', '2'], Joueur: '1' | ['2'] |
retirerJoueurDeListe | Retirer joueur inexistant (doit throw) | Liste: ['1'], Joueur: '3' | Erreur : "Joueur introuvable" |
toggleSuppressionLogic | Ajouter joueur non marqué | Liste: [], Joueur: '1' | ['1'] |
toggleSuppressionLogic | Retirer joueur déjà marqué | Liste: ['1'], Joueur: '1' | [] |
ajouterJoueurDansEquipe | Ajout joueur et mise à jour form / UI | API, teamId, joueur {id}, mocks de setForm etc. | API PATCH appelé, UI mise à jour, setForm, setShowAddPlayer, etc. |
handleUpdateTeam | Met à jour team, joueurs, rafraîchit le form et données | API, teamId, form, joueurs à retirer | PATCH puis GET API appelés, form et data mis à jour |
toggleJoueurASupprimer | Ajouter joueur non présent dans la liste | Liste: ['1'], Joueur: '2' | setJoueursÀRetirer(['1', '2']) |
toggleJoueurASupprimer | Empêche ajout si joueur déjà présent (log erreur) | Liste: ['1'], Joueur: '1' | Console erreur, setJoueursÀRetirer non appelé |
toggleJoueurASupprimer | Erreur claire si joueurId invalide (undefined) | Liste: ['1'], Joueur: undefined | Console erreur, setJoueursÀRetirer non appelé |
Test unitaires sur les composants de updateTeam
Fonction | Cas testé | Entrée | Sortie attendue / Comportement |
---|---|---|---|
ajouterJoueurAListe | Ajouter joueur non présent | Liste: ['1'], Joueur: '2' | ['1', '2'] |
ajouterJoueurAListe | Ajouter joueur déjà présent (doit throw) | Liste: ['1'], Joueur: '1' | Erreur : "Joueur déjà présent" |
retirerJoueurDeListe | Retirer joueur existant | Liste: ['1', '2'], Joueur: '1' | ['2'] |
retirerJoueurDeListe | Retirer joueur inexistant (doit throw) | Liste: ['1'], Joueur: '3' | Erreur : "Joueur introuvable" |
toggleSuppressionLogic | Ajouter joueur non marqué | Liste: [], Joueur: '1' | ['1'] |
toggleSuppressionLogic | Retirer joueur déjà marqué | Liste: ['1'], Joueur: '1' | [] |
ajouterJoueurDansEquipe | Ajout joueur et mise à jour form / UI | API, teamId, joueur {id}, mocks de setForm etc. | API PATCH appelé, UI mise à jour, setForm, setShowAddPlayer, etc. |
handleUpdateTeam | Met à jour team, joueurs, rafraîchit le form et données | API, teamId, form, joueurs à retirer | PATCH puis GET API appelés, form et data mis à jour |
toggleJoueurASupprimer | Ajouter joueur non présent dans la liste | Liste: ['1'], Joueur: '2' | setJoueursÀRetirer(['1', '2']) |
toggleJoueurASupprimer | Empêche ajout si joueur déjà présent (log erreur) | Liste: ['1'], Joueur: '1' | Console erreur, setJoueursÀRetirer non appelé |
toggleJoueurASupprimer | Erreur claire si joueurId invalide (undefined) | Liste: ['1'], Joueur: undefined | Console erreur, setJoueursÀRetirer non appelé |
Test unitaires et d'intégration sur le upload des photos
Fonction | Cas testé | Entrée | Comportement attendu | Type de test |
---|---|---|---|---|
uploadLogo | Succès standard | Fichier valide | Retourne chemin (/uploads/logo.png) | Unitaire |
uploadLogo | Aucun fichier | null ou undefined | Retourne undefined, aucun appel API | Extrême |
uploadLogo | Erreur API simulée | Fichier valide | Lève erreur 'Erreur lors de l'upload du logo', toast affiché | Erreur |
uploadLogo (intégration) | Envoi correct avec bon header & FormData | Fichier valide | Appel API avec multipart/form-data et fichier bien envoyé (logo) | Intégration |
uploadLogo (intégration) | Vérifie présence du fichier dans le FormData | Fichier valide | Le FormData contient bien l'entrée clé logo avec le fichier | Intégration |
uploadLogo (intégration) | Aucun fichier (cas extrême) | undefined | Aucun appel API, retourne undefined | Extrême (Front) |
uploadLogo (intégration) | Échec API (réseau, serveur) | Fichier valide | Lève l'erreur personnalisée, toast appelé | Intégration/Erreur |
Test pour rejoindre une Team
Fonction | Cas testé | Entrée | Comportement attendu | Type |
---|---|---|---|---|
validerSelectionEquipe | Équipe valide sélectionnée | Liste d'équipes, id existant | Aucun throw | Validation |
validerSelectionEquipe | Aucun id sélectionné | Liste d'équipes, '' | Throw 'Aucune équipe sélectionnée' | Validation Erreur |
validerSelectionEquipe | ID inexistant | Liste d'équipes, id inexistant (999) | Throw 'Équipe invalide sélectionnée' | Validation Erreur |
genererOptionsEquipes | Transforme correctement | Liste d'équipes | Retourne tableau { label, value } | Unitaire |
genererOptionsEquipes | Paramètre invalide | 'not an array' | Throw 'Paramètre invalide : teams doit être un tableau' | Validation Erreur |
fetchTeams | Succès récupération | URL valide | Retourne data ([{ _id, nom }]) | Intégration |
fetchTeams | Erreur API | URL invalide ou serveur down | Throw personnalisé 'Erreur lors de la récupération des équipes : Erreur API' | Erreur |
rejoindreEquipe | Succès PATCH | API, teamId, playerId | Appel PATCH, aucune erreur | Intégration |
rejoindreEquipe | Erreur API | API, teamId, playerId | Throw 'Erreur lors de la tentative de rejoindre l'équipe : Erreur API' | Erreur |
ajouterJoueurDansEquipe | Ajout joueur réussi | API, teamId, joueur, callbacks | Appel PATCH, toast success, reset forms | Intégration |
ajouterJoueurDansEquipe | Échec ajout joueur | API, teamId, joueur, callbacks | Toast error 'Erreur lors de l'ajout du joueur' | Intégration/Erreur |
handleUpdateTeam | Mise à jour avec succès | API, teamId, form, joueursÀRetirer, callbacks | Appel PATCH, toast success, rafraîchissement des states | Intégration |
handleUpdateTeam | Échec mise à jour équipe | API, teamId, form, joueursÀRetirer, callbacks | Toast error 'Erreur lors de la mise à jour' | Intégration/Erreur |
toggleJoueurASupprimer | Toggle suppression joueur dans liste | joueursÀRetirer, joueurId, callback | Appelle setJoueursÀRetirer correctement | Unitaire |
toggleJoueurASupprimer | Cas extrême : entrée invalide (null) + simulateur d'erreur | null, joueurId, callback qui throw | Toast error avec message personnalisé | Extrême |
4.2 Etudiant 2
Hassan: Rapport de Test
4.3 Etudiant 3
(Loyde)
Test pour la page Team.jsx
Cas testé | Entrée | Comportement attendu | Type |
---|---|---|---|
Rendu initial avec équipes et joueurs | Liste équipes (avec/sans logo) + liste joueurs | Affiche équipes dans carousel, logos ou images fallback, affiche joueurs de l’équipe sélectionnée | Cas Standard |
Changement d’équipe au clic sur image carousel | Clic sur logo d’une équipe différente | Change équipe sélectionnée, affiche joueurs correspondants | Interaction |
Image fallback si logo équipe null | Équipe sans logo | Affiche image fallback /val.png dans le carousel |
Cas extrême |
Pas d’appel API joueurs si pas d’équipe | Liste équipes vide | Ne fait pas d’appel pour récupérer joueurs | Cas particulier |
Erreur fetch équipes | Requête axios échoue | Log une erreur personnalisée dans la console | Erreur |
Ouverture modal joueur au clic bouton info | Clic sur bouton info joueur | Affiche modal avec détails complets du joueur | Interaction |
Fermeture modal joueur au clic sur fermeture | Clic sur bouton "×" modal | Ferme le modal | Interaction |
Image fallback dans modal joueur si logo null | Joueur sans logo | Affiche image fallback /avatar.png dans modal |
Cas extrême |
Changement d’équipe via bouton précédent | Clic sur bouton "<" | Affiche équipe précédente dans carousel | Interaction |
Changement d’équipe via bouton suivant | Clic sur bouton ">" | Affiche équipe suivante dans carousel | Interaction |
Affichage vide si équipe sans joueurs | Équipe sans joueurs | N’affiche pas de joueurs (liste vide) | Cas limite |
Support API renvoyant directement un tableau | API renvoie tableau d’équipes sans wrapper | Affiche correctement les équipes | Cas particulier |
Gestion joueurs non tableau | team.joueurs est une string (pas un tableau) |
Ne crashe pas, modal info joueur absent ou affiché sans erreur | Cas extrême |
Pas de fetch joueurs si selectedTeamId vide | selectedTeamId vide |
Un seul appel API équipes, aucun appel joueurs | Cas particulier |
Aucune équipe disponible | Liste équipes vide | Ne rend pas d’images d’équipes | Cas limite |
Cas testé | Entrée / Conditions | Comportement attendu | Type |
---|---|---|---|
Affichage des équipes dans le carousel | Liste d’équipes avec logos et logos null | Affiche les logos, affiche image fallback si logo null | Cas standard |
Affichage des joueurs de l’équipe sélectionnée | Équipe avec joueurs | Affiche les pseudos des joueurs | Cas standard |
Changement d’équipe au clic sur carousel | Clic sur logo d’une autre équipe | Change l’équipe sélectionnée et met à jour l’affichage | Interaction utilisateur |
Affichage image fallback dans le carousel | Équipe sans logo | Affiche une image par défaut /val.png dans le carousel |
Cas extrême (logo null) |
Pas d’appel API joueurs si pas d’équipe | Pas d’équipe dans la liste | Ne fait pas d’appel API joueurs | Cas particulier (absence de données) |
Erreur fetch équipes | Erreur réseau lors du fetch équipes | Log une erreur dans la console avec message personnalisé | Erreur spécifique |
Ouverture modal joueur au clic bouton info | Clic sur bouton info joueur | Affiche modal avec détails du joueur | Interaction utilisateur |
Fermeture modal joueur au clic bouton fermer | Clic sur bouton fermeture modal | Ferme le modal joueur | Interaction utilisateur |
Image fallback dans modal joueur si logo null | Joueur sans logo | Affiche image par défaut /avatar.png dans modal |
Cas extrême (logo null joueur) |
Changement d’équipe avec bouton précédent | Clic sur bouton "<" | Affiche l’équipe précédente dans le carousel | Interaction utilisateur |
Changement d’équipe avec bouton suivant | Clic sur bouton ">" | Affiche l’équipe suivante dans le carousel | Interaction utilisateur |
Affichage vide si équipe sans joueurs | Équipe sans joueurs | N’affiche pas de joueurs (liste vide) | Cas limite (absence de joueurs) |
Support API qui renvoie directement un tableau d’équipes | API renvoie tableau d’équipes sans wrapper | Affiche correctement les équipes | Cas particulier (format API) |
Erreur récupération équipes avec console.error | Erreur fetch équipes | console.error appelé avec message personnalisé | Erreur spécifique |
Gestion joueurs non tableau | team.joueurs n’est pas un tableau |
Pas de crash, modal info joueur absent ou affiché sans erreurs | Cas extrême (données malformées) |
Pas de fetch joueurs si selectedTeamId vide | selectedTeamId vide | Un seul appel API pour équipes, pas de fetch joueurs | Cas particulier (absence sélection) |
Aucune équipe disponible | Liste équipes vide | Ne rend pas d’images d’équipes | Cas limite (pas de données) |
Test coverage
outils de test utilisé
-
jsdom
-
React Testing Library
-
Vitest
lien : lien de la page test
4.4 Etudiant 4
(Marie)
Les tests ne fonctionne pas