SlideShare a Scribd company logo
テスト駆動開発の進化	




#kansumiA3 和智 右桂	
                    グロースエクスパートナーズ株式会社	
                    ソリューションデリバリー部 ITアーキテクト	
                                 	
        Developers Summit 2012
自己紹介

§  和智右桂(わち ゆうけい)
 §  @digitalsoul0124
§  システム開発
 §  グロースエクスパートナーズ株式会社
 §  ITアーキテクト
§  翻訳(鈍器系)
 §  エリック・エヴァンスのドメイン駆動設計
 §  継続的デリバリー
                Developers Summit 2012
GOOS日本語版出版




      Developers Summit 2012
テスト駆動開発の進化




  2002   Developers Summit 2012
                                  2007
Ø テスト駆動開発の進化とは?

Ø GOOSのポイント

Ø 開発の現場に活かすには?
       Developers Summit 2012
テスト駆動開発の進化

テスト駆動開発の進化とは?


             Developers Summit 2012
TDDの基本的なサイクル
レッド/グリーン/リファクタリング




      Developers Summit 2012
TDDの基本的なサイクル

クラスをひとつ書く場合なら
テストコードも悩まず書ける

   テスト                     Money
   コード                       クラス




         Developers Summit 2012
TDDの基本的なサイクル
本格的なアプリを作る場合、
どこから手をつければいいだろう?

                              他システム

      APサーバ



                     DBサーバ

     Developers Summit 2012
TDDの黄金律


“まずは                            を書く”  




 どんなテストを書けばよいだろう?
       Developers Summit 2012
受け入れテスト
§  システムが実装すべきフィーチャ




      Menu http://www.flickr.com/photos/sifu_renka/6761779847/ by Sifu Renka	
             Developers Summit 2012
システムのスライス
§  受け入れテストはエンドツーエンドに


                                  他システム



                                      DB


    UI

     端から端まで(End to End)
         Developers Summit 2012
進化したTDDサイクル




   二重のテストループ
                    “Growing Object-Oriented Software, Guided by Tests” p.8より	


     Developers Summit 2012
外から内へ
§  外側のテストは
   進 の指標に




§  内側のテストは
   コードの質のため
          London assembly stair http://www.flickr.com/photos/mcginnly/2196879337 by mcginnly	
         Developers Summit 2012
テスト駆動開発の進化とは…




    Developers Summit 2012
コードを書くことから




  356/365: An Evolution of Rivalry- for Matt http://www.flickr.com/photos/practicalowl/1468829205/ by an practicalowl	




  ソフトウェアを作ることへ               Developers Summit 2012
テスト駆動開発の進化

GOOSのポイント


             Developers Summit 2012
GOOSのポイントとは?

• モック
• ウォーキングスケルトン




    I Just Have To Make One More Call, He Said http://www.flickr.com/photos/an_untrained_eye/2524462429/
                     Developers Summit 2012                                            by an untrained eye
モックについて




  Developers Summit 2012
オブジェクト指向観
オブジェクト指向システムは協力し
合うオブジェクトの網の目のようなも
のだ




クラスよりも
      Developers Summit 2012
網の目の中のオブジェクトは
 どうテストしたらいいだろう?



テスト                                       ?	




      ?	
                                ?	


                    “Growing Object Oriented Software, Guided By Tests” p.19の図を元に作成	


            Developers Summit 2012
モックの登場
隣り合うオブジェクトをモックに
差し替える
            モッカリー


テスト                                  ?	




      ?	
                            ?	
            Developers Summit 2012
具体例




Developers Summit 2012
仕様
§ オブジェクトをロードするフレー
   ムワークに対してキーを元にした
   検索を行い、その結果をキャッ
   シュする
§ ロードされてから一定時間が経つ
   と、そのインスタンスは使えなく
   なるので、時々リロードする

      Developers Summit 2012
クラス構造
ObjectLoaderの手前に、
TimedCacheクラスを作る


              Timed                     Object
 テスト
              Cache                     Loader
                                 load




        Developers Summit 2012
呼び出しシーケンス
TimedCacheは、
最初に呼び出されたとき、
ObjectLoaderにアクセスする
 テストコード         TimedCache                ObjectLoader


      lookup("KEY")
                                  load("KEY")

                                    "VALUE"

          "VALUE"

               Developers Summit 2012
テストコード
@Test
public void キャッシュされていないオブジェクトはロードする()
  throws Exception {
      final ObjectLoader mockLoader
         = context.mock(ObjectLoader.class);
      context.checking(new Expectations() {
          {
            oneOf(mockLoader).load("KEY");
            will(returnValue("VALUE"));
          }
      });
      TimedCache cache = new TimedCache(mockLoader);
      assertThat((String) cache.lookup("KEY"), is("VALUE"));
}	
                          Developers Summit 2012
