Slide 1

Slide 1 text

オブジェクトの振舞を 明確化するためのモック PHPメンターズ/日本Symfonyユーザー会 後藤 秀宣 @hidenorigoto 1 Symfony勉強会 #6 12೥6݄30೔౔༵೔

Slide 2

Slide 2 text

後藤秀宣(ごとうひでのり) PHPメンターズ 2 12೥6݄30೔౔༵೔

Slide 3

Slide 3 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 2 12೥6݄30೔౔༵೔

Slide 4

Slide 4 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight 2 12೥6݄30೔౔༵೔

Slide 5

Slide 5 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー 2 12೥6݄30೔౔༵೔

Slide 6

Slide 6 text

後藤秀宣(ごとうひでのり) PHPメンターズ • Symfonyユーザー会 • Symfony Midnight • 翻訳温泉ツアー • WEB+DB PRESS 2 12೥6݄30೔౔༵೔

Slide 7

Slide 7 text

3 WEB+DB PRESS vol. 69 12೥6݄30೔౔༵೔

Slide 8

Slide 8 text

4 WEB+DB PRESS vol.70 12೥6݄30೔౔༵೔

Slide 9

Slide 9 text

4 WEB+DB PRESS vol.70 • オブジェクト指向設計の 視点から見たモックフ レームワークの使い方 (Phake、Mockery) 12೥6݄30೔౔༵೔

Slide 10

Slide 10 text

何の話をするの? 5 12೥6݄30೔౔༵೔

Slide 11

Slide 11 text

何の話をするの? • ソフトウェアテスト寄りの話ではありま せん 5 12೥6݄30೔౔༵೔

Slide 12

Slide 12 text

何の話をするの? • ソフトウェアテスト寄りの話ではありま せん • オブジェクト指向設計寄りの話です 5 12೥6݄30೔౔༵೔

Slide 13

Slide 13 text

何の話をするの? • ソフトウェアテスト寄りの話ではありま せん • オブジェクト指向設計寄りの話です • Symfonyのテストコードを例に話します。 Symfonyのテストコードを読めるようにな ります 5 12೥6݄30೔౔༵೔

Slide 14

Slide 14 text

モックオブジェクトとは? 6 12೥6݄30೔౔༵೔

Slide 15

Slide 15 text

モックオブジェクトとは? • モックオブジェクト 6 12೥6݄30೔౔༵೔

Slide 16

Slide 16 text

モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ 6 12೥6݄30೔౔༵೔

Slide 17

Slide 17 text

モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト 6 12೥6݄30೔౔༵೔

Slide 18

Slide 18 text

モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト • テストコード側からメソッドの挙動 などを動的に定義(置き換え) 6 12೥6݄30೔౔༵೔

Slide 19

Slide 19 text

モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト • テストコード側からメソッドの挙動 などを動的に定義(置き換え) • オブジェクトのコラボレーションを検証 できる 6 12೥6݄30೔౔༵೔

Slide 20

Slide 20 text

環境 7 12೥6݄30೔౔༵೔

Slide 21

Slide 21 text

環境 • PHPUnitに同梱されたもの 7 12೥6݄30೔౔༵೔

Slide 22

Slide 22 text

環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject 7 12೥6݄30೔౔༵೔

Slide 23

Slide 23 text

環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject • PhakeやMockery(別のライブラリ)を PHPUnitと組み合わせて利用することも可 7 12೥6݄30೔౔༵೔

Slide 24

Slide 24 text

環境 • PHPUnitに同梱されたもの • PHPUnit_MockObject • PhakeやMockery(別のライブラリ)を PHPUnitと組み合わせて利用することも可 • 可読性が高いDSLを提供 7 12೥6݄30೔౔༵೔

Slide 25

Slide 25 text

PHPUnit_MockObject 8 12೥6݄30೔౔༵೔

Slide 26

Slide 26 text

PHPUnit_MockObject • モックを生成 8 12೥6݄30೔౔༵೔

Slide 27

Slide 27 text

PHPUnit_MockObject • モックを生成 • getMock() 8 12೥6݄30೔౔༵೔

Slide 28

Slide 28 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() 8 12೥6݄30೔౔༵೔

Slide 29

Slide 29 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() 8 12೥6݄30೔౔༵೔

Slide 30

Slide 30 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() • エクスペクテーション定義 8 12೥6݄30೔౔༵೔

Slide 31

Slide 31 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() • エクスペクテーション定義 • expects() 8 12೥6݄30೔౔༵೔

Slide 32

Slide 32 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() • エクスペクテーション定義 • expects() • method() 8 12೥6݄30೔౔༵೔

Slide 33

Slide 33 text

PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() • エクスペクテーション定義 • expects() • method() • will() 8 12೥6݄30೔౔༵೔

Slide 34

Slide 34 text

Symfonyのテストコード • 例:HttpKernelコンポーネントのKernel クラスのテストコード 9 12೥6݄30೔౔༵೔

Slide 35

Slide 35 text

10 12೥6݄30೔౔༵೔

Slide 36

Slide 36 text

11 bootは()バンドルとコンテナを初期化する 12೥6݄30೔౔༵೔

Slide 37

Slide 37 text

テスト対象をモック化 • これは特殊パターン • 通常はテスト対象オブジェクトはモックにしない • テスト対象と同一オブジェクトのメソッド呼び出し を検証する必要があったため、テスト対象そのもの をモック化している。 • Phake等でいうパーシャルモック • getMockBuilder()でモック化した後、必要なメソッ ドをsetMethods()で指定。その後expects()でエク スペクテーションを定義。 12 12೥6݄30೔౔༵೔

Slide 38

