テスト駆動開発の進化

51
Developers Summit 2012 和智 右桂 グロースエクスパートナーズ株式会社 ソリューションデリバリー部 ITアーキテクト #kansumiA3 テスト駆動開発の進化

Upload: yukei-wachi

Post on 08-Jan-2017

21.266 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: テスト駆動開発の進化

Developers Summit 2012

和智 右桂 グロースエクスパートナーズ株式会社

ソリューションデリバリー部 ITアーキテクト

#kansumiA3

テスト駆動開発の進化

Page 2: テスト駆動開発の進化

Developers Summit 2012

自己紹介

§ 和智右桂(わち ゆうけい) § @digitalsoul0124

§ システム開発 § グロースエクスパートナーズ株式会社 §  ITアーキテクト

§ 翻訳(鈍器系) § エリック・エヴァンスのドメイン駆動設計 § 継続的デリバリー

Page 3: テスト駆動開発の進化

Developers Summit 2012

GOOS日本語版出版

Page 4: テスト駆動開発の進化

Developers Summit 2012 2002 2007

テスト駆動開発の進化

Page 5: テスト駆動開発の進化

Developers Summit 2012

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

Ø GOOSのポイント

Ø 開発の現場に活かすには?

Page 6: テスト駆動開発の進化

Developers Summit 2012

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

Page 7: テスト駆動開発の進化

Developers Summit 2012

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

Page 8: テスト駆動開発の進化

Developers Summit 2012

テストコード

Moneyクラス

TDDの基本的なサイクル

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

Page 9: テスト駆動開発の進化

Developers Summit 2012

TDDの基本的なサイクル

APサーバ

DBサーバ

他システム

本格的なアプリを作る場合、 どこから手をつければいいだろう?

Page 10: テスト駆動開発の進化

Developers Summit 2012

“まずは を書く”

TDDの黄金律

どんなテストを書けばよいだろう?

Page 11: テスト駆動開発の進化

Developers Summit 2012

受け入れテスト § システムが実装すべきフィーチャ

Menu http://www.flickr.com/photos/sifu_renka/6761779847/ by Sifu Renka

Page 12: テスト駆動開発の進化

Developers Summit 2012

システムのスライス § 受け入れテストはエンドツーエンドに

DB

他システム

UI端から端まで(End to End)

Page 13: テスト駆動開発の進化

Developers Summit 2012

進化したTDDサイクル

二重のテストループ

“Growing Object-Oriented Software, Guided by Tests” p.8より

Page 14: テスト駆動開発の進化

Developers Summit 2012 London assembly stair http://www.flickr.com/photos/mcginnly/2196879337 by mcginnly

外から内へ § 外側のテストは 進捗の指標に § 内側のテストは コードの質のため

Page 15: テスト駆動開発の進化

Developers Summit 2012

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

Page 16: テスト駆動開発の進化

Developers Summit 2012

コードを書くことから

ソフトウェアを作ることへ 356/365: An Evolution of Rivalry- for Matt http://www.flickr.com/photos/practicalowl/1468829205/ by an practicalowl

Page 17: テスト駆動開発の進化

Developers Summit 2012

GOOSのポイント テスト駆動開発の進化

Page 18: テスト駆動開発の進化

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

Page 19: テスト駆動開発の進化

Developers Summit 2012

モックについて

Page 20: テスト駆動開発の進化

Developers Summit 2012

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

クラスよりも

Page 21: テスト駆動開発の進化

Developers Summit 2012

網の目の中のオブジェクトは どうテストしたらいいだろう?

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

テスト

Page 22: テスト駆動開発の進化

Developers Summit 2012

モックの登場 隣り合うオブジェクトをモックに 差し替える

モッカリー

テスト

Page 23: テスト駆動開発の進化

Developers Summit 2012

具体例

Page 24: テスト駆動開発の進化

Developers Summit 2012

仕様 § オブジェクトをロードするフレームワークに対してキーを元にした検索を行い、その結果をキャッシュする

§ ロードされてから一定時間が経つと、そのインスタンスは使えなくなるので、時々リロードする

Page 25: テスト駆動開発の進化

Developers Summit 2012

クラス構造

TimedCache

テスト ObjectLoader

load

ObjectLoaderの手前に、TimedCacheクラスを作る

Page 26: テスト駆動開発の進化

Developers Summit 2012

呼び出しシーケンス

テストコード

lookup("KEY")

TimedCache ObjectLoader

"VALUE"

load("KEY")

"VALUE"