参考
§ ロールをモックせよ
 §  http://jmock.org/oopsla2004_ja.pdf




                                       http://www.jmock.org/	
              Developers Summit 2012
インターフェイスの発見
インターフェイスを発見しながら、
外から内へ開発を進める
                                 B

受け入れ
       UI         A          B
 テスト
                                                D

                         C       C          D


        ユニット
                                        E       E
        テスト1

                      ユニット
                      テスト2



                      外から内へ

               Developers Summit 2012
オブジェクトの登場パターン
§  分解(Breaking out)
  §  あるオブジェクトが責務を持ちすぎている
      場合、ふるまいの凝集した単位を分割する
§  発芽(Budding off)
  §  新しい概念が登場したときにプレースホル
      ダー型をラップする(値)もしくは、サービ
      スを定義する(オブジェクト)
§  包含(Bundling up)
  §  関連するオブジェクトの集団をひとつのオ
      ブジェクトにまとめる
             Developers Summit 2012
ビジネスドメインの概念
§  アプリケーションの中核は、
   ビジネスドメインの言語を使って記述する




   Business Ambassadors http://www.flickr.com/photos/number10gov/5345434419/ by The Prime Minister's Office	
                               Developers Summit 2012
あわせて読みたい




     Developers Summit 2012
ウォーキングスケルトン
   について



   Developers Summit 2012
最初のフィーチャのパラドクス
§  フィーチャをエンドツーエンドに開発
§  テスト基盤も同時に開発




  Paradox of Freedom: the leash http://www.flickr.com/photos/theilr/4265521288/ by theilr	

                                   Developers Summit 2012
ウォーキングスケルトン
§  フィーチャの薄いスライス
§  ただし、エンドツーエンドに




      Cake http://www.flickr.com/photos/rosada/7244940166/ by TAU*	

               Developers Summit 2012
継続的デリバリー
まずは基盤をつくり、ビルド/デプロイ
/テストを自動化する
 下準備
           アーキテクチャを              ビルド、デプロイ、テストの
 問題を理解する
             定める                      自動化




               二重のループ



             Developers Summit 2012
あわせて読みたい




     Developers Summit 2012
中間のまとめ




 Developers Summit 2012
フィードバックループ
§  エンドツーエンドのベースを作ろう
§  一フィーチャずつ差し込んでいこう




          “Growing Object-Oriented Software, Guided by Tests” p.8より	
       Developers Summit 2012
ふるまい駆動開発
テストを考えるということは、
外側から見たシステムのふるまいを
考えるということ




          Just lookin' in http://www.flickr.com/photos/eyesore9/4223978728/ by eyesore9	

      Developers Summit 2012
テスト駆動開発の進化

開発の現場に活かすには


             Developers Summit 2012
想定
§ 受託開発
 § お客様の業務を学びながら開発
§ 中規模∼大規模
 § 画面/帳票/バッチで200など
 § プログラマ30名程度
 § ある程度のウォーターフォール


          Developers Summit 2012
...どうしよう?




Puzzled http://www.flickr.com/photos/54027476@N07/4999919941/ by andy.brandon50	

                      Developers Summit 2012
二重ループのさらに外
最初の受け入れテストは
どうやって書いたらいいだろう?
下準備
          アーキテクチャを              ビルド、デプロイ、テストの
問題を理解する
            定める                      自動化




              二重のループ



            Developers Summit 2012
Growing
Object-Oriented
Software,
Guided by Tests
      Developers Summit 2012
事前のドメイン分析

業務分析からドメインを抽出
ドメインごとに特性を見極める

                         ドメインC


       ドメインA
                                        ドメインD

ユーザー                                            他システム
                  ドメインB


               Developers Summit 2012
複雑さを吸収する場所
業務が複雑化すれば、
システムも複雑化する。
それをどこで受け止めるのか?
        Role
                                 Entity
 Role

           Role                  Entity   Entity



           Role                  Entity

               Developers Summit 2012
エンティティ主体のドメイン
§ ロジックがSQLに集約
§ 設計すべきはデータパターン




    Diagram http://www.flickr.com/photos/synx508/4817848887/ by synx508	
                      Developers Summit 2012
ロール主体のドメイン
§ ロジックがオブジェクト間の
   インタラクションに集約
§ 設計すべきはシナリオパターン




       Developers Summit 2012
まとめ
§ 作るべきものの特性を見極め、
   それに合わせたアーキテクチャを
   策定しよう
§ アーキテクチャとは
   成長の方向性を
   規定する型だ


      Green Fields http://www.flickr.com/photos/21257551@N02/2258301753/ by Pollys Dad	
      Developers Summit 2012
ありがとうございました!
    Developers Summit 2012

More Related Content

テスト駆動開発の進化