phpunitの mockobjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · phpunitの...

47
PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料 201165日日曜日

Upload: others

Post on 25-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

PHPUnitのMockObjectの紹介

Yoshio HANAWA(塙 与志夫)a.k.a. id:hnw

第4回Symfony2勉強会発表資料

2011年6月5日日曜日

Page 2: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

アジェンダ•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 3: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 4: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

自己紹介• id:hnw• round()の人•大好物:PHP本体のバグ

2011年6月5日日曜日

Page 5: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

自己紹介• id:hnw• round()の人•大好物:PHP本体のバグ•最近Symfony2案件がありました• DIとテスト、楽しい!

2011年6月5日日曜日

Page 6: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 7: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックが何だか

わかる方?2011年6月5日日曜日

Page 8: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

今日の目標•モックが何だか、だいたいわかる•MockObject試そう、って気になる

2011年6月5日日曜日

Page 9: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 10: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

PHPUnitの概要(1)

•テスティングフレームワーク• http://www.phpunit.de/• Symfony2で採用• limeは捨てました!•マニュアルの日本語版も充実

2011年6月5日日曜日

Page 11: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

PHPUnitの概要(2)

•機能充実!

2011年6月5日日曜日

Page 12: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

PHPUnitの概要(2)

•機能充実!

今日のテーマ

2011年6月5日日曜日

Page 13: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 14: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

通常のテスト

メソッドA

引数xなら

返り値yのはず

2011年6月5日日曜日

Page 15: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

どうテストする?(1)

•外部システムに依存するテスト•課金とか• DBアクセスとか

2011年6月5日日曜日

Page 16: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

どうテストする?(1)

メソッドA

引数xなら

返り値yのはず

メソッドB

DB

2011年6月5日日曜日

Page 17: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

どうテストする?(2)

•他に依存しているクラスの単体テスト•他のクラスのメソッドを呼び出している場合、誰のバグかわからない

2011年6月5日日曜日

Page 18: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

どうテストする?(2)

メソッドA

引数xなら

返り値yのはず

別クラスのメソッドB

2011年6月5日日曜日

Page 19: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

どこのご家庭でも共通の悩み

2011年6月5日日曜日

Page 20: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックが解決します

2011年6月5日日曜日

Page 21: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックとは

メソッドA

引数xなら

返り値yのはず

メソッドB(本物)

DB

2011年6月5日日曜日

Page 22: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックとは

メソッドA

引数xなら

返り値yのはず

メソッドB(モック)テスト用

ダミー値

2011年6月5日日曜日

Page 23: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックとは•本物のクラスオブジェクトにそっくりな、テスト用のオブジェクト

•本物と差し替えて使う• PHPUnit_MockObject→大抵のことが実現可能

2011年6月5日日曜日

Page 24: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

2011年6月5日日曜日

Page 25: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

クラスのモックは

2011年6月5日日曜日

Page 26: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

クラスのモックは

メソッドが

2011年6月5日日曜日

Page 27: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

クラスのモックは

メソッドが引数

2011年6月5日日曜日

Page 28: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

クラスのモックは

メソッドが引数

で返り値

2011年6月5日日曜日

Page 29: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

MockObject記述例$mock = $this->getMock(’Payment’);

$mock->expects($this->once())

->method(’authorize’)

->with(’1111-2222-3333-4444’)

->will($this->ReturnValue(false));

クラスのモックは

メソッドが引数

で返り値

1回呼ばれる

2011年6月5日日曜日

Page 30: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

getMock()メソッド

•指定されたクラスのニセモノを作る•元のメソッド名・メンバ名は全て維持•メソッドの中身は空っぽ

2011年6月5日日曜日

Page 31: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

何ができるの?• getMock()で作ったモックに対して•メソッドの置き換え•返り値の指定•メソッドの呼び出し回数のテスト•メソッド呼び出しの引数のテスト

2011年6月5日日曜日

Page 32: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

いつでも使える

わけじゃない2011年6月5日日曜日

Page 33: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックと疎結合(1)•密結合だとモックへ差し替えられないfunction authorize() {

$p = new Payment();

$p->authorize();

}

2011年6月5日日曜日

Page 34: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モックと疎結合(2)• DI設計なら差し替えられるfunction authorize(Payment $p) {

$p->authorize();

}

2011年6月5日日曜日

Page 35: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

DIいいよね

2011年6月5日日曜日

Page 36: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 37: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

テストしにくい!

メソッドA

引数xなら

返り値yのはず

メソッドB(本物)

DB

2011年6月5日日曜日

Page 38: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

スタブ化

メソッドA

引数xなら

返り値yのはず

メソッドB(モック)テスト用

ダミー値

2011年6月5日日曜日

Page 39: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

スタブ化

スタブによるテスト。「状態」を確認している

メソッドA

引数xなら

返り値yのはず

メソッドB(モック)テスト用

ダミー値

2011年6月5日日曜日

Page 40: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モック化

メソッドA

引数xなら

返り値yのはず

メソッドB(モック)テスト用

ダミー値

引数のチェック

呼ばれた回数のチェック

2011年6月5日日曜日

Page 41: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

モック化

メソッドA

引数xなら

返り値yのはず

メソッドB(モック)テスト用

ダミー値

引数のチェック

呼ばれた回数のチェック

モックによるテスト。「ふるまい」を確認している

2011年6月5日日曜日

Page 42: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

今までとは違うテストができるよ!

2011年6月5日日曜日

Page 43: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

Martin Fowlerさん曰く

•モックによるテストに自分は惹かれない。古典的テストで十分。

•惹かれた人は試せば?肌に合う人もいる。活躍する場所は確かにある。

「Mocks Aren't Stubs」より

2011年6月5日日曜日

Page 44: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

僕個人の意見

•テスト書くのが大変!•使いどころ•重要かつ複雑なビジネスロジック

2011年6月5日日曜日

Page 45: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

•自己紹介•今日の目標• PHPUnitの概要•MockObjectで出来ること•モックとスタブの違い•まとめ

2011年6月5日日曜日

Page 46: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

まとめ• PHPUnit_MockObjectを使って•スタブで古典的テスト•モックによる「ふるまい」のテスト• DI設計と親和性が高い•「差し替えるクラス」はモックも含む

2011年6月5日日曜日

Page 47: PHPUnitの MockObjectの紹介hnw.jp/pdf/symfony2study-20110604.pdf2011/06/04  · PHPUnitの MockObjectの紹介 Yoshio HANAWA(塙 与志夫) a.k.a. id:hnw 第4回Symfony2勉強会発表資料

ご清聴ありがとうございました

2011年6月5日日曜日