TimedCacheは、 最初に呼び出されたとき、ObjectLoaderにアクセスする

Page 27: テスト駆動開発の進化

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

Page 28: テスト駆動開発の進化

Developers Summit 2012

参考 § ロールをモックせよ

§ http://jmock.org/oopsla2004_ja.pdf

http://www.jmock.org/

Page 29: テスト駆動開発の進化

Developers Summit 2012

インターフェイスの発見

UI A

B

C

D

E

受け入れテスト

ユニットテスト1

ユニットテスト2

外から内へ

B

C D

E

インターフェイスを発見しながら、 外から内へ開発を進める

Page 30: テスト駆動開発の進化

Developers Summit 2012

オブジェクトの登場パターン § 分解(Breaking out)

§ あるオブジェクトが責務を持ちすぎている場合、ふるまいの凝集した単位を分割する

§ 発芽(Budding off) § 新しい概念が登場したときにプレースホルダー型をラップする(値)もしくは、サービスを定義する(オブジェクト)

§ 包含(Bundling up) § 関連するオブジェクトの集団をひとつのオブジェクトにまとめる

Page 31: テスト駆動開発の進化

Developers Summit 2012

ビジネスドメインの概念 § アプリケーションの中核は、 ビジネスドメインの言語を使って記述する

Business Ambassadors http://www.flickr.com/photos/number10gov/5345434419/ by The Prime Minister's Office

Page 32: テスト駆動開発の進化

Developers Summit 2012

あわせて読みたい

Page 33: テスト駆動開発の進化

Developers Summit 2012

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

Page 34: テスト駆動開発の進化

Developers Summit 2012

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

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

Page 35: テスト駆動開発の進化

Developers Summit 2012

ウォーキングスケルトン

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

§ フィーチャの薄いスライス § ただし、エンドツーエンドに

Page 36: テスト駆動開発の進化

Developers Summit 2012

継続的デリバリー まずは基盤をつくり、ビルド/デプロイ/テストを自動化する

問題を理解する アーキテクチャを定める

ビルド、デプロイ、テストの自動化

下準備

二重のループ

Page 37: テスト駆動開発の進化

Developers Summit 2012

あわせて読みたい

Page 38: テスト駆動開発の進化

Developers Summit 2012

中間のまとめ

Page 39: テスト駆動開発の進化

Developers Summit 2012

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

“Growing Object-Oriented Software, Guided by Tests” p.8より

Page 40: テスト駆動開発の進化

Developers Summit 2012

ふるまい駆動開発 テストを考えるということは、 外側から見たシステムのふるまいを 考えるということ

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

Page 41: テスト駆動開発の進化

Developers Summit 2012

開発の現場に活かすには テスト駆動開発の進化

Page 42: テスト駆動開発の進化

Developers Summit 2012

想定 § 受託開発 § お客様の業務を学びながら開発

§ 中規模~大規模 § 画面/帳票/バッチで200など § プログラマ30名程度 § ある程度のウォーターフォール

Page 43: テスト駆動開発の進化

Developers Summit 2012

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

...どうしよう?

Page 44: テスト駆動開発の進化

Developers Summit 2012

二重ループのさらに外

最初の受け入れテストは どうやって書いたらいいだろう?

問題を理解する アーキテクチャを定める

ビルド、デプロイ、テストの自動化

下準備

二重のループ

Page 45: テスト駆動開発の進化

Developers Summit 2012

Growing Object-Oriented Software, Guided by Tests

Page 46: テスト駆動開発の進化

Developers Summit 2012

事前のドメイン分析

ドメインA

ドメインB

ドメインC

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

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

Page 47: テスト駆動開発の進化

Developers Summit 2012

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

Entity

Entity Entity

Entity

Role

Role

Role

Role

Page 48: テスト駆動開発の進化

Developers Summit 2012

エンティティ主体のドメイン

§ ロジックがSQLに集約 § 設計すべきはデータパターン

Diagram http://www.flickr.com/photos/synx508/4817848887/ by synx508

Page 49: テスト駆動開発の進化

Developers Summit 2012

ロール主体のドメイン

§ ロジックがオブジェクト間の インタラクションに集約 § 設計すべきはシナリオパターン

Page 50: テスト駆動開発の進化

Developers Summit 2012

まとめ

Green Fields http://www.flickr.com/photos/21257551@N02/2258301753/ by Pollys Dad

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

Page 51: テスト駆動開発の進化

Developers Summit 2012

ありがとうございました!