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

"Specification by Example" by example

"Specification by Example" by example

Avatar for Leszek Prabucki

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 ) ; } }