Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Pourquoi les tests ne suffisent pas

Après cette leçon: Je peux dire ce qu’un test montre et ce qu’une preuve montre.

Leçon de 45 min5 commandesLab de méthodes formelles : Z3, SPIN, TLA+ et Alloy dans une VM

Que prouve un test qui réussit ?

Les méthodes formelles servent à prouver qu’un programme est correct pour tous les cas, alors qu’un test n’en essaie que quelques-uns. Cette leçon montre pourquoi la différence compte.

Une boutique en ligne offre la livraison dès 50 euros. Le programmeur écrit total > 50. Deux tests réussissent, avec 20 et 80 euros. Pourtant un client qui paie exactement 50 euros se voit facturer la livraison. Aucun test n’avait essayé ce cas.

À la fin de cette leçon

Remarque

Je peux dire ce qu’un test montre et ce qu’une preuve montre.

Mots-clés

MotCe que ça veut direExemple
Testun essai du programme sur quelques valeurs choisies
Casune valeur d’entrée possibleun panier de 50 euros
Preuveun raisonnement qui vaut pour tous les cas
Contre-exempleun cas qui montre qu’une affirmation est fausse
Propriétéune règle que le programme doit toujours respecter
Méthode formelleune méthode où une machine vérifie une propriété sur tous les cas

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un test n’essaie que les cas choisis

Un test lance le programme sur des valeurs choisies et compare le résultat à celui qu’on attend. Si les deux sont égaux, le test réussit.

Il dit seulement que ces valeurs-là marchent. Il ne dit rien des autres. La commande compare le code (> 50) à la règle (>= 50) pour 20 puis 80 euros. Elle affiche 1 deux fois : les deux sont d’accord.

Deux tests qui réussissent

Commande
awk 'BEGIN { print (20 > 50) == (20 >= 50), (80 > 50) == (80 >= 50) }'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Essayer tous les cas trouve la faille

Ici le panier va de 0 à 100 euros : seulement 101 cas. On peut donc tous les essayer, un par un.

La commande suivante parcourt les 101 montants. Elle affiche chaque montant où le code et la règle ne sont pas d’accord.

Chercher les montants où ils diffèrent

Commande
seq 0 100 | awk '{ if (($1 > 50) != ($1 >= 50)) print "ecart pour", $1 }'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : cinq montants

Panier (euros)Code : total > 50Règle : total >= 50Même réponse ?
20livraison payantelivraison payanteoui
49livraison payantelivraison payanteoui
50livraison payantelivraison offertenon : contre-exemple
51livraison offertelivraison offerteoui
80livraison offertelivraison offerteoui

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une preuve parle de tous les cas

Une preuve porte sur tous les cas à la fois. Quand les cas sont peu nombreux, les essayer tous est déjà une preuve.

La commande compte les montants où le code se trompe, parmi les 101. Elle trouve un seul cas. Un test aurait pu l’oublier. La vérification complète, jamais.

Compter les cas où le code se trompe

Commande
seq 0 100 | awk '{ if (($1 > 50) != ($1 >= 50)) n++ } END { print n, "cas sur", NR }'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Parfois, il y a trop de cas

Un nombre sur 64 bits peut prendre 2 puissance 64 valeurs. Les essayer toutes est impossible en pratique.

La première commande affiche ce nombre de valeurs. La seconde calcule combien d’années il faudrait, à un milliard d’essais par seconde.

Le nombre de valeurs sur 64 bits

Commande
python3 -c "print(2 ** 64)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le temps pour toutes les essayer

Commande
python3 -c "print(2 ** 64 // 10 ** 9 // (3600 * 24 * 365))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Erreur fréquente

Attention

Beaucoup de gens pensent que mille tests réussis prouvent qu’un programme est juste. Mille tests prouvent seulement que ces mille cas marchent. Pour une valeur jamais essayée, rien n’est dit. Une preuve, ou un contre-exemple, parle de tous les cas.

Pour aller plus loin

Changez la règle : la livraison est offerte dès 60 euros, et le code écrit > 60. Refaites la commande qui cherche les écarts.

Elle affiche un seul montant. Cherchez lequel avant de lancer la commande, puis dites pourquoi ce montant est celui où un test oublie de regarder.

À propos de ce labo et de sa source: Lab de méthodes formelles : Z3, SPIN, TLA+ et Alloy dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.