Slide 38 text

13 モックを使って • カーネルのboot()メソッド呼び出し時 に、必ず呼び出されるメソッドをテスト している 12೥6݄30೔౔༵೔

Slide 39

Slide 39 text

13 モックを使って • カーネルのboot()メソッド呼び出し時 に、必ず呼び出されるメソッドをテスト している boot()メソッドの振舞を テストしている 12೥6݄30೔౔༵೔

Slide 40

Slide 40 text

通常パターン • HttpKernelコンポーネントのKernelクラ スのテストコード 14 12೥6݄30೔౔༵೔

Slide 41

Slide 41 text

15 12೥6݄30೔౔༵೔

Slide 42

Slide 42 text

16 bootは()バンドルにコンテナをセットする モック生成 コラボレーション 12೥6݄30೔౔༵೔

Slide 43

Slide 43 text

17 モックを使って • カーネルのboot()メソッドにより、関連 しているバンドルオブジェクトの setContainer()が呼ばれることをテスト している 12೥6݄30೔౔༵೔

Slide 44

Slide 44 text

17 モックを使って • カーネルのboot()メソッドにより、関連 しているバンドルオブジェクトの setContainer()が呼ばれることをテスト している 関連オブジェクトとのイ ンタラクションを検証し ている 12೥6݄30೔౔༵೔

Slide 45

Slide 45 text

関連(隣接)オブジェクト 18 12೥6݄30೔౔༵೔

Slide 46

Slide 46 text

関連(隣接)オブジェクト 18 12೥6݄30೔౔༵೔

Slide 47

Slide 47 text

19 関連(隣接)オブジェクト 12೥6݄30೔౔༵೔

Slide 48

Slide 48 text

19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト 12೥6݄30೔౔༵೔

Slide 49

Slide 49 text

19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト • 通常、テストコードでモック化するのは 隣接オブジェクトのみ 12೥6݄30೔౔༵೔

Slide 50

Slide 50 text

19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト • 通常、テストコードでモック化するのは 隣接オブジェクトのみ • 隣接していないオブジェクトのモックを 作る必要がある場合、何か問題がある兆 候 12೥6݄30೔౔༵೔

Slide 51

Slide 51 text

20 ロール、責務、コラボレーション 12೥6݄30೔౔༵೔

Slide 52

Slide 52 text

20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) 12೥6݄30೔౔༵೔

Slide 53

Slide 53 text

20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 12೥6݄30೔౔༵೔

Slide 54

Slide 54 text

20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 • どのクラスにどの責務を割り当てるの か? 12೥6݄30೔౔༵೔

Slide 55

Slide 55 text

20 ロール、責務、コラボレーション • 責務駆動設計(オブジェクト指向設計) • 責務とコラボレーションを中心にクラス を設計していく手法。 • どのクラスにどの責務を割り当てるの か? • CRCカードによるクラスの発見、ロール ステレオタイプによる基本分類 12೥6݄30೔౔༵೔

Slide 56

Slide 56 text

Kernelの責務 21 12೥6݄30೔౔༵೔

Slide 57

Slide 57 text

Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる 21 12೥6݄30೔౔༵೔

Slide 58

Slide 58 text

Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る 21 12೥6݄30೔౔༵೔

Slide 59

Slide 59 text

Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る 21 12೥6݄30೔౔༵೔

Slide 60

Slide 60 text

Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る • shutdown()はすべてのバンドルの shutdown()を呼び出す 21 12೥6݄30೔౔༵೔

Slide 61

Slide 61 text

Kernelの責務 • テストコード(KernelTest.php)を見る ことで責務・振舞が分かる • bootは()バンドルとコンテナを初期化す る • bootは()バンドルにコンテナをセットす る • shutdown()はすべてのバンドルの shutdown()を呼び出す • etc 21 12೥6݄30೔౔༵೔

Slide 62

Slide 62 text

まとめ 22 12೥6݄30೔౔༵೔

Slide 63

Slide 63 text

まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である 22 12೥6݄30೔౔༵೔

Slide 64

Slide 64 text

まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である • ドメインの複雑な問題に取り組むスキル として、オブジェクト指向設計技術を少 しでも学ぼう 22 12೥6݄30೔౔༵೔

Slide 65

Slide 65 text

まとめ • オブジェクトを責務とコラボレーション の視点から実装していくにはモックオブ ジェクトの力が必要である • ドメインの複雑な問題に取り組むスキル として、オブジェクト指向設計技術を少 しでも学ぼう • 先人の知見の宝庫 22 12೥6݄30೔౔༵೔

Slide 66

Slide 66 text

23 ガイドとなる 技術・書籍 12೥6݄30೔౔༵೔

Slide 67

Slide 67 text

オブジェクト指向設計 • オブジェクトデザイ ン(レベッカ・ワー フスブラック/アラ ン・マクキーン) • ロール、責務、コラ ボレーション:責務 駆動設計についての 実践的な解説 24 12೥6݄30೔౔༵೔

Slide 68

Slide 68 text

オブジェクト指向開発 • Growing Object- Oriented Software, Guided by Tests(Steve Freeman/Nat Pryce) • 通称「GOOS本」 • 責務駆動設計とモッ クフレームワークを ベースにテスト駆動 開発する 25 12೥6݄30೔౔༵೔

Slide 69

Slide 69 text

オブジェクト指向開発 • アジャイルソフト ウェア開発の奥義 (ロバート・C・マー チン) ボブおじさん • アジャイル設計開 発、オブジェクト指 向設計の原則等 26 12೥6݄30೔౔༵೔

Slide 70

Slide 70 text

27 ありがとう ございました! 12೥6݄30೔౔༵೔