Tester un programme
- Fiche de cours
- Quiz
- Profs en ligne
- Videos
- Application mobile
Mettre en place des procédures de tests pour tester un programme.
Pour vérifier si un programme fonctionne correctement, on doit insérer des procédures de tests : soit à l'intérieur de celui-ci, soit à la toute fin en vérifiant sur un jeu de test si celui-ci fournit les résultats escomptés.
- Préconditions et postconditions
- Prototypage d’une fonction
Un programme peut générer des erreurs, même avec une documentation complète, des postconditions et des préconditions détaillées.
L’idée est donc d’effectuer des tests unitaires, c’est-à-dire de tester le programme fonction par fonction.
Un test unitaire est constitué de ce qu’on appelle un jeu de test qui consiste à vérifier sur des exemples que le résultat est bien celui attendu.
Il faudra donc réfléchir aux éventuels cas particuliers pour pouvoir tester au mieux le programme.
Ce n’est pas parce qu’un jeu de test est réussi que le programme sera correct.
Pour être plus efficace, il vaut mieux implémenter (insérer) le jeu de test dans le même fichier que le programme à tester.
Le programme ou les fonctions qui sont ici créés sont dans un fichier python, on appelle cela un module. On qualifie le module de principal lorsqu’on travaille avec celui-ci : un module peut en effet appeler un autre module, par exemple une fonction présente dans un module principal peut faire appel à une fonction présente dans un autre module.
On tape if __name__=='__main__': à la fin du programme, suivi de la liste des tests.
- La variable __name__ varie selon l’endroit où l’on se trouve durant l'exécution du programme.
- Dans le module principal, sa valeur sera égale à __main__.
Le symbole __ est obtenu en appuyant deux fois sur tiret bas.
Voici l’explication ligne à ligne de ce programme.
def euclid(a,b): | Prototypage du nom de la fonction |
"""calcul du pgcd par l’algorithme d’Euclide | Commentaire qui explique le rôle de la fonction |
retourne un nombre entier : le pgcd | Postcondition |
a et b entiers positifs avec a non nul""" | Précondition |
assert a>0 "a doit être strictement positif" | Test de la précondition "a strictement positif" |
while b!=0 | Boucle tant que |
if a>b | Structure conditionnelle Si |
a=a-b | |
else: | Structure conditionnelle Sinon |
b=b-a | |
return a | La fonction retourne la valeur de a. |
if __name__=='__main__': | Si |
assert euclid(7,0)==7 | Vérification que euclid(7,0) vaut 7 |
assert euclid(15,5)==5 | Vérification que euclid(15,5) vaut 5 |
assert euclid(10,100)==10 | Vérification que euclid(10,100) vaut 10 |
On change la ligne 16 en assert euclid(10,100)==0, ce qui ne sera pas vérifié puisque le PGCD de 10 et de 100 vaut 10.
On aura alors le message d’erreur suivant.
On peut implémenter (insérer) un jeu de test dans la documentation de la fonction, ce qui nécessite d’importer un module permettant de faire des tests : le module doctest.
- Il faut taper : from doctest import *.
- Dans la documentation, chaque test sera précédé de 3 chevrons >>> suivi d’une espace puis du nom de la fonction avec les paramètres à tester et la valeur attendue à la ligne.
from math import * | On importe tous les outils de la bibliothèque math pour effectuer les calculs mathématiques. |
from doctest import * | On importe tous les outils de test de la bibliothèque doctest. |
def distance(x1,y1,x2,y2): | Prototypage du nom de la fonction |
"""calcule la distance euclidienne | Commentaire qui indique ce que fait la fonction |
retourne un nombre positif ou nul | Postcondition |
x1,y1,x2,y2 sont des nombres flottants | Précondition |
>>> distance(0,0,0,0) | Test 1 à effectuer lorsque cela sera demandé |
0.0 | |
>>> distance(0,0,0,1) | Test 2 a effectuer lorsque cela sera demandé |
1.0""" | |
return sqrt((x2-x1)**2 + (y2-y1)**2) | |
if __name__=='__main__': | Ces lignes permettent de lancer le premier test : a-t-on distance(0,0,0,0) égal à 0 et distance(0,0,0,1) égal à 1 si on lance la fonction dans le fichier où elle a été écrite ? |
testmod() |
Vous avez obtenu75%de bonnes réponses !