Guide de survie : les tests fonctionnels
De la méthode à la classe
Passer du code à la vérification demande un changement de mentalité. On ne cherche plus à construire quelque chose qui marche, mais à prouver que cela fonctionne dans toutes les situations (même les pires).
Ce guide divise la procédure en deux niveaux : le niveau Micro (la méthode) et le niveau Macro (la classe).
Partie 1 : Tester une Méthode (Niveau Micro)
Approche "Boîte Noire"
Imaginez que la méthode est une boîte noire. Vous ne regardez pas le code à l'intérieur. Vous vous concentrez uniquement sur ce qui rentre (Entrées) et ce qui sort (Sorties).
Étape 1 : Analyser le Contrat
Le Contrat est déterminé par deux éléments :
- Le summary : la description de la méthode, de ses paramètres et de sa valeur de retour prend toute sa signification. Elle détermine l'objectif de la méthode.
- La signature de la méthode : la signature nous donne des détails techniques comme le type des variables et le niveau d'accès (
public,private, etc.).
Avant d'écrire le test, posez-vous deux questions :
- Quels sont les paramètres acceptés ? (Ex. : un entier, une chaîne, un objet)
- Quel est le résultat attendu ? (Une valeur de retour ou une exception ?)
Étape 2 : Le "Chemin Heureux" (Happy Path)
C'est le scénario idéal où l'utilisateur fait exactement ce qu'il faut.
- Objectif : Valider que la logique de base fonctionne.
- Exemple : Pour une addition
(2, 2), je m'attends à recevoir4.
Étape 3 : Les Cas Limites (Boundaries)
C'est ici que se cachent 80% des bugs. Testez les frontières des types de données :
- Nombres : testez
0,1,-1, la valeur maximale (MaxInt) et la valeur minimale. - Listes/Tableaux : Une liste vide, une liste avec 1 seul élément, le premier et le dernier élément.
- Chaînes de caractères : Une chaîne vide
"", une chaîne avec seulement des espaces" ", ounull.
Règle d'or : Si votre méthode accepte un nombre, testez toujours 0 et un nombre négatif.
Étape 4 : Les Cas d'Erreur (Exceptions)
Si la méthode a des règles (ex. : « l'âge ne peut pas être négatif »), vous devez tester son comportement avec de mauvaises données.
- Action : Appeler la méthode avec une valeur invalide.
- Attente : la méthode doit lancer une exception (mécanisme vu en Programmation 2, par ex.
ArgumentException). Elle ne doit pas « ne rien faire » ou planter silencieusement.
Ce que l'on peut faire pour corriger le problème :
- Retour hâtif : tester la valeur au début de la méthode et utiliser
returnpour l'arrêter. - Retour significatif : prévoir une valeur de retour qui indique que la méthode est erronée (ex. :
-1pour un index de tableau).
Partie 2 : Tester une Classe (Niveau Macro)
Gestion de l'État
Une classe possède une "mémoire", un "état" (ses attributs). Le résultat d'une méthode dépend souvent de ce qui s'est passé avant.
Étape 1 : L'Initialisation
- Créez une instance de la classe (via le constructeur).
- Vérifiez que les attributs ont bien leurs valeurs par défaut en utilisant le débogueur.
Étape 2 : Accesseurs et Mutateurs (Get/Set)
Normalement, les attributs d'une classe ne sont pas publics. Nous ajoutons une méthode « get » (accesseur) pour consulter et obtenir la valeur d'un attribut et « set » (mutateur) pour modifier un attribut. Ces méthodes servent à la modification et à la lecture directe. Les autres méthodes peuvent apporter des changements différents (classement d'un tableau de noms par ordre alphabétique, affichage à l'écran, etc.).
- Si vous faites un
setValeur(10), legetValeur()doit retourner10. - Vérifiez que le
setrespecte les règles de validation (puis-je mettre la quantité d'essence d'une voiture à -10 litres ?).
Étape 3 : Scénarios de Vie (Séquences)
Testez l'histoire de l'objet. L'ordre des appels est important.
- État initial : créer l'objet.
- Action : appeler une méthode qui modifie l'état (ex. :
ajouterArticle). - Vérification : vérifier l'état intermédiaire (ex. : l'article est maintenant dans la liste des articles du panier).
- Action suivante : appeler une autre méthode (ex. :
viderPanier). - Vérification finale : L'objet est-il revenu à zéro ?
La Structure d'un Test : Le modèle "AAA"
Pour garder vos tests lisibles, utilisez toujours cette structure en trois parties :
-
ARRANGE (Préparer) :
- Créer les objets et initialiser les variables.
- C'est la mise en place du décor.
-
ACT (Agir) :
- Appeler LA méthode que vous voulez tester.
- C'est l'action précise.
-
ASSERT (Affirmer/Vérifier) :
- Comparer le résultat obtenu avec le résultat attendu.
- C'est le verdict.
Exemple de test
public bool Depot_MontantPositif_AugmenteSolde()
{
bool ok = false;
// 1. ARRANGE
Compte monCompte = new Compte();
monCompte.solde = 100;
// 2. ACT
monCompte.Deposer(50);
// 3. ASSERT
if(monCompte.Solde == 150)
{
ok = true;
};
return ok;
}