テスト駆動開発の進化
TRANSCRIPT
Developers Summit 2012
和智 右桂 グロースエクスパートナーズ株式会社
ソリューションデリバリー部 ITアーキテクト
#kansumiA3
テスト駆動開発の進化
Developers Summit 2012
自己紹介
§ 和智右桂(わち ゆうけい) § @digitalsoul0124
§ システム開発 § グロースエクスパートナーズ株式会社 § ITアーキテクト
§ 翻訳(鈍器系) § エリック・エヴァンスのドメイン駆動設計 § 継続的デリバリー
Developers Summit 2012
GOOS日本語版出版
Developers Summit 2012 2002 2007
テスト駆動開発の進化
Developers Summit 2012
Ø テスト駆動開発の進化とは?
Ø GOOSのポイント
Ø 開発の現場に活かすには?
Developers Summit 2012
テスト駆動開発の進化とは? テスト駆動開発の進化
Developers Summit 2012
TDDの基本的なサイクル レッド/グリーン/リファクタリング
Developers Summit 2012
テストコード
Moneyクラス
TDDの基本的なサイクル
クラスをひとつ書く場合なら テストコードも悩まず書ける
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/ by an untrained eye
Developers Summit 2012
モックについて
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
クラス構造
TimedCache
テスト ObjectLoader
load
ObjectLoaderの手前に、TimedCacheクラスを作る
Developers Summit 2012
呼び出しシーケンス
テストコード
lookup("KEY")
TimedCache ObjectLoader
"VALUE"
load("KEY")
"VALUE"
TimedCacheは、 最初に呼び出されたとき、ObjectLoaderにアクセスする
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
インターフェイスの発見
UI A
B
C
D
E
受け入れテスト
ユニットテスト1
ユニットテスト2
外から内へ
B
C D
E
インターフェイスを発見しながら、 外から内へ開発を進める
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
事前のドメイン分析
ドメインA
ドメインB
ドメインC
ユーザー 他システム ドメインD
業務分析からドメインを抽出 ドメインごとに特性を見極める
Developers Summit 2012
複雑さを吸収する場所 業務が複雑化すれば、 システムも複雑化する。 それをどこで受け止めるのか?
Entity
Entity Entity
Entity
Role
Role
Role
Role
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
ありがとうございました!