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

"Specification by Example" by example

"Specification by Example" by example

Leszek Prabucki

March 07, 2014
Tweet

More Decks by Leszek Prabucki

Other Decks in Programming

Transcript

  1. GOAL: MAKE OUR INTERNAL TIME MANAGEMENT EASIER SO WE WILL

    BE ABLE TO DECREASE WORK NEEDED FOR GENERATING TIME REPORTS
  2. F e a t u r e : M a

    n a g i n g t i m e s p e n t o n t a s k s A s a e m p l o y e e I w a n t t o m a n a g e m y s p e n t t i m e o n t a s k i n o r d e r t o g e t p a i d f o r m y w o r k t i m e S c e n a r i o : D e f i n e s s p e n t t i m e o n t a s k S c e n a r i o : R e d e f i n e t i m e a d d e d b e f o r e
  3. F e a t u r e : M a

    n a g i n g t i m e s p e n t o n t a s k s A s a e m p l o y e e I w a n t t o m a n a g e m y s p e n t t i m e o n t a s k i n o r d e r t o g e t p a i d f o r m y w o r k t i m e S c e n a r i o : D e f i n e s s p e n t t i m e o n t a s k G i v e n I a m e m p l o y e e W h e n I d e f i n e s t h a t I s p e n t t i m e o n s o m e t a s k T h e n I s e e t h a t t i m e o n m y c a l e n d a r S c e n a r i o : R e d e f i n e t i m e a d d e d b e f o r e G i v e n I a m e m p l o y e e A n d I d e f i n e d t h a t I s p e n t t i m e o n s o m e t a s k W h e n I r e d e f i n e s t h i s t i m e T h e n I s e e e d i t e d t i m e o n m y c a l e n d a r
  4. F e a t u r e : M a

    n a g i n g t i m e s p e n t o n t a s k s A s a e m p l o y e e I w a n t t o m a n a g e m y s p e n t t i m e o n t a s k i n o r d e r t o g e t p a i d f o r m y w o r k t i m e B a c k g r o u n d : G i v e n c o m p a n y a v a l t o n h a s s u c h e m p l o y e e s : | f i r s t n a m e | l a s t n a m e | e m a i l | | L e s z e k | P r a b u c k i | l e s z e k . p r a b u c k i + s b e @ g m a i l . c o m | | J a n | K o w a l s k i | j k @ a v a l t o n . c o m | A n d c o m p a n y a v a l t o n h a s s u c h t a s k s : | c o d e | n a m e | | A Z G - D E V | A v a z a n g a d e v e l o p i n g | A n d I a m " L e s z e k P r a b u c k i " e m p l o y e e S c e n a r i o : D e f i n e s s p e n t t i m e o n t a s k W h e n I a m l o g g e d i n A n d I d e f i n e s t h a t t i m e f r o m 9 a m t o 3 p m I s p e n t o n t h e " A v a z a n g a d e v e l o p i n g " t a s k T h e n I n m y c a l e n d a r A n d I s h o u l d s e e t h a t " A v a z a n g a d e v e l o p i n g " t a s k t a k e s m e 6 h o u r s t o d a y S c e n a r i o : R e d e f i n e t i m e a d d e d b e f o r e G i v e n I d e f i n e d t h a t t i m e f r o m 9 a m t o 3 p m I s p e n t o n t h e " A v a z a n g a d e v e l o p i n g " t a s k W h e n I a m l o g g e d i n A n d I d e f i n e s t h a t t i m e f r o m 9 a m t o 2 p m I s p e n t o n t h e " A v a z a n g a d e v e l o p i n g " t a s k T h e n I n m y c a l e n d a r A n d I s h o u l d s e e t h a t " A v a z a n g a d e v e l o p i n g " t a s k t a k e s m e 5 h o u r s t o d a y
  5. SPECIFICATION LAYERS Business specification layer (BEHAT + selenium) Client unit

    specification layer (jasmine) API specification layer (BEHAT + symfony driver) API units specification layer (phpspec)
  6. EXAMPLE BUSINESS LAYER STEP IMPLEMENTATION F e a t u

    r e : M a n a g i n g t i m e s p e n t o n t a s k s A s a e m p l o y e e I w a n t t o m a n a g e m y s p e n t t i m e o n t a s k i n o r d e r t o g e t p a i d f o r m y w o r k t i m e B a c k g r o u n d : A n d c o m p a n y a v a l t o n h a s s u c h t a s k s : | c o d e | n a m e | | A Z G - D E V | A v a z a n g a d e v e l o p i n g | c l a s s F e a t u r e C o n t e x t e x t e n d s R a w M i n k C o n t e x t { / * * * @ G i v e n / ^ c o m p a n y ( [ a - z A - Z ] + ) h a s s u c h t a s k s : $ / * / p u b l i c f u n c t i o n c o m p a n y H a s S u c h T a s k s ( $ c o m p a n y N a m e , T a b l e N o d e $ t a b l e ) { $ c o m p a n y I d = $ t h i s - > g e t C o m p a n y I d ( $ c o m p a n y N a m e ) ; f o r e a c h ( $ t a b l e - > g e t H a s h ( ) a s $ r o w ) { $ t h i s - > i n s e r t C o m p a n y ( $ c o m p a n y I d , $ r o w ) ; } } }
  7. EXAMPLE CLIENT SPECIFICATION IMPLEMENTATION b e f o r e

    E a c h ( i n j e c t ( f u n c t i o n ( $ c o n t r o l l e r , $ r o o t S c o p e , $ s t a t e , $ q ) { / / m o c k a j a x r e s t r e s p o n s e } ) ; i t ( ' a d d s t i m e r o w s f r o m a p i t o s c o p e ' , i n j e c t ( f u n c t i o n ( ) { s c o p e . $ a p p l y ( ) ; v a r t i m r o w s = [ { f r o m : " 2 0 1 4 - 0 3 - 0 7 T 1 2 : 0 0 : 0 0 Z " , t o : " 2 0 1 4 - 0 3 - 0 7 T 1 3 : 0 5 : 0 0 Z " , t a s k : " 1 " , d e s c r i p t i o n : " P r e p a r i n g f o r p h p e r s " } ] ; e x p e c t ( s c o p e . t i m e r o w s ) . t o E q u a l ( e x p e c t e d T r e e ) ; } ) ) ; } ) ;
  8. API SPECIFICATION IMPLEMENTATION F e a t u r e

    : M a n a g e t i m e s h e e t s A s a A P I c l i e n t I w a n t t o m a n a g e m y t i m e s h e e t s S c e n a r i o : S h o w m y t i m e r o w s G i v e n I s e n d " G E T " r e q u e s t t o " / u s e r s / l e s z e k - p / t i m e r o w s " T h e n t h e r e s p o n s e s t a t u s c o d e s h o u l d b e 2 0 0 A n d I s h o u l d s e e j s o n : " " " [ { " i d " : 2 , " d e s c r i p t i o n " : " P r e p a r i n g f o r p h p e r s " , " f r o m " : " 2 0 1 4 - 0 3 - 0 7 T 1 2 : 0 0 : 0 0 Z " , " t o " : " 2 0 0 7 - 1 2 - 0 1 T 1 5 : 5 0 : 0 0 + 0 0 0 0 " , " l e v e l " : 1 , " _ l i n k s " : { " s e l f " : { " h r e f " : " h t t p : / / l o c a l h o s t / t i m e r o w s / 2 " } } } ] " " "
  9. API UNIT SPECIFICATION IMPLEMENTATION c l a s s T

    i m e r o w s C o n t r o l l e r S p e c e x t e n d s O b j e c t B e h a v i o r { f u n c t i o n l e t ( V i e w H a n d l e r I n t e r f a c e $ v i e w H a n d l e r , T i m e r o w R e p o s i t o r y $ t i m e r o w R e p o s i t o r y ) { $ t h i s - > b e C o n s t r u c t e d W i t h ( $ v i e w H a n d l e r , $ t i m e r o w R e p o s i t o r y ) ; } f u n c t i o n i t _ g e t s _ t i m e r o w s ( V i e w H a n d l e r I n t e r f a c e $ v i e w H a n d l e r , T i m e r o w R e p o s i t o r y $ t i m e r o w R e p o s i t o r y , R e s p o n s e $ r e s p o n s e ) { $ t i m e r o w R e p o s i t o r y - > f i n d U s e r T i m e r o w s ( ' l - p r a b u c k i ' ) - > w i l l R e t u r n ( [ $ t i m e r o w ] ) ; $ v i e w H a n d l e r - > h a n d l e ( A r g u m e n t : : t h a t ( f u n c t i o n ( V i e w $ v i e w ) u s e ( $ t i m e r o w ) { r e t u r n $ v i e w - > g e t D a t a ( ) [ 0 ] = = $ t i m e r o w s ; } ) ) - > s h o u l d B e C a l l e d ( ) - > w i l l R e t u r n ( $ r e s p o n s e ) ; $ t h i s - > g e t T i m e r o w s A c t i o n ( ' l - p r a b u c k i ' ) - > s h o u l d B e ( $ r e s p o n s e ) ; } }