SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
Phakeで簡単
モックオブジェクト作成
   Katsuhiro OGAWA @fivestr
   2012.03.27 - PHP勉強会@東京 #58
2

About Me
小川 雄大 - OGAWA Katsuhiro @fivestr

株式会社クロコス

  会社では高橋って呼ばれてます

パーフェクトPHP書きました

5月にもPHPの本出すみたいです (色々未定)

  OOP、MVC、DDD
3
       Agenda

スタブとモック

Phakeとは

Phake API
Phakeのインストール
4

テストが遅い?
DBやIO、Web APIなどへのアクセスを伴う処理のテス
トってどうしてますか?

DBアクセスしてたらテストが遅くなったりするし、Web
APIだとネットワークにつながってないとテストできない
ですよね

そんなときはスタブの出番です
5

スタブとは
前述のような外部の何かへのアクセスの代わりに定数を
返すようにしたものがスタブ

 stub out - もみ消す

従来:  return $webservice->api($id);

スタブ: return [‘id’ => ‘1’, ‘name’ => ‘takahashi’];

 定数に置き換える
6
サンプル
Facebookクラスは
Facebookが提供する
PHP SDK。
api()メソッドでAPIへ
アクセス

Clientクラスは
Facebookオブジェク
トを使ってデータアク
セス
7
スタブで差し替え
Facebookクラスの
api()メソッドを上書き
して定数を返すように
すれば、Web APIへの
アクセスをなくせる

上位モジュール

下位モジュール
8

スタブの活用
スタブを使うと、DBやWeb APIといった、外部の何かへ
の依存を切り離すことが可能

外部の何かへのアクセスができない状態でも、アクセス
処理をスタブに置き換えることで上位モジュールのテス
トが可能
9

モックオブジェクトとは
モックオブジェクトはスタブの一種

スタブが何らかの動作の代用品でしかないのに対して、
モックオブジェクトは上位モジュールが下位モジュール
を正しく使用しているかをテストするためのもの
10

モックオブジェクトの活用
DBに保存するような戻り値を伴わないメソッドをスタブ
化したいときは、戻り値が何であるかではなく、メソッ
ド自体が呼び出されていることを確認する
11

モックオブジェクトの作り方
単なるスタブと違って、モックオブジェクトはメソッド
が呼び出されたことをテストしなければならない

モックオブジェクトフレームワークを使ってモックオブ
ジェクトを作成するのが一般的

代表的なものがPHPUnit標準のPHPUnit_MockObject

今回紹介するPhakeもフレームワークの1つ
12

Phake
直感的に使えるモックオブジェクトフレームワーク

JavaのMockitoがベース

PHPUnitにも対応
13




;




    PHPUnit_MockObject
14




;




    Phake
15

Phake
Phake::mock

  モックオブジェクトの作成

Phake::when
  スタブメソッドの作成

Phake::verify
  メソッドが正しく呼び出されたか
16

Phake::mock
 Phake::mock( $classname [, $arg1[, $... ]] )

 指定したクラス名を元にモックオブジェクトを作成

 第2引数以降がコンストラクタの引数
17

Phake::when
 Phake::when( $mock )
  ->スタブ化したいメソッド(期待する引数)
  ->呼び出されたらどうなるか()

 スタブ化したいメソッドと引数をそのまま記述

 Phake::when($mock)->foo(Phake::anyParameters())
  foo()メソッドが引数問わず呼び出される
18

Phake::when - Answers
 thenReturn( $value )

   $value を返す

 thenThrow( $exception )
   $exception をスロー

 thenCallParent()
   parent呼び出し
19

Phake::verify
 Phake::verify( $mock [, $mode ] )
  ->検証するメソッド(期待する引数)

 Phake::verify($mock, Phake::times($n))->foo()
   foo()メソッドが$n回呼び出されたことを検証

 Phake::verifyNoIntaraction($mock)
   $mockオブジェクトのスタブメソッドが何も呼び出さ
   れなかったことを検証
20

Partial Mocks
 通常 Phake::mock() でモックオブジェクトを作成する
 と、すべてのメソッドがスタブ化される

 一部のメソッドのみスタブ化したい場合はパーシャル
 モックとして作成する

 パーシャルモックオブジェクトは基本的にはメソッドが
 そのまま呼び出されるが、Phake::when()で部分的にスタ
 ブメソッドに置き換えることが可能
21
22
23

Partial Mocks
 パーシャルモックが必要になるようであれば、部分的設
 計を見直すいい機会かも

 パーシャルモックでスタブ化した部分を別のクラスとし
 て抽出して、モックオブジェクトで置き換える方がたぶ
 ん素直でわかりやすいと思います
24

Installation
 pear config-set auto_discover 1
 pear install pear.digitalsandwich.com/phake
 include_pathを設定してPhake.phpを読み込むだけ
25

まとめ
Phakeを使うと直感的にモックオブジェクトを作れる

 思考の流れに沿ってスムーズにモックオブジェクトが
 作れるためテストが る

PHPUnitのMockObjectで十分なら無理に使わなくていい
んじゃないですかね……
26

Links
 http://phake.digitalsandwich.com/

 https://github.com/mlively/Phake


 http://fivestar.hatenablog.com/
   ご清聴ありがとうございました

Más contenido relacionado

La actualidad más candente

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
 
Ext.directことはじめ
Ext.directことはじめExt.directことはじめ
Ext.directことはじめ
Shuhei Aoyama
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
Gosuke Miyashita
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
 
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPADPuppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
Gosuke Miyashita
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hiroaki Murayama
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテスト
Tomonori Yamada
 

La actualidad más candente (20)

Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Ext.directことはじめ
Ext.directことはじめExt.directことはじめ
Ext.directことはじめ
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Puppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPADPuppet Best Practices? at COOKPAD
Puppet Best Practices? at COOKPAD
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外
 
アプリコンテスト
アプリコンテストアプリコンテスト
アプリコンテスト
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 

Destacado

Destacado (6)

世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
君にグロースハックはいらない
君にグロースハックはいらない君にグロースハックはいらない
君にグロースハックはいらない
 
とあるスタートアップの評価指標(メトリクス)
とあるスタートアップの評価指標(メトリクス)とあるスタートアップの評価指標(メトリクス)
とあるスタートアップの評価指標(メトリクス)
 
深層学習の非常に簡単な説明
深層学習の非常に簡単な説明深層学習の非常に簡単な説明
深層学習の非常に簡単な説明
 
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkanリーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
 
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
 

Similar a 20120327 phpstudy58-phake

20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
Yusuke Ando
 
Cakephpstudy5 hacks jp
Cakephpstudy5 hacks jpCakephpstudy5 hacks jp
Cakephpstudy5 hacks jp
Hiroki Shimizu
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
龍一 田中
 
Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15
Hideki Hashizume
 
Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03
oranie Narut
 

Similar a 20120327 phpstudy58-phake (20)

20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
Cakephpstudy5 hacks jp
Cakephpstudy5 hacks jpCakephpstudy5 hacks jp
Cakephpstudy5 hacks jp
 
An Internal of LINQ to Objects
An Internal of LINQ to ObjectsAn Internal of LINQ to Objects
An Internal of LINQ to Objects
 
CocoaPodsのはなし
CocoaPodsのはなしCocoaPodsのはなし
CocoaPodsのはなし
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
OpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすOpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かす
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
 
FlexUnit4とMockitoFlex
FlexUnit4とMockitoFlexFlexUnit4とMockitoFlex
FlexUnit4とMockitoFlex
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15Pro aspnetmvc3framework chap15
Pro aspnetmvc3framework chap15
 
Php+Word Press
Php+Word PressPhp+Word Press
Php+Word Press
 
ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験ASP.NET WEB API 開発体験
ASP.NET WEB API 開発体験
 
第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
How To Drink Wsgi
How To Drink WsgiHow To Drink Wsgi
How To Drink Wsgi
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03
 
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックWordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
 

Más de Katsuhiro Ogawa (11)

オレオレSecurityバンドル作っちゃいました
オレオレSecurityバンドル作っちゃいましたオレオレSecurityバンドル作っちゃいました
オレオレSecurityバンドル作っちゃいました
 
Twigエクステンションの作り方
Twigエクステンションの作り方Twigエクステンションの作り方
Twigエクステンションの作り方
 
Symfony Update 2011
Symfony Update 2011Symfony Update 2011
Symfony Update 2011
 
Symfony2のフォームフレームワーク
Symfony2のフォームフレームワークSymfony2のフォームフレームワーク
Symfony2のフォームフレームワーク
 
Contribute to Symfony
Contribute to SymfonyContribute to Symfony
Contribute to Symfony
 
究極のPHP本完成
究極のPHP本完成究極のPHP本完成
究極のPHP本完成
 
Symfony updates
Symfony updatesSymfony updates
Symfony updates
 
日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony日本電子卒業生とPHPとsymfony
日本電子卒業生とPHPとsymfony
 
sfWebDebugToolbarを 拡張してみる
sfWebDebugToolbarを拡張してみるsfWebDebugToolbarを拡張してみる
sfWebDebugToolbarを 拡張してみる
 
symfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワークsymfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワーク
 
Doctrineではじめるsymfony1.2開発
Doctrineではじめるsymfony1.2開発Doctrineではじめるsymfony1.2開発
Doctrineではじめるsymfony1.2開発
 

Último

Último (11)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 

20120327 phpstudy58-phake