Slide 1

Slide 1 text

レガシー なプロダクトを テストしたかった話

Slide 2

Slide 2 text

自己紹介 トミー Github : @kazu9su Marketing Applications 入社4 年目

Slide 3

Slide 3 text

テストしたかったもの forSurvey 弊社の主要プロダクト マー ケティングリサー チツー ル 運用実績10 年 Web フレー ムワー ク無し バリバリの現役選手 作りなおす予定無し レガシー コー ド

Slide 4

Slide 4 text

レガシ~ ① require 地獄 < ? p h p r e q u i r e _ o n c e ( " D B / h o g e . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " T L / h o g e . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " T L / h o g e 2 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " T L / h o g e 3 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " T L / h o g e 4 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a 2 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a 3 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a 4 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a 5 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " C M / f u g a 6 . c l a s s . p h p " ) ; r e q u i r e _ o n c e ( " h o g e h o g e . p h p " ) ; r e q u i r e _ o n c e ( " f u g a f u g a . p h p " ) ; r e q u i r e _ o n c e ( " X M L / h o g e f u g a . c l a s s . p h p " ) ; . . . 以下略

Slide 5

Slide 5 text

レガシ~ ② 途中でexit i f ( $ _ S E S S I O N [ ' i d ' ] = = " " ) { e r r o r ( " S e s s i o n E r r o r . P l e a s e l o g i n a g a i n . " ) ; e x i t ; } i f ( ! $ _ S E S S I O N [ " a c c e s s _ p r i v i l e g e " ] ) { e r r o r ( " Y o u c a n n o t a c c e s s o n t h i s s e r v e r . " ) ; e x i t ; } $ d b C o n = n e w D B C o n ( ) ; i f ( ! $ d b C o n - > c o n n e c t ( k D B _ N A M E ) ) { e r r o r ( " F a i l e d t o c o n n e c t D B . " ) ; e x i t ; } . . . 以下略

Slide 6

Slide 6 text

レガシ~ ③ コンテキストで変わる定数 c o n f i g / ├ 0 0 1 / │ └ c o n s t . p h p └ 0 0 2 / └ c o n s t . p h p config/001/const.php d e f i n e ( " H O G E " , 1 ) ; config/002/const.php d e f i n e ( " H O G E " , 2 ) ;

Slide 7

Slide 7 text

レガシ~ ④

Slide 8

Slide 8 text

状況 ( 当然) テストは入ってない コー ドの大部分はベタ書き 単体でテストするのは難しい 何とかテストの仕組みを取り入れたい!

Slide 9

Slide 9 text

テストする単位を考えてみた

Slide 10

Slide 10 text

単位? 単体 ... クラス( の中の関数)? 機能 ... ある一連の機能? e2e ... システム全体?

Slide 11

Slide 11 text

機能?

Slide 12

Slide 12 text

index.php < ? p h p h e a d e r ( " C o n t e n t - T y p e : t e x t / h t m l " ) ; h e a d e r ( ' L o c a t i o n : h t t p : / / w w w . e x a m p l e . c o m / ' ) ; s e s s i o n _ s t a r t ( ) ; $ i d = $ _ S E S S I O N [ ' i d ' ] ; $ u s e r n a m e = $ _ G E T [ ' u s e r n a m e ' ] ; . . . e c h o ( ' O K ' ) ; e x i t ; ? >

Slide 13

Slide 13 text

スクリプト単位で テストできればいいんじゃない?

Slide 14

Slide 14 text

そこで

Slide 15

Slide 15 text

作ってみた

Slide 16

Slide 16 text

< ? p h p c l a s s I n d e x T e s t e x t e n d s P H P U n i t _ F r a m e w o r k _ T e s t C a s e { p u b l i c f u n c t i o n t e s t I n d e x ( ) { $ t e s t e r = n e w F u n c t i o n a l T e s t e r \ F u n c t i o n a l T e s t e r ( ) ; $ t e s t e r - > s e t S e s s i o n ( [ ' i d ' = > ' h o g e h o g e ' ] ) ; $ t e s t e r - > s e t D o c u m e n t R o o t ( ' / p a t h / t o / s r c ' ) ; $ t e s t e r - > s e t I n c l u d e P a t h ( ' . : / u s r / b i n / p h p ' ) ; $ r e s p o n s e = $ t e s t e r - > g e t ( ' i n d e x . p h p ' , [ ' u s e r n a m e ' = > ' h o g e h o g e ' $ t h i s - > a s s e r t E q u a l s ( 2 0 0 , $ r e s p o n s e - > g e t S t a t u s C o d e ( ) ) ; $ t h i s - > a s s e r t E q u a l s ( ' O K ' , $ r e s p o n s e - > g e t B o d y ( ) ) ; } }

Slide 17

Slide 17 text

実現できたこと スクリプト単位での機能テスト レガシー なプロダクトをテストできる環境

Slide 18

Slide 18 text

とはいえ 網羅テストはできない 単体テストしたい

Slide 19

Slide 19 text

まとめ レガシー コー ドでもテストはできる 銀の弾丸ではない テスト楽しい!

Slide 20

Slide 20 text

ご清聴ありがとうございました