Aller au contenu

Les tests

Principe

Un programme doit pouvoir s'adapter à des différentes situations grâce à des tests.

Par exemple : si la température extérieure est inférieure à 16 degrés alors il faut démarrer le chauffage.

En informatique, un test s'appelle aussi une structure conditionnelle.

Test Si ... alors ...

Voici un exemple de script utilisant un test :

a = 3
b = 5
if a < b:
    print("a est le plus petit")

Le test commence par un if, suivi d’une condition, puis d’un : puis, à la ligne suivante, commence(nt) une ou des instructions.

Ici : si (if en anglais) la condition (ici a < b) est vraie, alors exécuter le bloc d’instructions qui suit (ici une seule instruction, à savoir afficher le texte "a est le plus petit").

À retenir

La syntaxe générale est :

début du programme
if condition:
    bloc d’instructions à exécuter si le test est réussi
suite du programme

graph LR
A[début]-->C{si condition}
C-->|vraie| D[bloc instructions dans test]
C-->|fausse| E[suite]
D-->E

Remarquez :

  • le : indispensable à la fin de la ligne du if ;
  • que le bloc d’instructions à exécuter est défini par l'indentation ;
  • que le bloc d’instructions soit exécuté ou pas, le déroulement du programme continue après le test (suite du programme) ;
  • le mot alors n’existe pas en Python (dans certains langages, il se traduit par then) ;
  • la condition est en fait un booléen.

Exercice 1

  • Exécutez ce script :
a = 3
b = 5
if a < b:
    print("a est le plus petit")
    print("autrement dit b est le plus grand")
  • Modifiez le script ainsi :
a = 5
b = 1
if a < b:
    print("a est le plus petit")
print("autrement dit b est le plus grand")

et observez la différence.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Les conditions

Conditions d’égalité

a == b est vrai quand la valeur de a est égale à celle de b ;

a != b est vrai quand la valeur de a est différente de celle de b.

Attention

Il faut bien faire attention à distinguer l'affectation a = b et le test d'égalité a == b.

Égalité des flottants

Le test d'égalité == est bien adapté pour un test entre deux entiers ou entre deux chaînes de caractères.

Mais, du fait de la représentation des nombres en machine, il est mal adapté à la comparaison de deux flottants.

Exécutez le code ci-dessous pour vous en convaincre :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Conditions de comparaison

Les comparaisons se font à l'aide d'un des quatre opérateurs : > ou < ou >= ou <= (par exemple : if moyenne > 10:).

Exercice 2

Comparez des chaînes de caractères à l'aide de < par exemple.

Comment sont classées les chaînes de caractères ?

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Conditions d’appartenance

Il est possible de tester si une valeur est dans un ensemble ou si une lettre est dans une chaîne de caractères avec l'opérateur in (dans) :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Il existe aussi l'opérateur not in (pas dans).

On peut même tester si un mot est dans un autre : print("SI" in "NSI").

Test Si ... alors ... sinon...

En voici un exemple :

lettre = "u"
if lettre in "aeiouy":
    print("C’est une voyelle")
else:
    print("Ce n’est pas une voyelle")  
  • si la condition est vraie (si lettre fait partie de "aeiouy") alors le premier bloc d’instruction est exécutée ;
  • sinon (ELSE en anglais), c’est-à-dire si la condition est fausse (si lettre ne fait pas partie de "aeiouy") alors c’est l’autre bloc d’instructions qui est exécuté et le premier bloc est ignoré.

Le couple if et else agit comme un aiguillage.

À retenir

La syntaxe générale est :
début du programme
if condition:
    bloc d’instructions 1 à exécuter si la condition est vérifiée
else:
    bloc d’instructions 2 à exécuter si la condition n'est pas vérifiée
suite du programme

graph LR
A[début]-->C{si condition}
C-->|vraie| D[bloc instructions 1]
C-->|fausse| E[bloc instructions 2]
D-->F[suite]
E-->F

Exercice 3

