Chapitre 7 — Tests et validation d’un algorithme
Vérifier méthodiquement la correction, la robustesse et la fiabilité d’une solution
Fiche pédagogique du chapitre
Objectifs d’apprentissage
À la fin de ce chapitre, l’étudiant devra être capable de :
- expliquer le rôle des tests dans le développement d’un algorithme ;
- construire un jeu d’essai contenant des cas normaux, limites et incorrects ;
- identifier les valeurs minimales et maximales pertinentes pour un problème ;
- réaliser une table de trace afin de suivre l’évolution des variables et des conditions ;
- analyser le comportement d’une boucle sur plusieurs itérations ;
- distinguer une erreur de syntaxe, une erreur d’exécution et une erreur logique ;
- détecter une boucle infinie et une mauvaise initialisation ;
- valider les données saisies avant leur utilisation ;
- concevoir une saisie contrôlée qui se répète tant que la donnée est invalide ;
- tester un algorithme de manière méthodique et documenter les résultats obtenus.
Prérequis
- connaître les variables, les constantes et les types de données simples ;
- savoir utiliser les opérateurs arithmétiques, relationnels et logiques ;
- maîtriser les structures conditionnelles ;
- maîtriser les boucles Pour, TantQue et Répéter…Jusqu’à ;
- savoir lire et écrire un algorithme en pseudo-code.
Plan du chapitre
7.1 Jeu d’essai
7.2 Table de trace
7.3 Types d’erreurs
7.4 Validation des données
Applications, exercices, corrigés et synthèse
Organisation pédagogique indicative
Activité | Durée indicative | Objectif principal |
|---|---|---|
| Cours | 2 h | Présenter les méthodes de test, de traçage et de validation. |
| Travaux dirigés | 2 h | Construire des jeux d’essai et analyser des tables de trace. |
| Travaux pratiques | 2 h | Mettre en œuvre des saisies contrôlées et corriger des algorithmes. |
| Travail personnel | 1 à 2 h | Tester plusieurs solutions et rédiger un compte rendu de validation. |
| Idée centrale : un algorithme ne doit pas seulement produire un résultat dans un exemple favorable. Il doit être testé sur des situations variées, notamment aux limites de son domaine et avec des données incorrectes. |
Introduction aux tests et à la validation
La conception d’un algorithme ne s’arrête pas à son écriture. Une solution qui paraît correcte à la lecture peut contenir une erreur de calcul, une condition mal formulée, une variable non initialisée ou une boucle qui ne se termine jamais. Le test consiste à exécuter mentalement ou réellement l’algorithme avec des données choisies afin d’observer son comportement.
La validation vise à vérifier que l’algorithme répond au problème posé pour toutes les données autorisées. Elle s’appuie sur des jeux d’essai pertinents, des résultats attendus connus, des tables de trace et une analyse systématique des erreurs. Tester ne permet pas toujours de démontrer mathématiquement l’absence totale d’erreur, mais cela augmente fortement la confiance accordée à la solution.
| À retenir : un test est utile lorsque le résultat attendu est déterminé avant l’exécution. Sans résultat attendu, on observe une sortie, mais on ne peut pas conclure qu’elle est correcte. |
7.1 Jeu d’essai
7.1.1 Définition d’un jeu d’essai
Un jeu d’essai est un ensemble organisé de données utilisées pour tester un algorithme. Chaque donnée ou combinaison de données constitue un cas de test. Pour chaque cas, on précise les entrées, le résultat attendu et, après exécution, le résultat obtenu.
Un jeu d’essai de qualité ne se limite pas à une seule valeur choisie au hasard. Il couvre les situations représentatives du problème : fonctionnement habituel, frontières du domaine, données interdites et cas particuliers susceptibles de révéler une erreur.
Élément | Question à poser | Exemple |
|---|---|---|
| Entrées | Quelles valeurs sont fournies à l’algorithme ? | note = 14 |
| Précondition | Quelles règles les entrées doivent-elles respecter ? | 0 ≤ note ≤ 20 |
| Résultat attendu | Quel résultat correct doit être obtenu ? | « Note valide » |
| Résultat obtenu | Que produit réellement l’algorithme ? | « Note valide » |
| Verdict | Le résultat obtenu correspond-il au résultat attendu ? | Test réussi |
7.1.2 Cas normal
Un cas normal correspond à une situation courante, clairement située à l’intérieur du domaine valide. Il permet de vérifier le fonctionnement principal de l’algorithme, sans solliciter immédiatement ses frontières.
Pour un algorithme qui calcule la moyenne de trois notes comprises entre 0 et 20, le triplet (12, 14, 16) constitue un cas normal. Le résultat attendu est 14.
| Limite du cas normal : un algorithme peut réussir tous les cas normaux et échouer aux limites. Le cas normal est nécessaire, mais il n’est jamais suffisant. |
7.1.3 Cas limite
Un cas limite utilise une valeur placée sur une frontière du domaine ou juste à proximité. Les erreurs de comparaison apparaissent fréquemment à ces endroits, par exemple lorsque l’on écrit < au lieu de ≤.
- Borne minimale : tester la plus petite valeur autorisée.
- Borne maximale : tester la plus grande valeur autorisée.
- Valeur juste en dessous : vérifier que la valeur interdite est rejetée.
- Valeur juste au-dessus : vérifier que la valeur interdite est également rejetée.
Domaine attendu | Cas à tester | Raison |
|---|---|---|
| 0 ≤ note ≤ 20 | -1, 0, 1, 19, 20, 21 | Tester les deux bornes et leur voisinage. |
| âge ≥ 18 | 17, 18, 19 | Vérifier le passage de mineur à majeur. |
| 1 ≤ choix ≤ 4 | 0, 1, 4, 5 | Tester les extrémités d’un menu. |
| diviseur ≠ 0 | -1, 0, 1 | Tester la valeur interdite et ses voisins. |
7.1.4 Cas incorrect
Un cas incorrect fournit une donnée qui ne respecte pas les règles du problème. Il permet de vérifier que l’algorithme refuse proprement la valeur, affiche un message compréhensible et évite un calcul impossible.
- une note égale à 25 alors que les notes doivent être comprises entre 0 et 20 ;
- un diviseur égal à zéro ;
- une chaîne de caractères saisie alors qu’un entier est attendu ;
- une date impossible telle que le 31 février ;
- une quantité négative pour un nombre d’articles.
| Robustesse : un algorithme robuste ne suppose pas que toutes les données sont correctes. Il contrôle les entrées et prévoit une réaction adaptée. |
7.1.5 Valeurs minimales et maximales
Les valeurs minimales et maximales peuvent être imposées par l’énoncé, par le type de donnée, par une règle métier ou par une contrainte physique. Elles doivent être identifiées avant la rédaction des tests.
Origine de la limite | Exemple | Tests associés |
|---|---|---|
| Énoncé | Une note appartient à [0, 20]. | -1, 0, 20, 21 |
| Règle métier | Une réservation concerne de 1 à 8 personnes. | 0, 1, 8, 9 |
| Contrainte physique | Une durée ne peut pas être négative. | -1, 0, valeur positive |
| Type informatique | Un entier est stocké sur un nombre limité de bits. | valeur maximale et dépassement |
| Taille d’une collection | Un tableau contient N éléments. | N = 0, N = 1, grande valeur de N |
7.1.6 Méthode de construction d’un jeu d’essai
- Identifier précisément les entrées et leur domaine autorisé.
- Déterminer les résultats attendus sans utiliser l’algorithme à tester.
- Choisir au moins un cas normal représentatif.
- Ajouter les bornes minimales et maximales.
- Tester les valeurs situées juste avant et juste après les bornes.
- Ajouter des données incorrectes et des cas particuliers.
- Exécuter ou tracer l’algorithme pour chaque cas.
- Comparer les résultats obtenus aux résultats attendus et documenter les écarts.
7.1.7 Exemple complet : validation d’une note
Algorithme étudié
| Algorithme Valider_Note Variables note : Réel Début Lire(note) Si note >= 0 ET note <= 20 Alors Écrire("Note valide") Sinon Écrire("Note invalide") FinSi Fin |
N° | Entrée | Nature du cas | Résultat attendu |
|---|---|---|---|
| 1 | 12 | Normal | Note valide |
| 2 | 0 | Limite minimale | Note valide |
| 3 | 20 | Limite maximale | Note valide |
| 4 | -0,5 | Incorrect, sous la borne | Note invalide |
| 5 | 20,5 | Incorrect, au-dessus de la borne | Note invalide |
7.2 Table de trace
7.2.1 Définition et objectif
Une table de trace est un tableau qui représente, étape par étape, l’exécution d’un algorithme. Chaque ligne correspond généralement à une instruction significative ou à une itération. Les colonnes représentent les variables, les conditions évaluées et les sorties produites.
Le traçage manuel oblige à respecter l’ordre exact des instructions. Il permet de comprendre un algorithme, de vérifier les calculs intermédiaires et de localiser l’endroit où le comportement s’écarte du résultat attendu.
7.2.2 Suivi de l’évolution des variables
À chaque affectation, la nouvelle valeur remplace l’ancienne. La table doit donc indiquer l’état de la variable après l’exécution de l’instruction. Lorsque la variable n’a pas encore reçu de valeur, on peut noter « non définie ».
Exemple séquentiel
| Algorithme Evolution Variables a, b : Entier Début a <- 4 b <- a + 3 a <- b * 2 Écrire(a, b) Fin |
Étape | Instruction | a | b | Sortie |
|---|---|---|---|---|
| 0 | État initial | non définie | non définie | — |
| 1 | a <- 4 | 4 | non définie | — |
| 2 | b <- a + 3 | 4 | 7 | — |
| 3 | a <- b * 2 | 14 | 7 | — |
| 4 | Écrire(a, b) | 14 | 7 | 14, 7 |
7.2.3 Suivi des conditions
Lorsqu’un algorithme rencontre une condition, celle-ci est évaluée à Vrai ou Faux. La table de trace doit indiquer la valeur de la condition et la branche réellement exécutée.
Extrait conditionnel
| Si age >= 18 Alors statut <- "Majeur" Sinon statut <- "Mineur" FinSi |
âge | Condition age ≥ 18 | Branche exécutée | statut |
|---|---|---|---|
| 17 | Faux | Sinon | Mineur |
| 18 | Vrai | Alors | Majeur |
| 25 | Vrai | Alors | Majeur |
7.2.4 Suivi des répétitions
Pour une boucle, chaque itération est représentée séparément. Il faut suivre la variable de contrôle, les accumulateurs, la condition de continuation et les valeurs affichées. Cette représentation révèle souvent les erreurs de borne ou de mise à jour.
Somme de 1 à 4
| somme <- 0 Pour i allant de 1 à 4 Faire somme <- somme + i FinPour Écrire(somme) |
Itération | i | somme avant | Calcul | somme après |
|---|---|---|---|---|
| 1 | 1 | 0 | 0 + 1 | 1 |
| 2 | 2 | 1 | 1 + 2 | 3 |
| 3 | 3 | 3 | 3 + 3 | 6 |
| 4 | 4 | 6 | 6 + 4 | 10 |
À la sortie de la boucle, la variable somme vaut 10. Le résultat correspond à 1 + 2 + 3 + 4.
7.2.5 Détection des erreurs
Une table de trace permet de détecter plusieurs anomalies : valeur utilisée avant initialisation, condition toujours vraie, compteur non modifié, calcul effectué une fois de trop ou de moins, mauvaise branche conditionnelle et écrasement prématuré d’une variable.
Symptôme observé | Cause probable | Correction à envisager |
|---|---|---|
| Une valeur est inconnue au premier calcul. | Variable non initialisée. | Affecter une valeur initiale avant son utilisation. |
| La condition reste toujours vraie. | Variable de contrôle non mise à jour. | Ajouter ou corriger la mise à jour. |
| La dernière valeur n’est pas traitée. | Borne ou opérateur de comparaison incorrect. | Vérifier <, ≤ et les bornes. |
| Le résultat est décalé d’une unité. | Erreur « off-by-one ». | Tester les valeurs aux limites. |
| Une branche inattendue est exécutée. | Expression logique mal formulée. | Décomposer et tracer chaque sous-condition. |
7.2.6 Conseils pour construire une table de trace
- créer une colonne pour chaque variable importante ;
- ajouter une colonne pour les conditions qui déterminent le chemin d’exécution ;
- indiquer les sorties produites par les instructions Écrire ;
- utiliser une ligne par étape ou par itération ;
- ne pas modifier une valeur avant d’avoir utilisé l’ancienne valeur dans le calcul ;
- arrêter la trace dès que l’algorithme se termine ou lorsqu’une boucle infinie est démontrée.
7.3 Types d’erreurs
7.3.1 Erreur de syntaxe
Une erreur de syntaxe correspond au non-respect des règles d’écriture du pseudo-code ou du langage de programmation. Le traducteur, l’interpréteur ou le compilateur ne peut pas comprendre correctement l’instruction.
- mot-clé mal orthographié ;
- parenthèse ou guillemet non fermé ;
- FinSi, FinPour ou FinTantQue manquant ;
- opérateur d’affectation mal utilisé ;
- séparateur ou indentation incorrecte dans certains langages.
Exemple d’erreur de syntaxe
| Si note >= 10 Alors Écrire("Admis") // FinSi manquant | |
| Détection : les erreurs de syntaxe sont généralement signalées avant ou au début de l’exécution, avec une indication de ligne. Le message doit être lu attentivement. |
7.3.2 Erreur d’exécution
Une erreur d’exécution apparaît lorsque l’algorithme est syntaxiquement acceptable, mais rencontre une opération impossible pendant son fonctionnement. Elle dépend souvent des données fournies.
- division par zéro ;
- accès à une position inexistante d’un tableau ;
- conversion impossible d’une chaîne en nombre ;
- fichier ou ressource indisponible ;
- dépassement de capacité numérique.
Algorithme vulnérable à une division par zéro
| Lire(a, b) quotient <- a / b Écrire(quotient) |
Pour a = 10 et b = 2, le calcul réussit. Pour b = 0, l’algorithme tente une opération interdite. La donnée doit donc être validée avant la division.
7.3.3 Erreur logique
Une erreur logique produit un résultat incorrect sans nécessairement interrompre l’exécution. Elle est souvent plus difficile à détecter, car le programme semble fonctionner. Elle provient d’une mauvaise formule, d’une condition incorrecte ou d’un ordre d’instructions inadapté.
Formule incorrecte à cause de la priorité des opérateurs
| moyenne <- note1 + note2 + note3 / 3 |
L’expression précédente divise uniquement note3 par 3. La formule correcte est : moyenne <- (note1 + note2 + note3) / 3.
| Détection : les erreurs logiques sont révélées par la comparaison entre résultat obtenu et résultat attendu. Les jeux d’essai et les tables de trace sont donc indispensables. |
7.3.4 Boucle infinie
Une boucle infinie ne rencontre jamais sa condition d’arrêt. Elle se produit lorsque la condition est toujours vraie ou lorsque les variables qui influencent cette condition ne sont pas correctement modifiées.
Boucle infinie : i n’est jamais incrémenté
| i <- 1 TantQue i <= 5 Faire Écrire(i) FinTantQue |
La correction consiste à ajouter i <- i + 1 dans la boucle. Il faut ensuite vérifier que la progression rapproche effectivement la variable de la condition d’arrêt.
7.3.5 Mauvaise initialisation
Une variable d’accumulation, de comptage ou de recherche doit recevoir une valeur initiale adaptée. Une mauvaise initialisation fausse toutes les étapes suivantes.
Rôle de la variable | Initialisation habituelle | Exemple |
|---|---|---|
| Somme | 0 | somme <- 0 |
| Compteur | 0 | nbPairs <- 0 |
| Produit | 1 | produit <- 1 |
| Maximum | première valeur valide | max <- tableau[1] |
| Booléen de recherche | Faux | trouve <- Faux |
Mauvaise initialisation d’un produit
| produit <- 0 Pour i allant de 1 à 4 Faire produit <- produit * i FinPour |
Le produit restera toujours égal à zéro. Pour calculer 1 × 2 × 3 × 4, il faut initialiser produit à 1.
7.3.6 Tableau récapitulatif
Type d’erreur | Moment de détection | Effet | Outil principal |
|---|---|---|---|
| Syntaxe | Avant ou au début de l’exécution | Instruction non comprise | Message du compilateur/interpréteur |
| Exécution | Pendant l’exécution | Arrêt ou exception | Validation des données et tests |
| Logique | Après comparaison des résultats | Résultat incorrect | Jeux d’essai et table de trace |
| Boucle infinie | Pendant l’exécution | Algorithme qui ne termine pas | Analyse de la condition d’arrêt |
| Initialisation | Lors du traçage ou du test | Résultats intermédiaires faux | Table de trace |
7.4 Validation des données
7.4.1 Principe général
Valider une donnée consiste à vérifier qu’elle possède le type, le format et la valeur attendus avant de l’utiliser. La validation protège l’algorithme contre les calculs impossibles et améliore la qualité des messages adressés à l’utilisateur.
| Principe : lire, contrôler, expliquer l’erreur, puis redemander la donnée tant qu’elle n’est pas valide. |
7.4.2 Vérification d’un intervalle
Pour vérifier qu’une valeur x appartient à l’intervalle [min, max], on utilise la condition x >= min ET x <= max. Pour rejeter la valeur et répéter la saisie, la condition de boucle peut être x < min OU x > max.
Validation d’une note
| Répéter Écrire("Saisir une note entre 0 et 20 :") Lire(note) Si note < 0 OU note > 20 Alors Écrire("Valeur incorrecte.") FinSi Jusqu’à note >= 0 ET note <= 20 |
7.4.3 Contrôle du type de donnée
Le contrôle du type vérifie qu’une saisie peut être interprétée comme un entier, un réel, un booléen ou une autre donnée attendue. Dans un pseudo-code introductif, on peut représenter ce contrôle par une opération EstEntier ou LectureRéussie. Dans un langage de programmation, il faut utiliser les mécanismes de conversion et de gestion des erreurs proposés par le langage.
Schéma conceptuel de contrôle du type
| Répéter Lire(texte) valide <- EstEntier(texte) Si NON valide Alors Écrire("Veuillez saisir un entier.") FinSi Jusqu’à valide nombre <- ConvertirEnEntier(texte) |
Le contrôle du type doit précéder le contrôle de l’intervalle. Il est impossible de comparer correctement le texte « douze » aux nombres 0 et 20.
7.4.4 Répétition de la saisie en cas d’erreur
Une saisie contrôlée est généralement réalisée avec TantQue ou Répéter…Jusqu’à. La boucle Répéter est naturelle lorsque l’on souhaite obligatoirement demander la valeur une première fois.
Structure | Condition écrite | Lecture |
|---|---|---|
| TantQue | Condition d’invalidité : tant que la valeur est incorrecte | La première lecture doit souvent être placée avant la boucle. |
| Répéter…Jusqu’à | Condition de validité : jusqu’à ce que la valeur soit correcte | La lecture est placée dans la boucle et a lieu au moins une fois. |
7.4.5 Gestion des valeurs impossibles
Certaines valeurs sont syntaxiquement correctes et appartiennent au bon type, mais restent impossibles dans le contexte. Une quantité négative, un mois égal à 13 ou une date du 31 février sont des exemples de valeurs sémantiquement impossibles.
- vérifier les contraintes générales : signe, intervalle et format ;
- vérifier les contraintes dépendantes d’autres données ;
- afficher un message qui indique précisément la règle non respectée ;
- éviter de poursuivre le traitement avec une valeur invalide ;
- prévoir éventuellement une option d’annulation ou une valeur sentinelle clairement documentée.
7.4.6 Ordre recommandé des validations
- Vérifier que la donnée a bien été saisie.
- Vérifier le type ou le format.
- Vérifier les bornes générales.
- Vérifier les règles métier et les dépendances entre données.
- Accepter la donnée et poursuivre le traitement uniquement si tous les contrôles réussissent.
7.4.7 Messages d’erreur utiles
Message insuffisant | Message amélioré |
|---|---|
| Erreur. | La note doit être comprise entre 0 et 20. |
| Valeur invalide. | Le diviseur doit être différent de zéro. |
| Recommencez. | Veuillez saisir un entier strictement positif. |
| Date incorrecte. | Le mois doit être compris entre 1 et 12. |
| Bonne pratique : un message de validation doit indiquer ce qui est incorrect et rappeler la règle attendue, sans exposer de détail technique inutile à l’utilisateur. |
Applications guidées
Les applications suivantes mettent en œuvre les méthodes de validation et de test étudiées. Pour chacune, on identifie le domaine valide, on écrit l’algorithme, puis on propose un jeu d’essai.
Application 1 — Vérifier qu’une note est comprise entre 0 et 20
Le programme doit demander une note réelle et répéter la saisie tant que la valeur n’appartient pas à l’intervalle [0, 20].
| Algorithme Saisie_Note_Valide Variables note : Réel Début Répéter Écrire("Saisir une note entre 0 et 20 :") Lire(note) Si note < 0 OU note > 20 Alors Écrire("La note doit être comprise entre 0 et 20.") FinSi Jusqu’à note >= 0 ET note <= 20 Écrire("Note acceptée : ", note) Fin |
Saisie(s) | Comportement attendu |
|---|---|
| 12 | La valeur est acceptée immédiatement. |
| 0 | La borne minimale est acceptée. |
| 20 | La borne maximale est acceptée. |
| -2 puis 8 | Message d’erreur, nouvelle saisie, puis acceptation de 8. |
| 25 puis 20 | Message d’erreur, puis acceptation de la borne 20. |
Application 2 — Vérifier qu’un diviseur est différent de zéro
Avant une division, le diviseur doit être contrôlé. Le dividende peut être nul, positif ou négatif, mais le diviseur ne doit jamais être nul.
| Algorithme Division_Controlee Variables dividende, diviseur, quotient : Réel Début Lire(dividende) Répéter Écrire("Saisir un diviseur non nul :") Lire(diviseur) Si diviseur = 0 Alors Écrire("Division impossible : le diviseur doit être non nul.") FinSi Jusqu’à diviseur <> 0 quotient <- dividende / diviseur Écrire("Quotient = ", quotient) Fin |
Dividende | Diviseur(s) | Résultat attendu |
|---|---|---|
| 10 | 2 | Quotient = 5 |
| 0 | 4 | Quotient = 0 |
| 10 | -2 | Quotient = -5 |
| 8 | 0 puis 4 | Erreur pour 0, puis quotient = 2 |
Application 3 — Demander un nombre positif
L’expression « nombre positif » doit être interprétée avec précision. En mathématiques, strictement positif signifie supérieur à zéro. Si zéro est accepté, on parle de nombre positif ou nul.
Version à analyser
| Algorithme Saisie_Entier_Strictement_Positif Variables n : Entier Début TantQue n <= 0 Faire Écrire("Saisir un entier strictement positif :") Lire(n) FinTantQue Écrire("Valeur acceptée : ", n) Fin | |
| Erreur à corriger : la variable n est testée avant sa première lecture. Il faut effectuer une lecture avant la boucle ou utiliser Répéter…Jusqu’à. |
Version corrigée
| Algorithme Saisie_Entier_Strictement_Positif Variables n : Entier Début Répéter Écrire("Saisir un entier strictement positif :") Lire(n) Jusqu’à n > 0 Écrire("Valeur acceptée : ", n) Fin |
Application 4 — Tester un algorithme sur plusieurs jeux de données
On considère un algorithme qui détermine la mention associée à une note valide : « Insuffisant » si la note est inférieure à 10, « Passable » de 10 inclus à 12 exclu, « Assez bien » de 12 inclus à 14 exclu, « Bien » de 14 inclus à 16 exclu et « Très bien » à partir de 16.
| Algorithme Mention_Note Variables note : Réel mention : Chaîne Début Lire(note) Si note < 0 OU note > 20 Alors mention <- "Note invalide" SinonSi note < 10 Alors mention <- "Insuffisant" SinonSi note < 12 Alors mention <- "Passable" SinonSi note < 14 Alors mention <- "Assez bien" SinonSi note < 16 Alors mention <- "Bien" Sinon mention <- "Très bien" FinSi Écrire(mention) Fin |
Note | Type de cas | Résultat attendu | Justification |
|---|---|---|---|
| -1 | Incorrect | Note invalide | Valeur sous la borne minimale. |
| 0 | Limite | Insuffisant | Borne minimale valide. |
| 9,99 | Limite proche | Insuffisant | Juste avant 10. |
| 10 | Limite | Passable | Entrée dans la catégorie Passable. |
| 11,99 | Limite proche | Passable | Juste avant 12. |
| 12 | Limite | Assez bien | Entrée dans la catégorie suivante. |
| 14 | Limite | Bien | Borne de changement de mention. |
| 16 | Limite | Très bien | Borne de la meilleure mention. |
| 20 | Limite maximale | Très bien | Borne maximale valide. |
| 21 | Incorrect | Note invalide | Valeur au-dessus de la borne. |
Ce jeu d’essai cible volontairement les seuils. Un test uniquement réalisé avec les notes 8, 13 et 18 ne permettrait pas de détecter une erreur sur les comparaisons aux valeurs 10, 12, 14 ou 16.
Synthèse du chapitre
Règles essentielles à retenir
- définir le résultat attendu avant d’exécuter un test ;
- inclure dans le jeu d’essai des cas normaux, limites, incorrects et particuliers ;
- tester les deux bornes et les valeurs situées immédiatement autour de celles-ci ;
- utiliser une table de trace pour suivre les variables, les conditions, les itérations et les sorties ;
- distinguer les erreurs de syntaxe, d’exécution et de logique ;
- initialiser chaque variable selon son rôle avant de l’utiliser ;
- vérifier qu’une boucle progresse vers une condition d’arrêt ;
- contrôler le type, le format, l’intervalle et les règles métier des données ;
- ne jamais effectuer une opération risquée avant d’avoir validé ses opérandes ;
- documenter chaque test par ses entrées, son résultat attendu, son résultat obtenu et son verdict.
Démarche de validation en cinq étapes
Étape | Action |
|---|---|
| 1. Spécifier | Définir le domaine des entrées et les résultats attendus. |
| 2. Concevoir | Préparer un jeu d’essai couvrant les situations importantes. |
| 3. Exécuter | Faire fonctionner ou tracer l’algorithme pour chaque cas. |
| 4. Comparer | Comparer le résultat obtenu au résultat attendu. |
| 5. Corriger et rejouer | Corriger l’algorithme, puis exécuter de nouveau tous les tests. |
Fiche de test réutilisable
Identifiant | Entrées | Résultat attendu | Résultat obtenu | Verdict |
|---|---|---|---|---|
| T01 | … | … | … | Réussi / Échoué |
| T02 | … | … | … | Réussi / Échoué |
| T03 | … | … | … | Réussi / Échoué |
Travaux dirigés
Exercice 1 — Construire un jeu d’essai
Un algorithme accepte un âge compris entre 0 et 120 inclus. Proposer un jeu d’essai comprenant au moins deux cas normaux, les deux bornes, les valeurs juste en dehors des bornes et une donnée de type incorrect.
Exercice 2 — Tester un tarif de livraison
Les frais sont gratuits à partir de 500 DH, égaux à 30 DH pour un montant compris entre 200 DH inclus et 500 DH exclu, et égaux à 50 DH en dessous de 200 DH. Proposer un jeu d’essai centré sur les seuils.
Exercice 3 — Compléter une table de trace
Tracer l’algorithme suivant pour n = 5 : somme <- 0 ; Pour i allant de 1 à n Faire somme <- somme + 2*i FinPour. Indiquer i, somme avant et somme après chaque itération.
Exercice 4 — Détecter une erreur logique
L’algorithme calcule la moyenne de quatre notes avec l’expression moyenne <- n1 + n2 + n3 + n4 / 4. Expliquer l’erreur, proposer un jeu d’essai qui la met en évidence et corriger l’expression.
Exercice 5 — Corriger une boucle infinie
Analyser : i <- 10 ; TantQue i > 0 Faire Écrire(i) FinTantQue. Identifier l’erreur et proposer une correction qui affiche de 10 à 1.
Exercice 6 — Mauvaise initialisation
Un algorithme veut calculer le produit des entiers de 1 à n, mais initialise produit à 0. Montrer par une trace pour n = 3 pourquoi le résultat est incorrect, puis corriger l’initialisation.
Exercice 7 — Validation d’un choix de menu
Écrire un algorithme qui demande un choix entier compris entre 1 et 5 et répète la saisie tant que le choix n’est pas valide.
Exercice 8 — Validation d’une date simplifiée
Écrire un algorithme qui demande un mois et vérifie qu’il est compris entre 1 et 12. Ajouter ensuite un contrôle simplifié du jour : de 1 à 31.
Exercice 9 — Division contrôlée
Écrire un algorithme qui lit deux réels, contrôle que le second est différent de zéro, puis affiche leur quotient. Préparer quatre tests, dont un avec une première saisie invalide du diviseur.
Exercice 10 — Diagnostic d’erreurs
Pour chacun des cas suivants, indiquer le type d’erreur dominant : parenthèse manquante ; division par zéro ; moyenne calculée avec une formule incorrecte ; compteur non modifié dans TantQue ; maximum initialisé à zéro lorsque toutes les valeurs peuvent être négatives.
Corrigé indicatif des travaux dirigés
Corrigé de l’exercice 1
Donnée | Nature | Résultat attendu |
|---|---|---|
| 25 | Normal | Valide |
| 80 | Normal | Valide |
| 0 | Borne minimale | Valide |
| 120 | Borne maximale | Valide |
| -1 | Sous la borne | Invalide |
| 121 | Au-dessus de la borne | Invalide |
| « vingt » | Type incorrect | Saisie rejetée |
Corrigé de l’exercice 2
Montant | Résultat attendu | Rôle du test |
|---|---|---|
| 199,99 | 50 DH | Juste avant le seuil 200 |
| 200 | 30 DH | Seuil inférieur inclus |
| 499,99 | 30 DH | Juste avant le seuil 500 |
| 500 | 0 DH | Seuil de gratuité |
| 0 | 50 DH ou rejet selon l’énoncé | Cas limite métier à préciser |
| -10 | Montant invalide | Cas incorrect |
Corrigé de l’exercice 3
Itération | i | somme avant | 2 × i | somme après |
|---|---|---|---|---|
| 1 | 1 | 0 | 2 | 2 |
| 2 | 2 | 2 | 4 | 6 |
| 3 | 3 | 6 | 6 | 12 |
| 4 | 4 | 12 | 8 | 20 |
| 5 | 5 | 20 | 10 | 30 |
Corrigé de l’exercice 4
La division est appliquée uniquement à n4. Avec les notes 10, 10, 10 et 10, l’expression incorrecte donne 10 + 10 + 10 + 2,5 = 32,5 au lieu de 10. La correction est : moyenne <- (n1 + n2 + n3 + n4) / 4.
Corrigé de l’exercice 5
La variable i n’est jamais modifiée, donc la condition i > 0 reste toujours vraie.
| i <- 10 TantQue i > 0 Faire Écrire(i) i <- i - 1 FinTantQue |
Corrigé de l’exercice 6
Avec produit = 0, chaque multiplication donne 0 : 0 × 1 = 0, puis 0 × 2 = 0 et 0 × 3 = 0. L’élément neutre de la multiplication est 1 ; il faut donc écrire produit <- 1.
Corrigé de l’exercice 7
| Répéter Écrire("Choisir une option de 1 à 5 :") Lire(choix) Si choix < 1 OU choix > 5 Alors Écrire("Choix invalide.") FinSi Jusqu’à choix >= 1 ET choix <= 5 |
Corrigé de l’exercice 8
| Répéter Lire(mois) Jusqu’à mois >= 1 ET mois <= 12 Répéter Lire(jour) Jusqu’à jour >= 1 ET jour <= 31 |
Ce contrôle reste simplifié : il accepte par exemple le 31 février. Une validation complète doit prendre en compte le nombre de jours de chaque mois et les années bissextiles.
Corrigé de l’exercice 9
| Lire(a) Répéter Lire(b) Si b = 0 Alors Écrire("Le diviseur doit être différent de zéro.") FinSi Jusqu’à b <> 0 Écrire(a / b) |
Exemples de tests : (10, 2) → 5 ; (0, 3) → 0 ; (-9, 3) → -3 ; a = 8 et b saisi successivement 0 puis 4 → message d’erreur puis résultat 2.
Corrigé de l’exercice 10
Situation | Type d’erreur dominant |
|---|---|
| Parenthèse manquante | Erreur de syntaxe |
| Division par zéro | Erreur d’exécution |
| Formule de moyenne incorrecte | Erreur logique |
| Compteur non modifié dans TantQue | Boucle infinie |
| Maximum initialisé à 0 avec des nombres négatifs | Mauvaise initialisation conduisant à une erreur logique |
Glossaire
Terme | Définition |
|---|---|
| Cas de test | Une combinaison précise de données, accompagnée d’un résultat attendu. |
| Jeu d’essai | Un ensemble structuré de cas de test. |
| Cas normal | Une donnée courante située à l’intérieur du domaine valide. |
| Cas limite | Une donnée située sur une borne ou très proche d’une frontière. |
| Cas incorrect | Une donnée qui ne respecte pas les contraintes du problème. |
| Résultat attendu | Le résultat correct déterminé avant l’exécution du test. |
| Table de trace | Un tableau décrivant l’évolution pas à pas des variables et des conditions. |
| Validation | Le contrôle du type, du format, de la valeur et des règles applicables à une donnée. |
| Erreur logique | Une erreur qui produit un résultat incorrect sans empêcher nécessairement l’exécution. |
| Robustesse | Capacité d’un algorithme à gérer correctement les données inhabituelles ou invalides. |
Auto-évaluation
Répondre par « Oui », « Partiellement » ou « Non » aux affirmations suivantes :
Compétence | Oui | Partiellement | Non |
|---|---|---|---|
| Je sais définir un jeu d’essai et un cas de test. | ☐ | ☐ | ☐ |
| Je sais distinguer un cas normal, limite et incorrect. | ☐ | ☐ | ☐ |
| Je sais choisir les valeurs autour d’une borne. | ☐ | ☐ | ☐ |
| Je sais construire une table de trace. | ☐ | ☐ | ☐ |
| Je sais suivre l’évolution d’une variable dans une boucle. | ☐ | ☐ | ☐ |
| Je distingue les erreurs de syntaxe, d’exécution et de logique. | ☐ | ☐ | ☐ |
| Je sais détecter une boucle infinie. | ☐ | ☐ | ☐ |
| Je sais choisir une initialisation adaptée. | ☐ | ☐ | ☐ |
| Je sais valider un intervalle et répéter une saisie. | ☐ | ☐ | ☐ |
| Je sais rédiger une fiche de test complète. | ☐ | ☐ | ☐ |
| Objectif de maîtrise : être capable de justifier les tests choisis et d’expliquer comment chaque test contribue à vérifier la correction ou la robustesse de l’algorithme. |