Adloun

Reprendre racine entiere et la tester par propriété plutôt que par cas

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Mettre au point : choisir les cas qui séparent

Énoncé

Reprendre racine_entiere et la tester par propriété plutôt que par cas : sur à , vérifier l'encadrement . Comparer les mérites de ce test et d'un jeu de dix cas écrits à la main.

Corrigé


echecs = 0
for n in range(0, 10001):
    r = racine_entiere(n)
    if not (r * r <= n < (r + 1) * (r + 1)):
        echecs = echecs + 1
        print("ECHEC pour n =", n, ", r =", r)
print(echecs, "echec(s) sur 10001 valeurs")     # 0 echec(s) sur 10001 valeurs

Ce que ce test a de supérieur. Il ne demande aucune valeur attendue. Écrire dix cas à la main, c'est dix occasions de se tromper dans la réponse — et une réponse fausse écrite à la main fait échouer un code correct, ce qui coûte plus cher qu'un défaut. Il couvre en outre valeurs au lieu de dix, dont tous les carrés parfaits de la plage et leurs voisins immédiats, là où se cachent les erreurs de .

Ce qu'il a d'inférieur. La propriété testée est la postcondition — c'est-à-dire la même chose que l'assertion déjà présente dans la fonction. Si la postcondition était mal écrite, le test la validerait tout aussi mal : on ne teste que ce qu'on a spécifié. Un cas écrit à la main, dont la réponse vient d'ailleurs (du calcul mental, du cours), teste la spécification elle-même.

La conclusion pratique : les deux, et dans cet ordre. Deux ou trois cas à la main pour vérifier qu'on a spécifié la bonne chose (, ), puis un test par propriété sur un large domaine pour chercher les défauts. Le premier valide la spécification, le second le code.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.