HAL Id: cel-02182414
https://hal.archives-ouvertes.fr/cel-02182414
Submitted on 12 Jul 2019
HAL is a multi-disciplinary open access
archive for the deposit and dissemination of
sci-entific research documents, whether they are
pub-lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d’enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.
Tests & Documentation - Les bonnes pratiques de la
programmation avec Python
Stéphane Guinard
To cite this version:
Stéphane Guinard. Tests & Documentation - Les bonnes pratiques de la programmation avec Python.
École d’ingénieur. France. 2018. �cel-02182414�
HAL Id: cel-02182414
https://hal.archives-ouvertes.fr/cel-02182414
Submitted on 12 Jul 2019
HAL is a multi-disciplinary open access
archive for the deposit and dissemination of
sci-entific research documents, whether they are
pub-lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d’enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.
Tests
Documentation - Les bonnes pratiques de la
programmation avec Python
Stéphane Guinard
To cite this version:
Stéphane Guinard. Tests
Documentation - Les bonnes pratiques de la programmation avec Python. École d’ingénieur. France.
2018. �cel-02182414�
Tests & Documentation
Les bonnes pratiques de la programmation avec Python
Division des enseignements en informatique
Pourquoi documenter son code
• Expliquer ce que font les fonctions, classes, modules...
• Indispensable pour rendre le code exploitable par d’autres
def m a _ f o n c t i o n ( a , b ) : """ L i g n e g ´e n ´e r a l e de d e s c r i p t i o n D e s c r i p t i o n p l u s d ´e t a i l l ´e e , si besoin , p o u r e x p l i q u e r c o m m e n t la f o n c t i o n f a i t ce qu ’ e l l e fait , de ce qu ’ e l l e u t i l i s e ... : p a r a m a : d e s c r i p t i o n de ce que c o n t i e n t a : t y p e a : t y p e de la v a l e u r a t t e n d u e d a n s a : p a r a m b : d e s c r i p t i o n de ce que c o n t i e n t b : t y p e b : t y p e de la v a l e u r a t t e n d u e d a n s b : r e t u r n : d e s c r i p t i o n de ce que r e t o u r n e la f o n c t i o n : r e t u r n t y p e : t y p e de la v a l e u r r e t o u r n ´e e par la f o n c t i o n """ Documentation 2
Doctrings vs Commentaires
Les commentaires sont compl`
etement ignor´
es par l’interpr´
eteur Python
tandis que les docstrings sont charg´
ees et gard´
ees en m´
emoire.
Docstrings :
""" D o c s t r i n g s """ ’ ’ ’ D o c s t r i n g s ’ ’ ’Commentaires :
# C o m m e n t a i r e Documentation 3R`
egles d’usage et convention
Apr`
es le prototype de la fonction :
""" R ´e sum ´e sur un s e u l e l i g n e . C o n t e n u d ´e t a i l l ´e sur p l u s i e u r s l i g n e s . """
Les balises :
""" : p a r a m a r g 1 : d e s c r i p t i o n de l ’ a r g u m e n t 1 : t y p e a r g 1 : t y p e de l ’ a r g u m e n t 1 : p a r a m a r g 2 : d e s c r i p t i o n de l ’ a r g u m e n t 2 : t y p e a r g 1 : t y p e de l ’ a r g u m e n t 2 : r e t u r n : d e s c r i p t i o n de la v a l e u r de r e t o u r : r t y p e : t y p e de la v a l e u r de r e t o u r """ Documentation 4Exemple
def a d d i t i o n ( a , b ) : """ A d d i t i o n de d e u x n o m b r e s . C e t t e f o n c t i o n p e r m e t d ’ a d d i t i o n n e r d e u x n o m b r e s r ´e els et r e t o u r n e ´e g a l e m e n t un n o m b r e r ´e el . E l l e est ´e q u i v a l e n t e `a l ’ op ´e r a t e u r ’+ ’. : p a r a m a : p r e m i e r n o m b r e `a a d d i t i o n n e r : t y p e a : f l o a t : p a r a m b : d e u x i `e me n o m b r e `a a d d i t i o n n e r : t y p e b : f l o a t : r e t u r n : r ´e s u l t a t de l ’ a d d i t i o n : r t y p e : f l o a t """ r e t u r n a + b Documentation 5Acc`
es `
a la documentation
• La fonction help :
> > > h e l p( m a t h . cos ) H e l p on built -in f u n c t i o n cos in m o d u l e m a t h : cos ( . . . ) cos ( x ) R e t u r n the c o s i n e of x ( m e a s u r e d in r a d i a n s ) .• L’attribut " doc " :
> > > m a t h . cos . _ _ d o c _ _ ’ cos ( x ) \ n \ n R e t u r n the c o s i n e of x ( m e a s u r e d in r a d i a n s ) . ’ Documentation 6Les tests en programmation
C’est une pratique courante en programmation :
• Les tests unitaires permettent de tester de petites portions de code
(une fonction, une classe, un module) ind´
ependamment du reste du
programme.
• Les tests fonctionnels permettent de valider les fonctionnalit´
es
d’une application d’un point de vue utilisateur. Ils permettent de
valider l’enchaˆınement des briques ´
el´
ementaires.
• Les tests de performances sont constitu´
es de tout un ensemble de
tests li´
es `
a la performance de l’application : test de charge, tests de
performance en temps de r´
eponse, tests aux limites...
Tests unitaires
Nous nous int´
eresserons dans ce cours uniquement `
a la mise en œuvre de
tests unitaires.
Concr`
etement
Un test unitaire est un morceau de code permettant d’en soumettre un
autre et d’analyser le r´
esultat obtenu.
Pourquoi faire des tests unitaires :
• s’assurer que l’application fonctionne
• tester les cas limites
• apr`es modification/ajout de code, s’assurer que l’application
fonctionne toujours
Comment ´
ecrire ses tests
Les bonnes pratiques :
• tester la r´eussite, l’´
echec et la coh´
erence
• rechercher la difficult´e, proscrire les tests triviaux
• ´
ecrire des tests d´
eterministes
• s´
eparer le code des tests du code de l’application
N’h´
esitez pas `
a ´
ecrire plusieurs tests par fonction !!
Exemple 1
def f a c t o r i e l l e ( n ) : if t y p e( n ) != t y p e(int) : p r i n t(" E r r o r : n d o i t e t r e un e n t i e r ") r e t u r n F a l s e if n < 0: p r i n t(" E r r o r : n d o i t e t r e >= 0 ") r e t u r n F a l s e if n > 1 0 0 0 0 : p r i n t(" E r r o r : n est t r o p g r a n d ") r e t u r n F a l s e if n == 1 or n == 0: r e t u r n 1 e l s e: r e t u r n n * f a c t o r i e l l e ( n -1) # T e s t s > > > [ f a c t o r i e l l e ( n ) for n in r a n g e(6) ] [1 , 1 , 2 , 6 , 24 , 1 2 0 ] > > > f a c t o r i e l l e ( -1) E r r o r : n d o i t e t r e >= 0 > > > f a c t o r i e l l e ( 1 . 5 ) E r r o r : n d o i t e t r e un e n t i e r > > > f a c t o r i e l l e (1 e 1 0 0 ) E r r o r : n est t r o p g r a n d Tests 10Exemple 2
Si l’on est pas sur de la pr´
esentation du r´
esultat.
def d i v i s e _ p a r _ u n ( n ) : """ R e t o u r n e la d i v i s i o n d ’ un n o m b r e e n t i e r par 1. """ if t y p e( n ) != t y p e(int) : p r i n t(" E r r e u r : n d o i t e t r e un e n t i e r ") r e t u r n F a l s e r e t u r n n / 1 # T e s t s > > > d i v i s e _ p a r _ u n (4) 4.0 # On s ’ a t t e n d a i t a "4" : -( > > > d i v i s e _ p a r _ u n (4) == 4 T r u e # On s ’ a t t e n d a i t a T r u e : -) > > > d i v i s e _ p a r _ u n ( 1 . 5 ) E r r e u r : n d o i t e t r e un e n t i e r
Doctest
Il existe des modules permettant de faciliter la mise en œuvre de tests
unitaires : doctest. C
¸ a nous permet notamment d’´
ecrire les tests
directement dans la documentation des fonctions.
Doctest
A l’ex´
ecution, ¸
ca ressembla `
a ¸ca :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * F i l e " _ _ m a i n _ _ " , l i n e 4 , in _ _ m a i n _ _ . a d d i t i o n F a i l e d e x a m p l e : a d d i t i o n (0 , 1) E x p e c t e d : 0 Got : 1 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1 i t e m s had f a i l u r e s : 1 of 2 in _ _ m a i n _ _ . a d d i t i o n *** T e s t F a i l e d *** 1 f a i l u r e s . T e s t R e s u l t s ( f a i l e d =1 , a t t e m p t e d =2) Tests 13