Slideshare.net (beta)

 
Post To TwitterPost to Twitter
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 1 (more)

Test::Base

From miyagawa, 2 years ago

Shibuya.pm tech talk #6

2429 views  |  0 comments  |  0 favorites  |  53 downloads
 

Categories

Add Category
 
 

Tags

perl

 
 

Groups / Events

 
Embed
options

More Info

This slideshow is Public
Total Views: 2429
on Slideshare: 2429
from embeds: 0

Slideshow transcript

Slide 1: use Test::Base; Tatsuhiko Miyagawa miyagawa@gmail.com Six Apart, Ltd. / Shibuya Perl Mongers Shibuya.pm Tech Talks #7

Slide 2: Test::Base とは Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 3: データドリブン テストベースクラス Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 4: by Ingy döt Net Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 5: use Test::More? Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 6: use Test::Base! Test::More と互換のあるインターフェース Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 7: Test::More compatible u s e Te s t : : Mo r e ; p l a n t e s t s => 2 ; s u b c a me l i z e { l oc a l $_ = s hi f t ; s / _ ( w) / u c ( $ 1 ) / e g ; $ _; } i s c a me l i z e ( " f o o _ b a r " ) , " f o o Ba r " ; i s c a me l i z e ( " f o o _ b a r _ b a z " ) , " f o o B a r Ba z " ; Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 8: Test::More compatible u s e Te s t : : Ba s e ; p l a n t e s t s => 2 ; s u b c a me l i z e { l oc a l $_ = s hi f t ; s / _ ( w) / u c ( $ 1 ) / e g ; $ _; } i s c a me l i z e ( " f o o _ b a r " ) , " f o o Ba r " ; i s c a me l i z e ( " f o o _ b a r _ b a z " ) , " f o o B a r Ba z " ; Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 9: Test::Base-y code u s e Te s t : : Ba s e ; s u b c a me l i z e { l oc a l $_ = s hi f t ; s /_( w) /u c ( $ 1 ) /e g ; $ _; } f i l t e r s { i n p u t => ' c a me l i z e ' } __DATA__ === - - - i n p u t : f o o _b a r - - - e x p e c t e d : f o o Ba r === - - - i n p u t : f o o _b a r _b a z - - - e x p e c t e d : f o o Ba r Ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 10: Test::Base code # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === S i mp l e J S ON Te s t - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 11: TAP compatible % pr ove –l 0 1 - j s o n . t 01- j s on. . . . ok Al l t e s t s s uc c e s s f ul . F i l e s =1 , Te s t s =1 , 0 wa l l c l o c k s e c s ( 0 . 1 0 c u s r + 0. 02 c s y s = 0 . 1 2 CP U) Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 12: use Test::Base # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === S i mp l e J S ON Te s t - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 13: Block names # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === S i mp l e J S ON Te s t - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 14: Filters # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === S i mp l e J S ON Te s t - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 15: perldoc Test::Base::Filter Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 16: Define Filters # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === S i mp l e J S ON Te s t - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 17: Filter arguments === f i l t er ar gs --- i n p u t l i n e s a r r a y t a i l =2 J o i n f oo Ba r ba z --- e x p e c t e d c h o mp r e g e x p =x i s ba r . *ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 18: filters __DATA__ === t e s t 1 - - - i nput f oo ba r ba z xxx - - - e xpe c t e d quox yyy === t e s t 2 - - - i nput f oo ba r ba z xxx - - - e xpe c t e d quox yyy === t e s t 3 - - - i nput f oo ba r ba z xxx - - - e xpe c t e d quox yyy Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 19: filters f i l t e r s { i n p u t => [ ' f o o ' , ' b a r ' , ' b a z ' ] , e x p e c t e d => ' q u o x ' } ; __DATA__ === t e s t 1 - - - i nput xxx - - - e xpe c t e d yyy === t e s t 2 - - - i nput xxx - - - e xpe c t e d yyy === t e s t 3 - - - i nput xxx - - - e xpe c t e d yyy Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 20: run_is # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _ i s ' i n p u t ' => ' e x p e c t e d ' ; _ _ E ND_ _ === - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 21: Auto-diff 0 1 - j s o n . . . . NOK 1 # Fa i l e d t e s t ' # @ - 1 , 2 +1 , 2 @ @ @ # - {" f oo" : " ba r " } # +{ f o o => " b a r " } # xxx #' Requires Algorithm::Diff Turn off with no_diff() Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 22: run_is run_like run_unlike run_is_deeply run_compare Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 23: run_is default blocks # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _i s ; _ _ E ND_ _ === - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 24: run_is default blocks # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _ [ 0 ] ) } r u n _i s ; _ _ E ND_ _ === - - - xxx e va l j s on { f o o => " b a r " } - - - y y y c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 25: run_compare # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _[ 0 ] ) } r u n _c o mp a r e ; __END__ === - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } === - - - i nput e v a l j s on { f o o => [ " b a r " , " b a z " ] } - - - e xpe c t e d r e g e xp ba r . *ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 26: run_compare is default! # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _[ 0 ] ) } __END__ === - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } === - - - i nput e v a l j s on { f o o => [ " b a r " , " b a z " ] } - - - e xpe c t e d r e g e xp ba r . *ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 27: run # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; p l a n t e s t s => 1 * b l o c k s ; r un { my $ b l o c k = s h i f t ; i s J S ON: : S y c k : : Du mp ( $ b l o c k - >i n p u t ) , $ b l o c k - >e x p e c t e d , $ b l o c k - >n a me ; }; __END__ === - - - i nput e v a l { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 28: blocks() # 01- j s on. t u s e Te s t : : Ba s e ; u s e J S ON: : S y c k ; p l a n t e s t s => 1 * b l o c k s ; f o r my $ b l o c k ( b l o c k s ) { i s J S ON: : S y c k : : Du mp ( $ b l o c k - >i n p u t ) , $ b l o c k - >e x p e c t e d , $ b l o c k - >n a me ; } __END__ === - - - i nput e v a l { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 29: Block specific u s e Te s t : : Ba s e ; r u n _c o mp a r e ; __END__ === - - - ONLY - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } === - - - i nput e v a l j s on { f o o => [ " b a r " , " b a z " ] } - - - e xpe c t e d r e g e xp ba r . *ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 30: Block specific u s e Te s t : : Ba s e ; r u n _c o mp a r e ; __END__ === - - - S KI P - - - i nput e v a l j s on { f o o => " b a r " } - - - e x p e c t e d c h o mp {" f oo" : " ba r " } === - - - i nput e v a l j s on { f o o => [ " b a r " , " b a z " ] } - - - e xpe c t e d r e g e xp ba r . *ba z Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 31: Subclassing Test::Base # t /Te s t J S ON. p m p a c k a g e t : : Te s t J S ON; u s e Te s t : : Ba s e - Ba s e ; u s e J S ON: : S y c k ; p a c k a g e t : : Te s t J S ON: : F i l t e r ; u s e Te s t : : Ba s e : : F i l t e r – b a s e ; s u b j s o n { J S ON: : S y c k : : Du mp ( $ _[ 0 ] ) } # t /0 1 - j s o n . t u s e t : : Te s t J S ON; __END__ === - - - i nput e v a l j s on { f o o => " b a r " } - - - e xpe c t e d … Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 32: In your CPAN modules u s e i n c : : Mo d u l e : : I n s t a l l ; n a me ' F o o - Ba r ' ; a l l _f r o m ' l i b /F o o /Ba r . p m' ; u s e _t e s t _b a s e ; W i t e Al l ; r Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 33: Tips Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 34: Spiffy XXX XXX $ f o o = $ b a r ; W W $ba r ; W YYY $ b a z ; ZZZ $ q u o x ; Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 35: no chomp filters u s e Te s t : : Ba s e ; f i l t er s { i n p u t => ' c h o mp ' , e x p e c t e d => ' c h o mp ' } __END__ === - - - i nput f oo - - - e xpe c t ed ba r === - - - i nput f ooa ba - - - e xpe c t ed bz a a hi e pa Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 36: no chomp filters u s e Te s t : : Ba s e ; __END__ === - - - i nput : f oo - - - e xpe c t e d: ba r === - - - i nput : f ooa ba - - - e xpe c t e d: bz a a hi e pa Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 37: success tests vs. error tests # t /0 1 - s u c c e s s . t r u n _i s ' i n p u t ' => ' e x p e c t e d ' ; # t /0 2 - f a i l u r e . t r un { my $ b l o c k = s h i f t ; e v a l { … }; r u n _l i k e $ @ $ b l o c k - >e x p e c t e d ; , }; Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 38: Test : : Base に向かないテスト 複雑な API オブジェクト状態が変化 Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 39: Test::Base で うまくテストできない = 複雑な API Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 40: Design your API Sufficiently Advanced. © Damian Conway Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 41: References perldoc Test::Base http://search.cpan.org/~miyagawa/?R=D Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 42: JSAN Test.Base.js (PMConnect?) Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7

Slide 43: Refactoring Example http://yapc.kwiki.org/data-driven-testing/slide10.html Tatsuhiko Miyagawa 2007/10/10 Shibuya.pm #7