<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Tests et débogage</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Tester un programme : assertions, jeux d'essais,<br/>
tests unitaires, cas limites. Déboguer : lecture de<br/>
la trace d'erreurs, instructions print de<br/>
débogage, débogueur interactif, isolement de bugs,<br/>
réduction au cas minimal.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q01 : Notion de test</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>test</strong> dans le<br/>
contexte du logiciel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à<br/>
tester systématiquement ses<br/>
fonctions, en particulier dans les<br/>
parties critiques du programme. Un<br/>
projet sans tests est très<br/>
fragile.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un type particulier de variable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un test n'est pas une variable.<br/>
C'est une procédure de<br/>
vérification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une vérification automatique du comportement attendu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un test fournit une entrée connue<br/>
et compare la sortie obtenue à la<br/>
sortie attendue. Cela permet de<br/>
détecter aussi bien les<br/>
régressions que les bugs<br/>
nouveaux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un avertissement émis par le langage Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un avertissement est un message<br/>
envoyé pendant l'exécution, sans<br/>
comparaison à une valeur attendue.<br/>
Ce n'est pas un test.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une question à choix multiple posée à l'utilisateur final</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale est<br/>
sans rapport avec la notion<br/>
informatique de test logiciel,<br/>
qui vise à vérifier le bon<br/>
fonctionnement d'un programme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q02 : Instruction assert</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'instruction assert<br/>
condition en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un usage typique :<br/>
assert n &gt; 0, "n doit être<br/>
positif". Le message après la<br/>
virgule apparaît dans l'erreur<br/>
affichée, ce qui aide au<br/>
débogage.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle affiche la condition à l'écran</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'instruction assert n'affiche<br/>
rien lorsque la condition est<br/>
vraie. Elle ne lève une erreur<br/>
que dans le cas contraire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle convertit la condition en une valeur booléenne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La condition est déjà évaluée<br/>
comme un booléen avant l'appel à<br/>
assert. La conversion en tant<br/>
que telle se fait avec<br/>
bool(...).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle ne fonctionne qu'en mode débogage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description est inexacte. Les assertions sont vérifiées lors<br/>
d'une exécution ordinaire du programme, pas seulement pendant une<br/>
phase de mise au point.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Si la condition est fausse, elle lève une AssertionError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est très utile pour vérifier<br/>
des invariants. Lorsqu'une<br/>
assertion échoue, le programme<br/>
s'arrête, ce qui permet de<br/>
détecter les bugs au plus tôt.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q03 : Ce que vérifie un test de fonction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Élise écrit des assertions qui appellent uniquement sa fonction<br/>
moyenne, sur quelques listes choisies à l'avance. Que vérifient<br/>
ces tests ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tester chaque fonction séparément, sur des cas bien choisis (liste<br/>
d'un seul élément, valeurs égales, etc.), permet de localiser<br/>
rapidement un bug. Ces tests ne prouvent pas la correction : ils<br/>
augmentent la confiance.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le comportement de moyenne seule, sur les cas choisis</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tester une fonction isolément permet de savoir<br/>
précisément laquelle se comporte mal quand un test échoue. Les<br/>
tests restent limités aux cas choisis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que moyenne est correcte pour toutes les listes possibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un jeu de tests ne vérifie que les cas écrits. Son succès<br/>
ne garantit pas que la fonction est correcte pour toutes les<br/>
listes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La vitesse d'exécution de la fonction moyenne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une assertion compare des valeurs, elle ne mesure aucune<br/>
durée. Ces tests portent sur les résultats renvoyés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le fonctionnement du programme entier qui utilise moyenne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces assertions n'appellent que moyenne. Le reste du<br/>
programme n'est pas exécuté, il faudrait d'autres tests pour le<br/>
vérifier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q04 : Exemple de test</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle ligne <strong>teste</strong> que carre(3)<br/>
== 9 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'instruction assert est rapide à écrire et lisible. On peut<br/>
ajouter après la condition un message affiché en cas d'échec :<br/>
assert carre(3) == 9, "carre(3) devrait valoir 9".</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>test carre(3) == 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe n'existe pas en<br/>
Python. Le mot-clé test<br/>
n'est pas reconnu par le<br/>
langage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>assert carre(3) == 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Si carre(3) ne vaut pas 9,<br/>
l'assertion échoue et le<br/>
programme s'arrête. Sinon, le<br/>
programme continue<br/>
silencieusement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>if carre(3) != 9: print("erreur")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette ligne effectue bien une<br/>
vérification, mais elle<br/>
n'interrompt pas le programme<br/>
en cas d'échec. L'instruction<br/>
assert est plus idiomatique<br/>
dans un contexte de test.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>carre(3)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette ligne exécute simplement<br/>
la fonction sans rien vérifier.<br/>
Aucune comparaison n'est<br/>
effectuée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q05 : Erreur Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quand Python lève une <strong>erreur</strong>, où<br/>
regarder pour comprendre ce qui se<br/>
passe ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques erreurs fréquentes :<br/>
NameError (variable inconnue),<br/>
TypeError (incompatibilité de<br/>
types), IndexError (indice hors<br/>
des bornes), ValueError (valeur<br/>
inappropriée pour une opération).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les paramètres de configuration du système d'exploitation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La trace d'erreur Python est<br/>
locale au programme. Le<br/>
système d'exploitation n'est<br/>
pas concerné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sur Internet, en cherchant un message proche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette démarche peut compléter<br/>
l'analyse, mais ce n'est pas<br/>
la première chose à faire. Il<br/>
faut commencer par la trace<br/>
d'erreur affichée par Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La trace d'erreur, qui indique le fichier et la ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On lit la trace d'erreur du bas<br/>
vers le haut. La dernière ligne<br/>
donne en général le type<br/>
d'erreur et le message<br/>
associé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code source du module Python lui-même</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait à faire en dernier<br/>
recours. La plupart du temps,<br/>
l'erreur vient du code<br/>
utilisateur, pas de<br/>
l'interpréteur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q06 : Instruction print de débogage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert un appel à print dans<br/>
un objectif de <strong>débogage</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages : la fonction print est simple et fonctionne partout.<br/>
Inconvénient : il faut penser à retirer ces affichages après le<br/>
débogage.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À empêcher d'écrire d'autres lignes de code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description ne correspond<br/>
à aucun usage réel de print.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À ralentir intentionnellement le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un excès de print peut<br/>
effectivement ralentir un<br/>
programme, mais ce n'est jamais<br/>
l'objectif recherché.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>À afficher la valeur d'une variable à un moment précis</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une technique simple mais efficace. Pour suivre la valeur de<br/>
x à l'intérieur d'une boucle, on peut écrire print("x =", x).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À encoder automatiquement des données en hexadécimal</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction print ne réalise<br/>
aucune conversion automatique<br/>
en hexadécimal.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q07 : Notion de bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>bug</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Il faut distinguer plusieurs<br/>
notions : un <strong>bug</strong> signifie<br/>
que le code ne fait pas ce qu'il<br/>
doit ; une <strong>erreur d'exécution</strong><br/>
survient quand le programme<br/>
plante ; une <strong>erreur de spécification</strong> signifie que la<br/>
définition même du<br/>
comportement attendu est<br/>
incorrecte. Cette dernière est<br/>
la plus difficile à corriger.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonctionnalité que l'utilisateur final n'a pas demandée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description est une<br/>
plaisanterie courante (« ce<br/>
n'est pas un bug, c'est une<br/>
fonctionnalité »), mais elle<br/>
ne correspond pas à la<br/>
définition technique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un type particulier de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un bug n'a aucun rapport avec<br/>
la mémoire d'un ordinateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un comportement non conforme aux spécifications</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le terme est historique : il<br/>
provient d'un véritable insecte<br/>
retrouvé en 1947 dans les<br/>
relais d'une machine analysée<br/>
par Grace Hopper. La trace de<br/>
cet incident est encore<br/>
conservée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une nouvelle version d'un logiciel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une nouvelle version peut<br/>
comporter des bugs, mais elle<br/>
n'est pas elle-même un bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q08 : Jeu d'essais</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>jeu d'essais</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un bon jeu d'essais détecte les<br/>
régressions. Si l'on modifie le<br/>
code et que tous les tests<br/>
continuent à passer, on peut<br/>
avoir confiance. Si un test<br/>
échoue, on sait précisément quoi<br/>
corriger.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Des entrées prévues avec leur sortie attendue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un bon jeu d'essais couvre les<br/>
cas normaux, les cas limites<br/>
(par exemple liste vide, liste<br/>
d'un seul élément, valeurs<br/>
extrêmes) et les cas d'erreur<br/>
(entrée invalide). Plus la<br/>
couverture est large, plus le<br/>
test est robuste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un manuel complet d'utilisation du programme et de ses options</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La documentation et les jeux<br/>
d'essais sont deux notions<br/>
distinctes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une collection de jeux vidéo</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale<br/>
du mot « jeu » est sans<br/>
rapport avec son sens<br/>
informatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un test choisi au hasard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un jeu d'essais est conçu de<br/>
manière réfléchie, et non tiré<br/>
au hasard.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q09 : Lire une trace d'erreur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code><br/>
File "main.py", line 5, in &lt;module&gt;<br/>
    print(liste[5])<br/>
IndexError: list index out of range<br/>
</code>`<br/>
Que dit cette trace d'erreur ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le réflexe à acquérir : lire le<br/>
<strong>type</strong> de l'erreur (qui donne<br/>
la nature du bug), puis la<br/>
<strong>ligne</strong> indiquée (qui en<br/>
donne l'emplacement). C'est<br/>
systématique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun problème n'est signalé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La trace contient bien une<br/>
erreur, indiquée par<br/>
IndexError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La ligne 5 contient une variable non définie ailleurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description correspond à<br/>
une NameError, et non à une<br/>
IndexError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il s'agit d'une erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une erreur de syntaxe se<br/>
présente sous la forme d'une<br/>
SyntaxError, et non d'une<br/>
IndexError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On accède à liste[5], un indice qui n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le message<br/>
IndexError: list index out of<br/>
range signifie un accès à un<br/>
indice hors des bornes. La<br/>
cause typique est une mauvaise<br/>
estimation de la taille de la<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q10 : Isoler un bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour comprendre l'origine d'un bug<br/>
dans un programme, quelle démarche<br/>
est la plus efficace en première<br/>
approche ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La discipline du cas de test<br/>
minimal est l'une des bases du<br/>
débogage. Elle permet aussi<br/>
d'écrire un test de non-régression<br/>
compact, qui protégera contre la<br/>
réapparition du bug à l'avenir.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Réduire l'entrée au cas le plus simple qui reproduit le bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'idée du cas de test<br/>
minimal. Si un programme plante<br/>
sur une liste de mille<br/>
éléments, essayer d'abord avec<br/>
dix, puis avec cinq, puis avec<br/>
deux, en gardant à chaque fois<br/>
la propriété qui fait planter.<br/>
On obtient un exemple court qui<br/>
aide à localiser le bug et à<br/>
écrire un test de régression.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réécrire l'intégralité du programme depuis zéro</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette démarche est risquée et<br/>
peu économique. Elle introduit<br/>
souvent de nouveaux bugs sans<br/>
comprendre l'origine du bug<br/>
initial.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ignorer le bug s'il n'apparaît qu'à l'occasion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un bug intermittent, surtout,<br/>
ne s'efface pas en l'ignorant.<br/>
Il finit par réapparaître au<br/>
plus mauvais moment. Au<br/>
contraire, il faut chercher<br/>
activement à le reproduire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Multiplier la taille de l'entrée jusqu'à trouver une régularité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'inverse de la démarche<br/>
utile. Plus l'entrée est<br/>
grande, plus il est difficile<br/>
d'identifier ce qui déclenche<br/>
précisément le bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q13 : Identifier un bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
def somme(liste):<br/>
    total = 0<br/>
    for i in range(1, len(liste)):<br/>
        total += liste[i]<br/>
    return total<br/>
</code>`<br/>
Quel <strong>bug</strong> contient cette fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les bugs de décalage d'indice<br/>
sont très fréquents. Il faut<br/>
toujours tester avec des listes<br/>
simples ([], [1],<br/>
[1, 2]) pour les détecter.<br/>
Un bon test serait par exemple<br/>
assert somme([1, 2, 3]) == 6.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La syntaxe de range est incorrecte avec deux arguments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(1, n) est valide (début<br/>
inclus, fin exclue). Le code s'exécute<br/>
sans erreur, le bug est purement logique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun bug, la fonction additionne bien tous les éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour [1, 2, 3], la fonction<br/>
renvoie 5 et non 6. Le premier élément<br/>
n'est jamais ajouté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction ne renvoie jamais la moindre valeur utile</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction se termine bien<br/>
par return total, donc<br/>
elle renvoie une valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le premier élément, liste[0], n'est jamais ajouté</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle commence à<br/>
l'indice 1 au lieu de 0. C'est un bug<br/>
classique de <strong>décalage d'indice</strong>. Pour<br/>
la liste [1, 2, 3], la<br/>
fonction renvoie 5 au lieu<br/>
de 6. Un test sur un cas<br/>
simple permettrait de le<br/>
détecter.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q14 : Lire la trace d'erreur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une trace d'erreur à plusieurs<br/>
niveaux, où trouve-t-on en général<br/>
la <strong>cause initiale</strong> du bug ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour lire une trace : commencer<br/>
par la fin, qui indique le type<br/>
d'erreur, puis remonter<br/>
jusqu'au code qu'on a soi-même<br/>
écrit. Les premières lignes,<br/>
souvent dans des bibliothèques,<br/>
sont rarement le bon point<br/>
d'entrée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En haut de la trace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est plutôt l'inverse. Le<br/>
message d'erreur le plus<br/>
précis se trouve en bas de<br/>
la trace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Au hasard dans la trace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La position du message<br/>
d'erreur n'a rien d'aléatoire :<br/>
il se trouve toujours à la<br/>
fin de la trace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La dernière ligne (en bas), avec le type d'erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python affiche la pile des<br/>
appels de fonctions dans<br/>
l'ordre chronologique, et le<br/>
message d'erreur tout en<br/>
bas. La ligne la plus utile<br/>
est généralement celle qui<br/>
renvoie à votre propre code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quelque part au milieu de la trace d'erreur affichée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune position particulière<br/>
au milieu n'est privilégiée.<br/>
La cause initiale se lit en<br/>
bas de la trace.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q15 : Reproduire un bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour résoudre un bug, qu'est-ce qui<br/>
est <strong>essentiel</strong> à faire en<br/>
premier ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'adage classique est :<br/>
« si l'on ne peut pas<br/>
reproduire le bug, on ne peut<br/>
pas le corriger ». Une fois la<br/>
reproduction obtenue, on peut<br/>
réduire l'entrée au cas minimal<br/>
qui déclenche encore le bug,<br/>
puis corriger.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le reproduire avec une entrée minimale fiable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un bug intermittent est très<br/>
difficile à corriger. La<br/>
reproduction est la première<br/>
étape, et permet d'écrire un<br/>
<strong>test de régression</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Demander à un collègue de regarder le code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cela peut aider dans un<br/>
second temps, mais ni un<br/>
humain ni un assistant<br/>
automatique ne peuvent<br/>
diagnostiquer un bug sans<br/>
pouvoir le reproduire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réécrire le code suspect</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La réécriture n'est pas la<br/>
première étape. Il faut<br/>
d'abord pouvoir observer le<br/>
bug pour pouvoir vérifier<br/>
ensuite la correction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réinstaller l'interpréteur Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette opération est rarement<br/>
nécessaire. La cause d'un<br/>
bug se trouve presque<br/>
toujours dans le code lui-même.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q16 : Débogueur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>débogueur</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un débogueur permet d'arrêter le programme sur une ligne choisie,<br/>
de l'exécuter ensuite instruction par instruction et d'observer à<br/>
chaque étape la valeur des variables, sans modifier le code.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un antivirus qui détecte les programmes malveillants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un antivirus protège contre<br/>
les logiciels malveillants ;<br/>
il n'a rien à voir avec le<br/>
débogage de programmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un compilateur qui traduit le code source en exécutable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un compilateur transforme du<br/>
code source en code<br/>
exécutable. Il n'a aucun<br/>
rapport avec le débogage<br/>
interactif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un outil qui exécute pas à pas et montre les variables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on avance ligne par ligne et on inspecte l'état du<br/>
programme. Les environnements de programmation en proposent<br/>
souvent un, très utile pour comprendre un bug.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un fichier de journalisation des erreurs du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un débogueur est un outil<br/>
interactif, et non un fichier<br/>
stocké sur le disque.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q17 : Une assertion en tête de fonction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
def moyenne(notes):<br/>
    assert len(notes) &gt; 0<br/>
    total = 0<br/>
    for n in notes:<br/>
        total = total + n<br/>
    return total / len(notes)<br/>
</code>`<br/>
Quel est le rôle de l'assertion placée au début de la fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une précondition décrit ce que la fonction attend de ses arguments ;<br/>
une postcondition décrit ce qu'elle garantit sur son résultat. Une<br/>
assertion placée en tête de fonction vérifie la précondition à<br/>
chaque appel.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Vérifier une postcondition sur la valeur renvoyée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une postcondition porte sur le résultat, après le calcul.<br/>
Cette assertion est vérifiée au début, sur l'argument notes,<br/>
avant que la moyenne soit calculée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Faire renvoyer 0 à la fonction quand la liste est vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une assertion ne renvoie aucune valeur. Si la condition<br/>
est fausse, elle arrête le programme avec une AssertionError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Afficher un avertissement puis poursuivre le calcul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une assertion n'affiche rien quand la condition est<br/>
vraie, et arrête le programme quand elle est fausse. Le calcul ne<br/>
se poursuit pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Vérifier une précondition : la liste reçue n'est pas vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'assertion porte sur l'argument, avant tout<br/>
calcul. Si on appelle moyenne([]), le programme s'arrête avec<br/>
une AssertionError au lieu d'effectuer une division par zéro.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q18 : Garder le test qui a révélé un bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Nour a corrigé sa fonction remise, dont le bug avait été révélé<br/>
par l'assertion assert remise(100) == 90. Que faire de cette<br/>
assertion maintenant que le test passe ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un jeu de tests s'enrichit au fil de la mise au point : chaque bug<br/>
corrigé laisse derrière lui un test qui l'aurait détecté. La qualité<br/>
et le nombre des tests comptent autant que leur succès.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La remplacer par print(remise(100))</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un affichage ne vérifie rien automatiquement. Il faudrait<br/>
relire la valeur à chaque exécution pour repérer une erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La réécrire avec la valeur que renvoie la fonction aujourd'hui</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un test compare le résultat à la valeur attendue d'après<br/>
la spécification, pas à ce que renvoie le code actuel. Sinon il<br/>
passerait même si la fonction était fausse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La supprimer, puisque le bug est corrigé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une modification ultérieure du code pourrait réintroduire<br/>
le bug. Sans ce test, rien ne permettrait de s'en apercevoir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La garder dans le jeu de tests</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce cas a déjà mis un bug en évidence. Le conserver<br/>
permet de détecter immédiatement le retour de ce bug après une<br/>
future modification.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q20 : Écrire les tests avant le code</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est l'avantage principal de la démarche qui consiste à écrire<br/>
les tests <strong>avant</strong> le code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Écrire d'abord les tests oblige à fixer les résultats attendus, y<br/>
compris sur les cas limites comme une liste vide : c'est une<br/>
spécification précise que le code devra respecter. Le succès des<br/>
tests ne garantit pas pour autant la correction du programme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle permet d'éviter complètement les bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est trop<br/>
optimiste. Aucune méthode<br/>
ne supprime tous les bugs.<br/>
Les tests réduisent leur<br/>
fréquence et facilitent<br/>
leur détection précoce.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle dispense totalement d'avoir à écrire des commentaires</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun rapport. Les<br/>
commentaires gardent leur<br/>
utilité pour expliquer<br/>
les intentions et les<br/>
choix de conception.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code est plus rapide à écrire dès le départ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette approche n'est pas<br/>
plus rapide au démarrage,<br/>
et exige même un certain<br/>
temps d'apprentissage. Son<br/>
intérêt se mesure surtout<br/>
à moyen terme, sur la<br/>
qualité et la fiabilité<br/>
du code produit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle force à clarifier la spécification avant de coder</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On écrit la spécification<br/>
sous une forme exécutable<br/>
(le test), ce qui contraint<br/>
à réfléchir précisément<br/>
aux comportements attendus<br/>
avant de coder.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q21 : Bug intermittent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un bug se produit <strong>parfois</strong>,<br/>
sans que l'on sache prévoir<br/>
quand. Que faire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Causes fréquentes d'un bug intermittent : une valeur tirée au<br/>
hasard avec le module random, une saisie de l'utilisateur, le<br/>
contenu d'un fichier lu. Une fois le cas fautif retrouvé, on<br/>
l'ajoute au jeu de tests.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ignorer le bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une mauvaise pratique.<br/>
Un bug ignoré finit<br/>
toujours par revenir, et<br/>
souvent au pire moment.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Relancer le programme jusqu'à ce que le bug ne se produise plus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : si le bug ne se<br/>
manifeste pas lors d'une<br/>
exécution donnée, il n'a pas<br/>
disparu pour autant. Sans<br/>
diagnostic de la cause, il<br/>
finira par resurgir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Relever les données de chaque exécution pour le reproduire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un bug qui ne se produit que parfois dépend souvent d'une donnée<br/>
qui change d'une exécution à l'autre, comme un tirage au hasard ou<br/>
une saisie. En notant ces données, on retrouve le cas qui déclenche<br/>
le bug et on peut le reproduire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ralentir l'exécution avec des appels à time.sleep()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ralentir le programme ne change pas les données qu'il<br/>
traite. Si le bug dépend d'une valeur tirée au hasard ou saisie, il<br/>
reste présent et resurgira.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q22 : Stratégie globale</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Devant un bug, quelle est la<br/>
<strong>bonne stratégie</strong> générale à<br/>
adopter ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Discipline : ne jamais<br/>
corriger un bug sans avoir<br/>
réussi à le reproduire, et<br/>
ne jamais corriger sans<br/>
ajouter ensuite un test de<br/>
régression. Sinon, le bug<br/>
finira par réapparaître,<br/>
et le temps gagné au<br/>
départ sera perdu plus<br/>
tard.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Demander une mise à jour du langage Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une telle mise à jour est<br/>
extrêmement rarement la<br/>
solution à un bug<br/>
applicatif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Reproduire, isoler, corriger, puis ajouter un test</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une méthodologie<br/>
éprouvée. Sauter une étape,<br/>
en particulier la dernière,<br/>
garantit que le bug<br/>
finira par réapparaître.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réécrire intégralement le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette démarche est risquée :<br/>
elle peut introduire de<br/>
nouveaux bugs et masque<br/>
l'origine du problème<br/>
initial.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Désactiver les tests existants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette démarche est<br/>
contre-productive. Les<br/>
tests sont précisément<br/>
l'outil principal pour<br/>
détecter et corriger les<br/>
bugs.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q23 : Test mal écrit</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le problème avec ce<br/>
test ?<br/>
`<code>python<br/>
assert chercher([1, 2, 3], 2)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Piège des tests laxistes :<br/>
ils passent quand ils ne<br/>
devraient pas, et laissent<br/>
passer des bugs. Il faut<br/>
toujours <strong>vérifier des valeurs précises</strong>, et non<br/>
simplement l'absence<br/>
d'erreur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction chercher n'existe peut-être pas encore</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On suppose que la fonction<br/>
existe et est définie<br/>
quelque part dans le code.<br/>
Le problème ne tient pas<br/>
à son existence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La syntaxe de assert est invalide sans message d'erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le message après la virgule est<br/>
facultatif, assert expression seul est<br/>
valide. Le défaut est sémantique : le test<br/>
n'est pas assez précis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun problème, le test vérifie que 2 est trouvé à l'indice 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le test ne compare jamais la<br/>
valeur renvoyée à 1. Il passe pour tout<br/>
résultat « vrai », par exemple 2 ou True.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il vérifie seulement que le résultat est « vrai »</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce test est trop laxiste.<br/>
Tout résultat vrai au sens booléen (1, 2,<br/>
True...) le fait passer, indice faux<br/>
compris. On préfère écrire<br/>
assert chercher([1, 2, 3],<br/>
2) == 1, qui vérifie<br/>
précisément la valeur<br/>
renvoyée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q24 : Tests et débogage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la<br/>
<strong>complémentarité</strong> entre tests<br/>
et débogage ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une démarche idéale combine<br/>
les deux activités : on<br/>
écrit d'abord des tests qui<br/>
trouvent un bug ; on<br/>
débogue ensuite pour<br/>
localiser, comprendre et<br/>
corriger ; on ajoute enfin<br/>
un test de régression pour<br/>
empêcher la résurgence du<br/>
bug.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux activités sont identiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ces activités diffèrent<br/>
par leur objectif et leur<br/>
déroulement, comme<br/>
expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le débogage permet d'éviter complètement d'écrire des tests</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'inverse : un bon<br/>
ensemble de tests permet<br/>
de détecter rapidement un<br/>
bug et de réduire le<br/>
temps passé à le déboguer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les tests trouvent les bugs, le débogage les corrige</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont deux phases<br/>
distinctes mais<br/>
complémentaires. Tester,<br/>
c'est investir pour<br/>
détecter ; déboguer, c'est<br/>
investiguer pour corriger.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'une remplace l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ces activités sont<br/>
complémentaires : ni les<br/>
tests ni le débogage ne<br/>
peuvent se passer l'un de<br/>
l'autre dans un projet<br/>
sérieux.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes<br/>
sur les tests et le débogage,<br/>
laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Citation d'Edsger Dijkstra :<br/>
« Program testing can be<br/>
used to show the presence of<br/>
bugs, but never to show<br/>
their absence. » Pour<br/>
garantir formellement<br/>
l'absence de bugs, il<br/>
faudrait recourir à une<br/>
preuve mathématique, ce qui<br/>
reste rarement praticable<br/>
sur du code réel.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La trace d'erreur indique le type d'erreur et la ligne où elle s'est produite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même son<br/>
rôle principal.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les tests garantissent l'absence de bugs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
fausse (donc c'est la<br/>
bonne réponse). Les<br/>
tests révèlent la<br/>
<strong>présence</strong> de bugs sur<br/>
les cas effectivement<br/>
testés, mais ils ne<br/>
peuvent jamais prouver<br/>
l'<strong>absence</strong> de bugs sur<br/>
des entrées non testées.<br/>
Edsger Dijkstra a résumé<br/>
cela par : « Tester ne<br/>
peut prouver l'absence<br/>
de bugs ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un test unitaire vérifie une seule fonction de manière isolée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même la<br/>
définition d'un test<br/>
unitaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réduire l'entrée problématique au cas le plus simple qui reproduit le bug aide à localiser sa cause</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est l'une des<br/>
techniques de base pour<br/>
isoler un bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q26 : Trois familles d'erreurs</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On distingue habituellement les<br/>
erreurs de <strong>syntaxe</strong>, les<br/>
erreurs <strong>d'exécution</strong> et les<br/>
erreurs <strong>sémantiques</strong> (ou<br/>
logiques). Quelle catégorie est<br/>
la plus difficile à détecter<br/>
automatiquement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémorable : « ce qui ne<br/>
compile pas, ne s'exécute<br/>
pas ; ce qui s'exécute peut<br/>
planter ; ce qui ne plante<br/>
pas peut quand même être<br/>
faux ». Les tests servent<br/>
surtout à détecter la<br/>
troisième catégorie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les erreurs d'exécution, car le programme s'arrête en cours de route</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces erreurs sont<br/>
aussi facilement repérables.<br/>
Le programme s'arrête en<br/>
levant une exception, avec<br/>
une trace d'erreur précise<br/>
(IndexError,<br/>
ZeroDivisionError, etc.).<br/>
On voit immédiatement où<br/>
chercher.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les erreurs sémantiques, le programme tourne mais est faux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est le bug<br/>
le plus pernicieux. Aucun<br/>
message d'erreur, juste un<br/>
résultat faux. Seuls des<br/>
tests bien choisis ou une<br/>
relecture attentive<br/>
permettent de le détecter.<br/>
Exemple : une boucle qui<br/>
commence à l'indice 1 au<br/>
lieu de 0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les trois catégories d'erreurs sont équivalentes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces trois<br/>
catégories diffèrent<br/>
radicalement par leur mode<br/>
de détection. La syntaxe est<br/>
détectée par l'analyseur<br/>
syntaxique, l'exécution par<br/>
l'interpréteur, la sémantique<br/>
uniquement par les tests ou<br/>
la relecture humaine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les erreurs de syntaxe, car elles cassent toute l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces erreurs sont au<br/>
contraire les <strong>plus faciles</strong> à détecter. Python<br/>
refuse de lancer le programme<br/>
et affiche immédiatement<br/>
SyntaxError, avec le<br/>
numéro de ligne. Aucune<br/>
mystère.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q27 : Plusieurs cas dans un test</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment écrire un test qui<br/>
vérifie le comportement d'une<br/>
fonction carre sur <strong>plusieurs entrées</strong> sans dupliquer le code<br/>
?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général : une liste de couples (entrée, sortie attendue),<br/>
parcourue dans une boucle qui vérifie chaque cas avec assert.<br/>
Ajouter un cas ne demande qu'un couple de plus dans la liste.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def test_carre():<br/>
    return carre(0) and carre(1) and carre(3)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne vérifie<br/>
pas que les valeurs<br/>
renvoyées sont<br/>
<strong>correctes</strong>. Il vérifie<br/>
seulement qu'aucune n'est<br/>
fausse au sens booléen.<br/>
Comme carre(0) == 0,<br/>
l'expression renvoie 0<br/>
(faux) sans que cela<br/>
signale un bug.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def test_carre():<br/>
    assert carre(0) == 0<br/>
    assert carre(1) == 1<br/>
    assert carre(3) == 9<br/>
    assert carre(-2) == 4<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette version fonctionne<br/>
aussi, mais elle répète la<br/>
même logique de test à<br/>
chaque ligne, ce que<br/>
l'énoncé demandait<br/>
précisément d'éviter. La<br/>
version paramétrée factorise<br/>
ce schéma et indique, en cas<br/>
d'échec, la valeur fautive.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def test_carre():<br/>
    for x, attendu in [(0, 0), (1, 1), (3, 9), (-2, 4)]:<br/>
        assert carre(x), attendu<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la virgule n'est pas une<br/>
comparaison. assert carre(x), attendu<br/>
vérifie seulement que carre(x) est vrai<br/>
et utilise attendu comme message<br/>
d'échec : le test échoue pour x = 0 (car 0<br/>
est faux) et ne compare jamais la valeur<br/>
renvoyée à la valeur attendue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def test_carre():<br/>
    for x, attendu in [(0, 0), (1, 1), (3, 9), (-2, 4)]:<br/>
        assert carre(x) == attendu, "échec pour x = " + str(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parcourt une liste de couples<br/>
(entrée, sortie attendue) et on vérifie chaque cas avec assert.<br/>
Le message après la virgule indique précisément quel cas a échoué,<br/>
ce qui facilite le débogage.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q28 : Tester un résultat flottant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le test assert moyenne([0.1, 0.2]) == 0.15 échoue alors que la<br/>
fonction semble correcte. Comment écrire ce test correctement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comparer des flottants demande une tolérance : abs(a - b) &lt; eps<br/>
est le schéma à retenir.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>assert round(moyenne([0.1, 0.2])) == 0.15</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : round sans précision arrondit à l'entier, le test<br/>
échouerait toujours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>assert abs(moyenne([0.1, 0.2]) - 0.15) &lt; 1e-9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les flottants ne sont pas exacts ; on vérifie<br/>
que l'écart avec la valeur attendue est négligeable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En supprimant ce test, les flottants ne se testant pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les calculs flottants se testent, avec une tolérance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>assert moyenne([0.1, 0.2]) == 0.15000000000000002</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : recopier la valeur affichée rend le test fragile et<br/>
incompréhensible.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q29 : Regrouper les tests d'une fonction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi écrire les assertions qui testent moyenne dans une<br/>
fonction test_moyenne() plutôt qu'en vrac dans le programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Des tests regroupés et nommés forment une batterie réutilisable :<br/>
un appel, un verdict.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour que les tests s'exécutent plus vite, en bloc</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la vitesse est la même ; c'est l'organisation qui<br/>
change.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que assert n'est autorisé que dans une fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : assert s'écrit n'importe où.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour cacher les tests aux utilisateurs du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les tests ne sont pas secrets, ils documentent même<br/>
l'usage attendu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour relancer tous les tests d'un seul appel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction de test se rappelle après chaque<br/>
changement de code, ce qui détecte aussitôt une régression.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q30 : Une fonction difficile à tester</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction calcul(a, b) affiche le résultat avec print au lieu<br/>
de le renvoyer. Pourquoi est-elle difficile à tester avec assert ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Séparer le calcul de l'affichage est une règle de conception :<br/>
les fonctions qui renvoient se testent, celles qui affichent non.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'elle ne renvoie rien à comparer, l'affichage n'étant pas une valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : assert calcul(2, 3) == 5 compare None à<br/>
5. Renvoyer le résultat, et l'afficher ailleurs, rend la<br/>
fonction testable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'une fonction avec print ne peut pas être appelée dans un test</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle peut être appelée, mais son résultat n'est pas<br/>
récupérable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que print est plus lent qu'un return</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la vitesse n'est pas en cause.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les tests n'acceptent que des fonctions à un paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nombre de paramètres n'a aucune importance.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q31 : Combien de tests écrire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La spécification de tarif(age) distingue trois cas : moins de<br/>
12 ans, de 12 à 17 ans, 18 ans et plus. Combien de tests<br/>
écrire au minimum ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le jeu de tests se déduit de la spécification : chaque cas, chaque<br/>
frontière.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un seul, avec une valeur quelconque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul test laisse deux cas sans vérification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cent, pour être sûr de couvrir tous les âges</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nombre ne fait pas la qualité ; ce sont les cas<br/>
couverts qui comptent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Au moins un par cas, plus un à chaque frontière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois cas appellent trois tests, et les valeurs<br/>
12 et 18 méritent chacune un test supplémentaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, la spécification suffisant à garantir le code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la spécification dit ce qui doit se passer ; les tests<br/>
vérifient que le code le fait.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q32 : Des tests qui dépendent les uns des autres</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le test test_retrait ne réussit que s'il est lancé après<br/>
test_depot, qui alimente le compte. Quel est le problème ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque test construit son contexte, exécute une opération, vérifie<br/>
le résultat : indépendant, il reste lisible quand il échoue.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, l'ordre des tests étant toujours le même</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre peut changer, et un test qui dépend d'un autre<br/>
cache une mauvaise conception.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les tests ne sont pas indépendants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un test doit pouvoir être lancé seul, dans<br/>
n'importe quel ordre. Sinon un échec devient impossible à<br/>
interpréter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>test_depot devrait être supprimé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux tests sont utiles ; c'est leur dépendance qui<br/>
pose problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux tests devraient être fusionnés en un seul</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : fusionner masque quelle opération échoue.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q33 : Un test qui ne teste rien</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut le test assert double(4) == double(4) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La valeur attendue d'un test vient de la spécification, jamais du<br/>
code testé.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il vérifie que double(4) vaut 8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nombre 8 n'apparaît nulle part.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il vérifie que double est déterministe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : même si c'était l'intention, cela ne vérifie pas la<br/>
spécification de double.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Rien, il réussit quel que soit le résultat de double</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : comparer la fonction à elle-même ne dit pas si<br/>
elle renvoie 8. Un test compare le résultat à une valeur<br/>
attendue, écrite à la main.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il échoue toujours, une fonction ne pouvant être comparée à elle-même</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux appels identiques donnent la même valeur, le test<br/>
passe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q34 : Un indice hors de la liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie le message IndexError: list index out of range ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque type d'erreur nomme sa cause : IndexError pour un indice,<br/>
KeyError pour une clé, NameError pour un nom inconnu.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un indice inexistant dans la liste a été utilisé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec une liste de cinq éléments, t[5]<br/>
provoque cette erreur ; le dernier indice valide est 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste contient un élément du mauvais type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le type des éléments donnerait une TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste est trop longue pour la mémoire disponible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la taille de la liste n'est pas en cause.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste n'a pas été définie avant son utilisation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste non définie donnerait une NameError.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q35 : Une concaténation refusée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le message TypeError: can only concatenate str (not "int") to str<br/>
apparaît. Quelle instruction peut l'avoir provoqué ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le message indique les deux types en conflit : c'est lui qui<br/>
désigne la conversion à ajouter.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>12 + 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux entiers s'additionnent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>int("12")</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette conversion est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>"Total : " + "12"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : deux chaînes se concatènent sans problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>"Total : " + 12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : + entre une chaîne et un entier est refusé.<br/>
Il faut str(12) ou une virgule dans print.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q36 : Réduire le cas qui échoue</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction trier donne un résultat faux sur une liste de deux<br/>
mille éléments. Quelle est la première chose à faire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Réduire l'exemple est la première étape du débogage : plus le cas<br/>
est petit, plus la cause est visible.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Chercher la plus petite liste qui reproduit l'erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une liste de trois ou quatre éléments qui échoue<br/>
se trace à la main et révèle le mécanisme du bug.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Relancer le programme jusqu'à ce que le résultat soit bon</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un bug déterministe se reproduit à chaque fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ajouter des éléments à la liste pour voir si l'erreur persiste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : agrandir le cas le rend encore plus difficile à<br/>
analyser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réécrire la fonction entièrement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans comprendre l'erreur, on risque de la réécrire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q37 : Une modification à la fois</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour corriger un bug, Théo change trois lignes d'un coup, et le<br/>
résultat devient juste. Pourquoi cette méthode est-elle risquée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le débogage est une expérience scientifique : une hypothèse, une<br/>
modification, une vérification.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Python n'accepte qu'une modification par exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien de tel n'existe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trois modifications prennent trop de temps à écrire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le temps d'écriture n'est pas le problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il ignore laquelle a corrigé le bug, et si les autres en créent un</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : modifier une seule chose, tester, puis<br/>
continuer permet d'attribuer chaque effet à sa cause.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le résultat juste prouve que les trois lignes étaient fausses</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une seule ligne fautive suffit à expliquer le bug.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q38 : Une erreur signalée à la mauvaise ligne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Python signale une SyntaxError à la ligne 12, qui semble<br/>
pourtant correcte. Que vérifier ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quand la ligne signalée paraît juste, remonter d'une ligne : une<br/>
parenthèse, un crochet ou des guillemets non fermés en sont presque<br/>
toujours la cause.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La ligne 13, Python se trompant toujours d'une ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne se trompe pas ; il signale où la lecture<br/>
échoue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La version de Python, qui change la numérotation des lignes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les numéros de ligne sont fiables ; c'est la cause qui<br/>
est en amont.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La ligne précédente, une parenthèse non fermée y étant fréquente</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une parenthèse ouverte à la ligne 11 fait lire<br/>
la ligne 12 comme la suite de l'expression, et l'erreur n'est<br/>
détectée que là.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien, une SyntaxError disparaissant au second lancement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une erreur de syntaxe est stable tant que le code n'est<br/>
pas corrigé.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tests et débogage — Q39 : Avant ou pendant l'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle différence entre une SyntaxError et une ZeroDivisionError ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Erreurs de syntaxe au chargement, erreurs d'exécution en cours de<br/>
route, erreurs de logique sans message : trois familles, trois<br/>
façons de les chercher.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune, ce sont deux noms pour la même erreur d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elles ont des causes et des moments très différents.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La première est détectée avant l'exécution, la seconde pendant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une faute de syntaxe empêche le programme de<br/>
démarrer ; une division par zéro n'apparaît que lorsque<br/>
l'instruction fautive est atteinte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La première vient de Python, la seconde du système d'exploitation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux sont signalées par Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La première est grave, la seconde sans conséquence sur le résultat</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux arrêtent le programme.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
