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)