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

"Specification by Example" by example

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

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