Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perl course, lesson #11

Perl course, lesson #11

Perl testing

Vadim Pushtaev

May 25, 2015
Tweet

More Decks by Vadim Pushtaev

Other Decks in Programming

Transcript

  1. Объект тестирования Функциональное тестирование Тестирование производительности Нагрузочное тестирование Юзабилити­тестирование Тестирование

    интерфейса пользователя Тестирование безопасности Тестирование локализации Тестирование совместимости 2 / 53
  2. t/* $ l s t f a c t o

    r y . t p o d . t 6 / 53
  3. TAP $ p e r l t / f a

    c t o r y . t 1 . . 1 5 o k 1 - g e t _ f i e l d s o k 2 - b u i l d o k 3 - c r e a t e o k 4 - d i s c a r d _ c h a n g e s i s o n b y d e f a u l t o k 5 - g e t _ f i e l d s _ b a t c h o k 6 - b u i l d _ b a t c h o k 7 - c r e a t e _ b a t c h o k 8 - c r e a t e ( w i t h b a s e f a c t o r y ) o k 9 - c r e a t e ( w i t h b a s e f a c t o r y , b a s e _ f a c t o r y a t t h e b o t t o m ) o k 1 0 - r e l a t e d _ f a c t o r y h e l p e r o k 1 1 - r e l a t e d _ f a c t o r y _ b a t c h h e l p e r o k 1 2 - c r e a t e w i t h e x c l u d e d p a r a m o k 1 3 - a f t e r _ g e t _ f i e l d s o k 1 4 - a f t e r _ b u i l d o k 1 5 - a f t e r _ c r e a t e 7 / 53
  4. TAP $ p e r l t / f a

    c t o r y . t 1 . . 1 5 o k 1 - g e t _ f i e l d s o k 2 - b u i l d o k 3 - c r e a t e o k 4 - d i s c a r d _ c h a n g e s i s o n b y d e f a u l t o k 5 - g e t _ f i e l d s _ b a t c h o k 6 - b u i l d _ b a t c h o k 7 - c r e a t e _ b a t c h o k 8 - c r e a t e ( w i t h b a s e f a c t o r y ) o k 9 - c r e a t e ( w i t h b a s e f a c t o r y , b a s e _ f a c t o r y a t t h e b o t t o m ) o k 1 0 - r e l a t e d _ f a c t o r y h e l p e r o k 1 1 - r e l a t e d _ f a c t o r y _ b a t c h h e l p e r o k 1 2 - c r e a t e w i t h e x c l u d e d p a r a m o k 1 3 - a f t e r _ g e t _ f i e l d s o k 1 4 - a f t e r _ b u i l d n o t o k 1 5 - a f t e r _ c r e a t e # F a i l e d t e s t ' a f t e r _ c r e a t e ' # a t t / f a c t o r y . t l i n e 2 9 0 . # C o m p a r e d $ d a t a - > [ 0 ] - > s u m # g o t : ' 1 2 3 ' # e x p e c t : ' 1 1 2 3 ' # L o o k s l i k e y o u f a i l e d 1 t e s t o f 1 5 . 8 / 53
  5. prove $ p r o v e t / f

    a c t o r y . t . . o k t / p o d . t . . . . . . o k A l l t e s t s s u c c e s s f u l . F i l e s = 2 , T e s t s = 1 7 , 0 w a l l c l o c k s e c s ( . . . ) R e s u l t : P A S S 9 / 53
  6. prove $ p r o v e t / f

    a c t o r y . t . . 1 / 1 5 # F a i l e d t e s t ' a f t e r _ c r e a t e ' # a t t / f a c t o r y . t l i n e 2 9 0 . # C o m p a r e d $ d a t a - > [ 0 ] - > s u m # g o t : ' 1 2 3 ' # e x p e c t : ' 1 1 2 3 ' # L o o k s l i k e y o u f a i l e d 1 t e s t o f 1 5 . t / f a c t o r y . t . . D u b i o u s , t e s t r e t u r n e d 1 ( w s t a t 2 5 6 , 0 x 1 0 0 ) F a i l e d 1 / 1 5 s u b t e s t s t / p o d . t . . . . . . o k T e s t S u m m a r y R e p o r t - - - - - - - - - - - - - - - - - - - t / f a c t o r y . t ( W s t a t : 2 5 6 T e s t s : 1 5 F a i l e d : 1 ) F a i l e d t e s t : 1 5 N o n - z e r o e x i t s t a t u s : 1 F i l e s = 2 , T e s t s = 1 7 , 0 w a l l c l o c k s e c s ( . . . ) R e s u l t : F A I L 10 / 53
  7. Test::Harness, TAP::Harness u s e T A P : :

    H a r n e s s ; m y $ h = T A P : : H a r n e s s - > n e w ( { e x e c = > [ " p e r l " , " t e s t . p l " ] } ) ; $ h - > r u n t e s t s ( " A " , " B " , " C " ) ; 11 / 53
  8. Test::Builder u s e T e s t : :

    B u i l d e r ; m y $ t e s t = T e s t : : B u i l d e r - > n e w ; $ t e s t - > o k ( 1 = = 1 , ' o n e ' ) ; $ t e s t - > i s _ e q ( 2 , 7 , ' t w o ' ) ; $ t e s t - > d o n e _ t e s t i n g ( ) ; o k 1 - o n e n o t o k 2 - t w o # F a i l e d t e s t ' t w o ' # a t T . p m l i n e 6 . # g o t : ' 2 ' # e x p e c t e d : ' 7 ' 1 . . 2 # L o o k s l i k e y o u f a i l e d 1 t e s t o f 2 . 12 / 53
  9. Test::Simple u s e T e s t : :

    S i m p l e t e s t s = > 4 2 ; o k ( s i n ( 0 ) , 0 , ' S i n ( 0 ) ' ) ; 13 / 53
  10. Test::More u s e T e s t : :

    M o r e t e s t s = > 4 2 ; u s e T e s t : : M o r e ; # . . . d o n e _ t e s t i n g ( $ n ) ; 14 / 53
  11. ok, is, isnt o k ( s i n (

    0 ) = = 0 , ' . . . ' ) ; i s ( s i n ( 0 ) , 0 , ' . . . ' ) ; i s n t ( $ r e s u l t , ' e r r o r ' , ' . . . ' ) ; 15 / 53
  12. like, unlike l i k e ( $ e r

    r o r , q r / f o r b i d d e n / , ' . . . ' ) ; u n l i k e ( $ e r r o r , q r / f o r b i d d e n / , ' . . . ' ) ; 16 / 53
  13. cmp_ok c m p _ o k ( $ x

    , ' = = ' , $ y ) ; c m p _ o k ( $ x , ' & & ' , $ y ) ; 17 / 53
  14. can_ok c a n _ o k ( " D

    o g " , q w ( b a r k r u n ) ) ; c a n _ o k ( $ d o g , q w ( b a r k r u n ) ) ; f o r e a c h m y $ m e t h o d ( q w ( b a r k r u n ) ) { c a n _ o k ( $ d o g , $ m e t h o d , " m e t h o d $ m e t h o d " ) ; } 18 / 53
  15. isa_ok, new_ok m y $ o b j = S

    o m e : : M o d u l e - > n e w ; i s a _ o k ( $ o b j , ' S o m e : : M o d u l e ' ) ; n e w _ o k ( " D o g " = > [ ' P l u t o ' , 4 2 ] ) ; 19 / 53
  16. subtest s u b t e s t s s

    i n u s = > s u b { i s ( S i n ( 0 ) , 0 , ' z e r o ' ) ; i s ( S i n ( P I / 2 ) , 1 , ' p i / 2 ' ) ; } ; 1 . . 1 # S u b t e s t : s i n u s o k 1 - z e r o o k 2 - p i / 2 1 . . 3 o k 1 - s i n u s 20 / 53
  17. pass, fail m y $ n a m e =

    ' . . . ' ; p a s s ( $ n a m e ) ; f a i l ( $ n a m e ) ; 21 / 53
  18. require_ok, use_ok r e q u i r e _

    o k ' M y : : M o d u l e ' ; r e q u i r e _ o k ' M y / M o d u l e . p m ' ; B E G I N { u s e _ o k ( ' S o m e : : M o d u l e ' , q w ( f o o b a r ) ) } 22 / 53
  19. is_deeply i s _ d e e p l y

    ( { 1 = > [ 1 , 2 , 3 ] } , { 1 = > [ 1 , 2 , 3 ] } , ' . . . ' ) ; 23 / 53
  20. diag, note p a s s ( ' A '

    ) ; p a s s ( ' B ' ) ; d i a g ( ' D I A G ' ) ; n o t e ( ' N O T E ' ) ; p a s s ( ' C ' ) ; p a s s ( ' D ' ) ; 1 . . 4 o k 1 - A o k 2 - B # D I A G # N O T E o k 3 - C o k 4 - D T . p m . . 1 / 4 # D I A G T . p m . . o k A l l t e s t s s u c c e s s f u l . F i l e s = 1 , T e s t s = 4 , 0 w a l l c l o c k s e c s ( . . . ) R e s u l t : P A S S 24 / 53
  21. explain s u b e x p l a i

    n { m y $ s e l f = s h i f t ; r e t u r n m a p { r e f $ _ ? d o { $ s e l f - > _ t r y ( s u b { r e q u i r e D a t a : : D u m p e r } , d i e _ o n _ f a i l = > 1 ) ; m y $ d u m p e r = D a t a : : D u m p e r - > n e w ( [ $ _ ] ) ; $ d u m p e r - > I n d e n t ( 1 ) - > T e r s e ( 1 ) ; $ d u m p e r - > S o r t k e y s ( 1 ) i f $ d u m p e r - > c a n ( " S o r t k e y s " ) ; $ d u m p e r - > D u m p ; } : $ _ } @ _ ; } 25 / 53
  22. SKIP u s e T e s t : :

    M o r e t e s t s = > 4 ; S K I P : { s k i p ( ' b e c a u s e w e a r e l e a r n i n g ' , 4 ) i f 1 ; f a i l ( ' A ' ) ; f a i l ( ' B ' ) ; p a s s ( ' C ' ) ; p a s s ( ' D ' ) ; } 1 . . 4 o k 1 # s k i p b e c a u s e w e a r e l e a r n i n g o k 2 # s k i p b e c a u s e w e a r e l e a r n i n g o k 3 # s k i p b e c a u s e w e a r e l e a r n i n g o k 4 # s k i p b e c a u s e w e a r e l e a r n i n g 26 / 53
  23. TODO T O D O : { l o c

    a l $ T O D O = ' w e a r e l e a r n i n g ' ; f a i l ( ' A ' ) ; f a i l ( ' B ' ) ; p a s s ( ' C ' ) ; p a s s ( ' D ' ) ; } 1 . . 4 n o t o k 1 - A # T O D O w e a r e l e a r n i n g # F a i l e d ( T O D O ) t e s t ' A ' # a t T . p m l i n e 6 . n o t o k 2 - B # T O D O w e a r e l e a r n i n g # F a i l e d ( T O D O ) t e s t ' B ' # a t T . p m l i n e 7 . o k 3 - C # T O D O w e a r e l e a r n i n g o k 4 - D # T O D O w e a r e l e a r n i n g A l l t e s t s s u c c e s s f u l . T e s t S u m m a r y R e p o r t - - - - - - - - - - - - - - - - - - - T . p m ( W s t a t : 0 T e s t s : 4 F a i l e d : 0 ) T O D O p a s s e d : 3 - 4 F i l e s = 1 , T e s t s = 4 , 0 w a l l c l o c k s e c s ( . . . ) R e s u l t : P A S S 27 / 53
  24. todo_skip T O D O : { l o c

    a l $ T O D O = ' w e a r e l e a r n i n g ' ; t o d o _ s k i p ( ' L e a r n i n g ! ' , 4 ) ; f a i l ( ' A ' ) ; f a i l ( ' B ' ) ; p a s s ( ' C ' ) ; p a s s ( ' D ' ) ; } n o t o k 1 # T O D O & S K I P L e a r n i n g ! n o t o k 2 # T O D O & S K I P L e a r n i n g ! n o t o k 3 # T O D O & S K I P L e a r n i n g ! n o t o k 4 # T O D O & S K I P L e a r n i n g ! 28 / 53
  25. BAIL_OUT r e q u i r e _ o

    k ( $ m o d u l e ) o r B A I L _ O U T ( " C a n ' t l o a d $ m o d u l e " ) ; 29 / 53
  26. Test::Class p a c k a g e M y

    : : C u b e : : T e s t ; u s e b a s e q w ( T e s t : : C l a s s ) ; u s e T e s t : : M o r e ; u s e M y : : C u b e ; s u b t e s t _ v o l u m e : T e s t ( 2 ) { m y ( $ s e l f ) = @ _ ; m y $ c u b e = M y : : C u b e - > n e w ( x = > 2 ) ; i s ( $ c u b e - > v o l u m e , 8 , ' r e g u l a r c u b e ' ) ; $ c u b e - > x ( 0 ) ; i s ( $ c u b e - > v o l u m e , 0 , ' t r i v i a l c u b e ' ) ; r e t u r n ; } s u b t e s t _ d i a g o n a l : T e s t ( 4 ) { . . . } 30 / 53
  27. setup, teardown p a c k a g e M

    y : : C u b e : : T e s t ; u s e b a s e q w ( T e s t : : C l a s s ) ; u s e T e s t : : M o r e ; u s e M y : : C u b e ; s u b i n i t _ c u b e : T e s t ( s e t u p ) { m y ( $ s e l f ) = @ _ ; $ s e l f - > { c u b e } = M y : : C u b e - > n e w ( x = > 2 ) ; } s u b t e s t _ v o l u m e : T e s t ( 2 ) { m y ( $ s e l f ) = @ _ ; i s ( $ s e l f - > { c u b e } - > v o l u m e , 8 , ' r e g u l a r c u b e ' ) ; $ s e l f - > { c u b e } - > x ( 0 ) ; i s ( $ s e l f - > { c u b e } - > v o l u m e , 0 , ' t r i v i a l c u b e ' ) ; r e t u r n ; } s u b t e s t _ d i a g o n a l : T e s t ( 4 ) { . . . } 31 / 53
  28. startup, shutdown u s e M y : : T

    e s t ; u s e b a s e q w ( T e s t : : C l a s s ) ; s u b d b _ c o n n e c t : T e s t ( s t a r t u p ) { s h i f t - > { d b i } = D B I - > c o n n e c t ; } s u b d b _ d i s c o n n e c t : T e s t ( s h u t d o w n ) { s h i f t - > { d b i } - > d i s c o n n e c t ; } p a c k a g e M y : : S o m e : : M o d u l e : : T e s t ; u s e b a s e q w ( M y : : T e s t ) ; 32 / 53
  29. Test::Class::Load u s e F o o : : T

    e s t ; u s e F o o : : B a r : : T e s t ; u s e F o o : : F r i b b l e : : T e s t ; u s e F o o : : N i : : T e s t ; T e s t : : C l a s s - > r u n t e s t s ; u s e T e s t : : C l a s s : : L o a d q w ( t / t e s t s t / l i b ) ; T e s t : : C l a s s - > r u n t e s t s ; p a c k a g e M y : : T e s t : : C l a s s ; u s e s t r i c t ; u s e w a r n i n g s ; u s e b a s e ' T e s t : : C l a s s ' ; I N I T { T e s t : : C l a s s - > r u n t e s t s } 1 ; 33 / 53
  30. TEST DESCRIPTIONS s u b o n e _ p

    l u s _ o n e _ i s _ t w o : T e s t { i s 1 + 1 , 2 ; } o k 1 - o n e p l u s o n e i s t w o 34 / 53
  31. TODO s u b l i v e _ t

    e s t : T e s t { l o c a l $ T O D O = " l i v e c u r r e n t l y u n i m p l e m e n t e d " ; o k ( O b j e c t - > l i v e , " o b j e c t l i v e " ) ; } 35 / 53
  32. Наследование p a c k a g e M y

    : : T e s t ; u s e b a s e q w ( T e s t : : C l a s s ) ; p a c k a g e M y : : S o m e : : M o d u l e : : T e s t ; u s e b a s e q w ( M y : : T e s t ) ; s u b S K I P _ C L A S S { 1 } p a c k a g e M y : : S o m e : : M o d u l e : : A : : T e s t ; u s e b a s e ( M y : : S o m e : : M o d u l e : : T e s t ) ; p a c k a g e M y : : S o m e : : M o d u l e : : B : : T e s t ; u s e b a s e ( M y : : S o m e : : M o d u l e : : T e s t ) ; 36 / 53
  33. Организация u s e L o c a l :

    : O K : : P o s t ; u s e L o c a l : : O K : : P o s t : : T e s t ; l i b / L o c a l / O K / P o s t . p m t / l i b / L o c a l / O K / P o s t / T e s t . p m t / c l a s s . t 37 / 53
  34. Test::Class::Moose p a c k a g e T e

    s t s F o r : : D a t e T i m e ; u s e T e s t : : C l a s s : : M o o s e ; u s e D a t e T i m e ; # m e t h o d s t h a t b e g i n w i t h t e s t _ a r e t e s t m e t h o d s . s u b t e s t _ c o n s t r u c t o r { m y $ t e s t = s h i f t ; $ t e s t - > t e s t _ r e p o r t - > p l a n ( 3 ) ; # s t r i c t l y o p t i o n a l c a n _ o k ' D a t e T i m e ' , ' n e w ' ; m y % a r g s = ( y e a r = > 1 9 6 7 , m o n t h = > 6 , d a y = > 2 0 , ) ; i s a _ o k m y $ d a t e = D a t e T i m e - > n e w ( % a r g s ) , ' D a t e T i m e ' ; i s $ d a t e - > y e a r , $ a r g s { y e a r } , ' . . . a n d t h e y e a r s h o u l d b e c o r r e c t ' ; } 1 ; 38 / 53
  35. Test::Deep m y $ n a m e _ r

    e = r e ( ' ^ ( M r | M r s | M i s s ) \ w + \ w + $ ' ) ; c m p _ d e e p l y ( $ p e r s o n , { N a m e = > $ n a m e _ r e , P h o n e = > r e ( q { ^ 0 d { 6 } $ } ) , C h i l d N a m e s = > a r r a y _ e a c h ( $ n a m e _ r e ) } , " p e r s o n o k " ) ; 39 / 53
  36. cmp_deeply c m p _ d e e p l

    y ( [ { 1 = > 2 } , { 3 = > 4 } ] , [ { 1 = > 2 } , { 3 = > 4 } ] , ) ; 40 / 53
  37. ignore() c m p _ d e e p l

    y ( [ { 1 = > 2 } , { 3 = > 4 } ] , [ { 1 = > 2 } , { 3 = > i g n o r e ( ) } ] , ) ; 41 / 53
  38. methods c m p _ d e e p l

    y ( $ o b j , m e t h o d s ( n a m e = > " J o h n " , [ " f a v o u r i t e " , " f o o d " ] = > " t a c o " ) ) ; c m p _ d e e p l y ( $ o b j , l i s t m e t h o d s ( n a m e = > " J o h n " , [ " f a v o u r i t e s " , " f o o d " ] = > [ " M a p o t o f u " , " G o n g b a o c h i c k e n " ] ) ) ; 42 / 53
  39. re c m p _ d e e p l

    y ( $ g o t , [ r e ( " f e r g " ) ] ) 43 / 53
  40. bag c m p _ d e e p l

    y ( [ 1 , 2 , 2 ] , b a g ( 2 , 2 , 1 ) ) 44 / 53
  41. all, any c m p _ d e e p

    l y ( $ g o t , a l l ( i s a ( " P e r s o n " ) , m e t h o d s ( n a m e = > ' J o h n ' ) ) ) a n y ( r e ( " ^ w i " ) , a l l ( i s a ( " P e r s o n " ) , m e t h o d s ( n a m e = > ' J o h n ' ) ) ) r e ( " ^ w i " ) | i s a ( " P e r s o n " ) & m e t h o d s ( n a m e = > ' J o h n ' ) 45 / 53
  42. array_each m y $ c o m m o n

    _ t e s t s = a l l ( i s a ( " M y F i l e " ) , m e t h o d s ( h a n d l e = > i s a ( " I O : : H a n d l e " ) f i l e n a m e = > r e ( " ^ / h o m e / t e d / t m p " ) , ) ) ; c m p _ d e e p l y ( $ g o t , a r r a y _ e a c h ( $ c o m m o n _ t e s t s ) ) ; 46 / 53
  43. Fixtures u s e T e s t : :

    D B I x : : C l a s s ; u s e D B I x : : C l a s s : : S c h e m a : : P o p u l a t e M o r e ; $ s c h e m a - > r e s u l t s e t ( $ s o u r c e _ n a m e ) - > p o p u l a t e ( [ . . . ] ) ; 47 / 53
  44. ...::PopulateMore m y $ s e t u p _

    r o w s = [ { G e n d e r = > { f i e l d s = > ' l a b e l ' , d a t a = > { m a l e = > ' m a l e ' , f e m a l e = > ' f e m a l e ' , } } } , { P e r s o n = > { f i e l d s = > [ ' n a m e ' , ' a g e ' , ' g e n d e r ' ] , d a t a = > { j o h n = > [ ' j o h n ' , 3 8 , " ! I n d e x : G e n d e r . m a l e " ] , j a n e = > [ ' j a n e ' , 4 0 , ' ! I n d e x : G e n d e r . f e m a l e ' ] , } } } , { F r i e n d L i s t = > { f i e l d s = > [ ' p e r s o n ' , ' f r i e n d ' , ' c r e a t e d _ d a t e ' ] , d a t a = > { j o h n _ j a n e = > [ ' ! I n d e x : P e r s o n . j o h n ' , ' ! I n d e x : P e r s o n . j a n e ' ' ! D a t e : M a r c h 3 0 , 1 9 9 6 ' , ] , } } } , ] ; 48 / 53
  45. DBIx::Class::Factory :­) p a c k a g e M

    y : : U s e r F a c t o r y ; u s e b a s e q w ( D B I x : : C l a s s : : F a c t o r y ) ; _ _ P A C K A G E _ _ - > r e s u l t s e t ( M y : : S c h e m a - > r e s u l t s e t ( ' U s e r ' ) ) ; _ _ P A C K A G E _ _ - > f i e l d s ( { n a m e = > _ _ P A C K A G E _ _ - > s e q ( s u b { ' U s e r # ' . s h i f t } ) , s t a t u s = > ' n e w ' , } ) ; p a c k a g e M y : : S u p e r U s e r F a c t o r y ; u s e b a s e q w ( D B I x : : C l a s s : : F a c t o r y ) ; _ _ P A C K A G E _ _ - > b a s e _ f a c t o r y ( ' M y : : U s e r F a c t o r y ' ) ; _ _ P A C K A G E _ _ - > f i e l d ( s u p e r u s e r = > 1 ) ; m y $ u s e r = M y : : U s e r F a c t o r y - > c r e a t e ( ) ; m y @ v e r i f i e d _ u s e r s = @ { M y : : U s e r F a c t o r y - > c r e a t e _ b a t c h ( 3 , { s t a t u s = > ' v e r i f i e d ' } ) } ; m y $ s u p e r u s e r = M y : : S u p e r U s e r F a c t o r y - > b u i l d ( ) ; $ s u p e r u s e r - > i n s e r t ( ) ; 49 / 53
  46. Test::MockModule; u s e M o d u l e

    : : N a m e ; u s e T e s t : : M o c k M o d u l e ; { m y $ m o d u l e = T e s t : : M o c k M o d u l e - > n e w ( ' M o d u l e : : N a m e ' ) ; $ m o d u l e - > m o c k ( ' s u b r o u t i n e ' , s u b { . . . } ) ; M o d u l e : : N a m e : : s u b r o u t i n e ( @ a r g s ) ; # m o c k e d } M o d u l e : : N a m e : : s u b r o u t i n e ( @ a r g s ) ; # o r i g i n a l s u b r o u t i n e 51 / 53
  47. Test::MockObject; u s e T e s t : :

    M o c k O b j e c t ; m y $ m o c k = T e s t : : M o c k O b j e c t - > n e w ( ) ; $ m o c k - > s e t _ t r u e ( ' s o m e m e t h o d ' ) ; o k ( $ m o c k - > s o m e m e t h o d ( ) ) ; $ m o c k - > s e t _ t r u e ( ' v e r i t a s ' ) - > s e t _ f a l s e ( ' f i c t a ' ) - > s e t _ s e r i e s ( ' a m i c a e ' , ' S u n n y ' , ' K y l i e ' , ' B e l l a ' ) ; 52 / 53
  48. ДЗ 11 .t­тест для задания про геометрические фигуры T e

    s t : : C l a s s ­тест для парсера Одноклассников 53 / 53