Amusez-vous à tester avec les objets farceurs (mock)

publicité
Base Avancé
Amusez-vous à tester avec les objets farceurs
(mock)
André Espaze
31 mai 2009
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Traduction du concept
Definition
mock : imite le comportement d’un objet de manière controlée
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Traduction du concept
Definition
mock : imite le comportement d’un objet de manière controlée
En Anglais : mock = faux (adjectif) ou se moquer (verbe)
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Traduction du concept
Definition
mock : imite le comportement d’un objet de manière controlée
En Anglais : mock = faux (adjectif) ou se moquer (verbe)
Traductions possibles :
I
un objet mimétique
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Traduction du concept
Definition
mock : imite le comportement d’un objet de manière controlée
En Anglais : mock = faux (adjectif) ou se moquer (verbe)
Traductions possibles :
I
un objet mimétique
I
un objet farceur
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
mocker : un module rempli de grâce
Ecrit par Gustavo Niemeyer
Même license que Python
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
mocker : un module rempli de grâce
Ecrit par Gustavo Niemeyer
Même license que Python
I
concis : 2000 lignes de code en un module
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
mocker : un module rempli de grâce
Ecrit par Gustavo Niemeyer
Même license que Python
I
concis : 2000 lignes de code en un module
I
testé : 405 tests tournant en moins d’1 seconde
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
mocker : un module rempli de grâce
Ecrit par Gustavo Niemeyer
Même license que Python
I
concis : 2000 lignes de code en un module
I
testé : 405 tests tournant en moins d’1 seconde
I
pratique : aucune dépendance
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
mocker : un module rempli de grâce
Ecrit par Gustavo Niemeyer
Même license que Python
I
concis : 2000 lignes de code en un module
I
testé : 405 tests tournant en moins d’1 seconde
I
pratique : aucune dépendance
Livrable avec vos tests
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Création d’un object farceur
>>> i m p o r t mocker a s MCK
# c r é a t i o n de l ’ e n t r e p ô t
>>> mocker = MCK. Mocker ( )
# c r é a t i o n de l ’ o b j e t f a r c e u r
>>> f a r c e u r = mocker . mock ( )
# e n r e g i s t r e m e n t du comportement
>>> MCK. e x p e c t ( f a r c e u r . s a l u t ( ”PT” ) ) . r e s u l t ( ” Ola ” )
>>> MCK. e x p e c t ( f a r c e u r . s a l u t ( ”EN” ) ) . r e s u l t ( ” Hi ” )
# p a s s a g e en mode a c t i o n
>>> mocker . r e p l a y ( )
>>> f a r c e u r . s a l u t ( ”EN” )
’ Hi ’
>>> f a r c e u r . s a l u t ( ”FR” )
MCK. M a t c h E r r o r ( ” U n e x p e c t e d e x p r e s s i o n : f a r c e u r . s a l u t ( ’ FR ’ ) ” )
# l ’ e n t r e p ô t v é r i f i e l e comportement de t o u s
>>> mocker . v e r i f y ( )
A s s e r t i o n E r r o r ( ” ” ”\
=> f a r c e u r . s a l u t ( ’PT ’ )
− Performed fewer times than expected .
””” )
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Vérification d’une interface
# Une i n t e r f a c e
>>> c l a s s S i m u l a t i o n :
...
def run ( s e l f , steps nb , t o l ) :
...
r a i s e NotImplementedError
# Un c l i e n t pé r i mé
>>> d e f l a u n c h e r ( simu , s t e p s n b s ) :
...
for step in steps nbs :
...
simu . r u n ( s t e p )
# Un t e s t
>>> i m p o r t mocker a s MCK
>>> mocker = MCK. Mocker ( )
>>> si mu = mocker . mock ( S i m u l a t i o n )
>>> si mu . r u n ( 5 0 )
>>> si mu . r u n ( 1 0 0 )
>>> mocker . r e p l a y ( )
>>> l a u n c h e r ( simu , [ 5 0 , 1 0 0 ] )
A s s e r t i o n E r r o r ( ”””
=> si mu . r u n ( 5 0 )
− S p e c i f i c a t i o n i s run ( steps nb , t o l ) :
””” )
’ t o l ’ not p r o v i d e d
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Présentation Utilisation
Intégration avec unittest
# Un module de f i l t r a g e
def
f i l t e r ( results , tol ):
corrects = []
for result in results :
if result . less than ( tol ):
c o r r e c t s . append ( r e s u l t )
return corrects
# Un module de t e s t
i m p o r t mocker a s MCK
c l a s s T e s t S e l e c t R e s u l t s (MCK. M o c k e r T e s t C a s e ) :
def t e s t f i l t e r r e s u l t s u n d e r t o l e r a n c e ( s e l f ) :
r e s = [ s e l f . mocker . mock ( ) f o r i d x i n r a n g e ( 3 ) ]
MCK. e x p e c t ( r e s [ 0 ] . l e s s t h a n (MCK. ANY ) ) . r e s u l t ( True )
MCK. e x p e c t ( r e s [ 1 ] . l e s s t h a n (MCK. ANY ) ) . r e s u l t ( F a l s e )
MCK. e x p e c t ( r e s [ 2 ] . l e s s t h a n (MCK. ANY ) ) . r e s u l t ( True )
s e l f . mocker . r e p l a y ( )
s e l f . a s s e r t E q u a l ( f i l t e r ( r e s , None ) , [ r e s [ 0 ] , r e s [ 2 ] ] )
import u n i t t e s t ;
u n i t t e s t . main ( )
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Patch Replace
Modification d’un objet vivant
# −∗− c o d i n g : i s o 8 8 5 9 −15 −∗−
from PyQt4 i m p o r t QtGui a s q t
# Un d i a l o g u e p e r s o n a l i s é
c l a s s I n p u t S e l e c t o r ( qt . Q F i l e D i a l o g ) :
def run ( s e l f ) :
s e l f . s e t D i r e c t o r y ( ”/ data / i n p u t s ” )
fname = None
i f ( s e l f . exec ( ) ) :
fname = s e l f . s e l e c t e d F i l e s ( ) [ 0 ]
r e t u r n fname
# Un t e s t
i m p o r t mocker a s MCK
app = q t . Q A p p l i c a t i o n ( [ ] )
mocker = MCK. Mocker ( )
sel = InputSelector ()
m s e l = mocker . p a t c h ( s e l )
# Commentez l a l i g n e s u i v a n t e p o u r v o i r l e d i a l o g u e
MCK. e x p e c t ( m s e l . e x e c ( ) ) . r e s u l t ( q t . Q D i a l o g . R e j e c t e d )
mocker . r e p l a y ( )
a s s e r t ( s e l . r u n ( ) i s None )
mocker . v e r i f y ( )
mocker . r e s t o r e ( )
Amusez-vous à tester avec les objets farceurs (mock)
Base Avancé
Patch Replace
Remplacement d’un identifiant
import sys
# Une f o n c t i o n de l a l i b r a i r i e
def run simu ( input , output ) :
boost run simu ( input , output )
# Traitement des arguments
d e f main ( ) :
i f l e n ( s y s . a r g v ) == 3 :
r u n s i m u ( s y s . a r g v [ −2] , s y s . a r g v [ −1])
# Un t e s t
i m p o r t mocker a s MCK
mocker = MCK. Mocker ( )
r u n = mocker . r e p l a c e ( r u n s i m u )
r u n ( ” / d a t a / i n p u t . h5 ” , ” / d a t a / o u t p u t . h5 ” )
mocker . r e p l a y ( )
s y s . a r g v = [ ” py ” , ” / d a t a / i n p u t . h5 ” , ” / d a t a / o u t p u t . h5 ” ]
main ( )
mocker . v e r i f y ( )
mocker . r e s t o r e ( )
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
I
Vérification des interfaces
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
I
Vérification des interfaces
I
Isolation controlée des implémentations
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
I
Vérification des interfaces
I
Isolation controlée des implémentations
Limites :
I
Mépriser par les non testeurs
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
I
Vérification des interfaces
I
Isolation controlée des implémentations
Limites :
I
Mépriser par les non testeurs
I
Peut masquer un problème d’intégration
Amusez-vous à tester avec les objets farceurs (mock)
Conclusion
Avantages :
I
Test amusant du comportement
I
Vérification des interfaces
I
Isolation controlée des implémentations
Limites :
I
Mépriser par les non testeurs
I
Peut masquer un problème d’intégration
Très intéressant si equilibré avec tests d’intégration et de validation
Amusez-vous à tester avec les objets farceurs (mock)
Téléchargement