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

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

Ba8ecb9f1d269e44056ff4e7dca4c5e0?s=128

hidenorigoto

June 30, 2012
Tweet

Transcript

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  18. モックオブジェクトとは? • モックオブジェクト • テストダブルの1つ • テストの時に使う、代理オブジェク ト • テストコード側からメソッドの挙動

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

    などを動的に定義(置き換え) • オブジェクトのコラボレーションを検証 できる 6 12೥6݄30೔౔༵೔
  20. 環境 7 12೥6݄30೔౔༵೔

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

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

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

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

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

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

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

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

  29. PHPUnit_MockObject • モックを生成 • getMock() • getMockBuilder() • disableOriginalConstructor() 8

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

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

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

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

    エクスペクテーション定義 • expects() • method() • will() 8 12೥6݄30೔౔༵೔
  34. Symfonyのテストコード • 例:HttpKernelコンポーネントのKernel クラスのテストコード 9 12೥6݄30೔౔༵೔

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

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

  37. テスト対象をモック化 • これは特殊パターン • 通常はテスト対象オブジェクトはモックにしない • テスト対象と同一オブジェクトのメソッド呼び出し を検証する必要があったため、テスト対象そのもの をモック化している。 •

    Phake等でいうパーシャルモック • getMockBuilder()でモック化した後、必要なメソッ ドをsetMethods()で指定。その後expects()でエク スペクテーションを定義。 12 12೥6݄30೔౔༵೔
  38. 13 モックを使って • カーネルのboot()メソッド呼び出し時 に、必ず呼び出されるメソッドをテスト している 12೥6݄30೔౔༵೔

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

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

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

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

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

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

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

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

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

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

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

  50. 19 関連(隣接)オブジェクト • 対象オブジェクトと直接関連を持つオブ ジェクト • 通常、テストコードでモック化するのは 隣接オブジェクトのみ • 隣接していないオブジェクトのモックを

    作る必要がある場合、何か問題がある兆 候 12೥6݄30೔౔༵೔
  51. 20 ロール、責務、コラボレーション 12೥6݄30೔౔༵೔

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

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

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

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

    • CRCカードによるクラスの発見、ロール ステレオタイプによる基本分類 12೥6݄30೔౔༵೔
  56. Kernelの責務 21 12೥6݄30೔౔༵೔

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

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

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

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

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

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

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

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

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

    先人の知見の宝庫 22 12೥6݄30೔౔༵೔
  66. 23 ガイドとなる 技術・書籍 12೥6݄30೔౔༵೔

  67. オブジェクト指向設計 • オブジェクトデザイ ン(レベッカ・ワー フスブラック/アラ ン・マクキーン) • ロール、責務、コラ ボレーション:責務 駆動設計についての

    実践的な解説 24 12೥6݄30೔౔༵೔
  68. オブジェクト指向開発 • Growing Object- Oriented Software, Guided by Tests(Steve Freeman/Nat

    Pryce) • 通称「GOOS本」 • 責務駆動設計とモッ クフレームワークを ベースにテスト駆動 開発する 25 12೥6݄30೔౔༵೔
  69. オブジェクト指向開発 • アジャイルソフト ウェア開発の奥義 (ロバート・C・マー チン) ボブおじさん • アジャイル設計開 発、オブジェクト指

    向設計の原則等 26 12೥6݄30೔౔༵೔
  70. 27 ありがとう ございました! 12೥6݄30೔౔༵೔