Sans utiliser l'éditeur, indiquez la valeur de la variable s à la fin de ce script :

e = 4
f = 2
if f != e:
    f = f - e + 1
    s = e + f + 5
else:
    s = 2 + e + f

Exercices

  1. Exercice 4 : le code PIN de Marc.
  2. Exercice 5 : pair ou impair ?
  3. Exercice 6 : tarifs de photocopies.
  4. Exercice 7 : le maximum.

Test Si ... alors ... sinonsi ...

Parfois, pour déterminer dans quel cas on se trouve, il faut effectuer plusieurs tests.

Exercice 8

Prenez le temps de lire le script ci-dessous qui doit nous dire quel sera notre mention au bac.

Exécutez-le plusieurs fois en changeant la valeur de ma_note dans la première ligne et observez.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Explications

Ce script ne fonctionne pas comme prévu. Normalement, il ne devrait y avoir qu'un message d'affiché. C'est parce que les tests sont tous indépendants. Même si le premier test est réussi, les autres tests sont également effectués et potentiellement validés (si ma note est supérieure à 16 alors elle est aussi supérieure à 14 et à 12), alors qu'ils ne devraient l'être que si les précédents ont échoués. Il faut donc imbriquer les tests.

Exercice 9

Modifiez maintenant le programme ainsi (pas de copier-coller svp) puis testez son bon fonctionnement :

ma_note = 13
if ma_note >= 16:
    print("Mention TB")
else:
    if ma_note >= 14:
        print("Mention B")
    else:
        if ma_note >= 12:
            print("Mention AB")
        else:
            print("Pas de mention")

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Mais... s'il y a 20 cas possibles ??

Si la note est supérieure ou égale à 16 alors le programme affiche "Mention TB", sinon il envisage le cas où la note est inférieure à 16, ce qui se sépare en plusieurs cas…

Ce script fonctionne bien mais "à cause" du système d'indentation, sa lecture n'est pas si simple. C'est pourquoi il existe une syntaxe permettant de simplifier la rédaction des études de cas, en utilisant le mot clé elif (contraction de else if).

À retenir

Ce script

if condition1:
    bloc dinstructions 1
else:
    if condition2:
        bloc dinstructions 2
    else:
        bloc dinstructions 3
# suite du programme

peut aussi s’écrire ainsi :

if condition1:
    bloc dinstructions 1
elif condition2:
    bloc dinstructions 2
else:
    bloc dinstructions 3
# suite du programme

graph LR
A[début]-->B{si condition1}
B-->|vraie| C[bloc instructions 1]
B-->|fausse| D{si condition2}
D-->|vraie| E[bloc instructions 2]
D-->|fausse| F[bloc instructions 3]
C-->G[suite]
E-->G
F-->G

Exercice 10

Modifiez le programme ainsi puis testez son bon fonctionnement :

ma_note = 13
if ma_note >= 16:
    print("Mention TB")
elif ma_note >= 14:
    print("Mention B")
elif ma_note >= 12:
    print("Mention AB")
else:
    print("Pas de mention")

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Exercice 12

Écrivez un programme dans lequel la machine demande à un utilisateur son âge et dit si l’utilisateur est un enfant (moins de 12 ans) ou un adolescent (entre 12 et 18 ans) ou un adulte (à partir de 18 ans).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Exercice 13

Le professeur Zarb met des notes sur 72 points, qu'il convertit ensuite en pourcentage de réussite puis il les transforme en appréciations suivant ce tableau :

Note N Appréciation
N ≥ 80 % A
80 % > N ≥ 60 % B
60 % > N ≥ 50 % C
50 % > N ≥ 40 % D
N < 40 % E

Écrivez une fonction conv qui s'occupe de la conversion en appréciation d'une note N entrée par l’utilisateur sous forme de points. Voici un exemple d'utilisation de cette fonction :

>>> conv(39)
'C'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013)4 vp1:udn25Bo7w/éAà3(mgia6fhP8;Ebcke9S*Cytl=rD0s050j0L0R0A0z0S0X0d0J0S0A0X0X0T010R0z0f010406050X0i0x0x0A0U0Q040N0o0S0i0=0o0k050r0|0~10120`0f04051i1b1l0r1i0`0j0z0e0*0,0.0:0D0z0y0D0S1z0D0R0^050#0I0S0L1u0-0/011y1A1C1A0R1I1K1G0R0U1j0R0D0*150X0f0A0k0:0l011M1w010C0%0L0k0A0x0L1G1)1+1:1O1?1K1_1{0^0a0d0E0U0o0f0o0X0z180k0d0Z1%0U0U0L0J2g1b1~0k1j0r1#2t1Y1!1Z1H0j200:1C0k1^2d1G1r1t0+1N2D0z2F0k0o2J1G0f2m1j2r2t2X0{1*2h2L1;2Q0U0 0S0^0d0g2q2#0_2!1 2%1O2)2+2-0l2:1+2=2r2C012`0A2,040d0v2~2s0`312^0:34360d0c3a302#323g2-0m3k3c3m3e330o2*352-0B3r2?2$1v2_3w2{370p3B3d3E3f3G3y370F3K3t3M3v3x3h0M3S2@3U3o040g0W3Z3D2M3V3H0g2/1c2;3s3!3,3$0g2}3;2 3?3+2(3O360g393|2s1m2V1b2J2w0j1!2B3u0J2R1|1j4a1k482Z451j4g0Z2W3T3,0K0^0Z0C3k3C320q2-4z3L3^0C0^4g0k0e4E4t1;0@040w4M3@2(0^2Q0R0L4S3 1O4P0b0h3r0d4*0d4A3u0k0^0f3k4,4F1;0o0^0T4=4-3U4P4R4o4}3^4V0o4X4|4@1O4_040r574N1O0x0z0^0p3{2Z580:4$5d4T590^0O5p4!0:5g0^3(3)4o064+4?5e0:4v040z4y4o5E5q3f4:5u325a020y0R0G4{5L521;5x040F5A5l5F014P4(5B5D5D5Z2_0^0A0f4;5Y5m015a5X2X5M5v010X1.04010t014)4+5;5G0^0L1C5K5 6b335P5`5*5S5U5W5Q3u5#0B5(2;6i5,4Z320J0g0^030d0z0J0z0d0f0d0L0X0R0d0C3w0J0s1{0k6N2O0C0s0U0z0L0i0U0d0u0d5%695/603n5?5^6q3U5}6=3,630^010n685.6a5{5H6e5J6^4U045_6h5{6n5V5~2;6.6r5h040m6u2 6w0^5-5)5N016A6C6E6G6I6K6M6O6Q6S1^6V0k6X6Z6#6%6)6t6,5/6i4/045@787e6i6@6l7q6`650P6~2X5C705*726f755=777+0:7b6p7V615#0c7k465{6x515{7s046D6F6H6J6L6N6P0U6R6T7D7F6!6$6(0d7j7L5:5{7O7Q7.5|4`8n7X010V7!3=8j7(6d0(4Y7}5*7|7#6-4*7N6:7R2 7f6?8p7=328r0H8u3}8w7q5H2m0R6$1a8O4.8I3B0r4q0L2t2U8+491s4b2w2z2u0A1J8.0r4a0`8{0!0$0(04.

À retenir

  • les trois mots clés pour effectuer des tests sont : if, else et elif ;
  • les conditions sont des booléens ;
  • n'oubliez pas les : et l'indentation pour définir des blocs.
Sources

Quelques sources : https://www.dropbox.com/sh/nxa2kq5zkgb5o6v/AABeXXa1-N73jC7DZ-kDvokOa/feuille-python-boucles-tests.pdf?dl=0 https://www.numerique-sciences-informatiques.fr/coursConstructionsElementaires.php#Exercices https://isnbreizh.fr/nsi/activity/code2D2/pythonBase/pythonTests.html