$30 off During Our Annual Pro Sale. View Details »

Symfony勉強会#6 オブジェクトの振舞を明確化するためのモックについて

Symfony勉強会#6 オブジェクトの振舞を明確化するためのモックについて

hidenorigoto

June 30, 2012
Tweet

More Decks by hidenorigoto

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. モックオブジェクトとは?
    • モックオブジェクト
    • テストダブルの1つ
    • テストの時に使う、代理オブジェク

    6
    12೥6݄30೔౔༵೔

    View Slide

  18. モックオブジェクトとは?
    • モックオブジェクト
    • テストダブルの1つ
    • テストの時に使う、代理オブジェク

    • テストコード側からメソッドの挙動
    などを動的に定義(置き換え)
    6
    12೥6݄30೔౔༵೔

    View Slide

  19. モックオブジェクトとは?
    • モックオブジェクト
    • テストダブルの1つ
    • テストの時に使う、代理オブジェク

    • テストコード側からメソッドの挙動
    などを動的に定義(置き換え)
    • オブジェクトのコラボレーションを検証
    できる
    6
    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. PHPUnit_MockObject
    8
    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. 10
    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  41. 15
    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. Kernelの責務
    • テストコード(KernelTest.php)を見る
    ことで責務・振舞が分かる
    • bootは()バンドルとコンテナを初期化す

    21
    12೥6݄30೔౔༵೔

    View Slide

  59. Kernelの責務
    • テストコード(KernelTest.php)を見る
    ことで責務・振舞が分かる
    • bootは()バンドルとコンテナを初期化す

    • bootは()バンドルにコンテナをセットす

    21
    12೥6݄30೔౔༵೔

    View Slide

  60. Kernelの責務
    • テストコード(KernelTest.php)を見る
    ことで責務・振舞が分かる
    • bootは()バンドルとコンテナを初期化す

    • bootは()バンドルにコンテナをセットす

    • shutdown()はすべてのバンドルの
    shutdown()を呼び出す
    21
    12೥6݄30೔౔༵೔

    View Slide

  61. Kernelの責務
    • テストコード(KernelTest.php)を見る
    ことで責務・振舞が分かる
    • bootは()バンドルとコンテナを初期化す

    • bootは()バンドルにコンテナをセットす

    • shutdown()はすべてのバンドルの
    shutdown()を呼び出す
    • etc
    21
    12೥6݄30೔౔༵೔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide