Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
leverages_event
PDF, PPTX
9,195 views
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
2014年12月09日にヒカ☆ラボに登壇された株式会社インテリジェンスの清田氏のスライド資料です。
Engineering
◦
Read more
9
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 37
2
/ 37
3
/ 37
4
/ 37
5
/ 37
6
/ 37
7
/ 37
8
/ 37
9
/ 37
10
/ 37
11
/ 37
12
/ 37
13
/ 37
14
/ 37
15
/ 37
16
/ 37
17
/ 37
18
/ 37
19
/ 37
20
/ 37
21
/ 37
22
/ 37
23
/ 37
24
/ 37
25
/ 37
26
/ 37
27
/ 37
28
/ 37
29
/ 37
30
/ 37
31
/ 37
32
/ 37
33
/ 37
34
/ 37
35
/ 37
36
/ 37
37
/ 37
More Related Content
PPTX
知ってるようで意外と知らないPHPの便利関数
by
Wataru Terada
PDF
swooleを試してみた
by
Yukihiro Katsumi
PDF
WordPressと外部APIとの連携
by
Hidekazu Ishikawa
PDF
WordPress関数の処理コストを考えよう
by
Naoki Matsuda
PDF
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
by
Yusuke Ando
KEY
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
PDF
プロになるためのJavaScript入門読書会 レジュメ
by
Norito Agetsuma
PPTX
PHP基本的関数QUIZ
by
Wataru Terada
知ってるようで意外と知らないPHPの便利関数
by
Wataru Terada
swooleを試してみた
by
Yukihiro Katsumi
WordPressと外部APIとの連携
by
Hidekazu Ishikawa
WordPress関数の処理コストを考えよう
by
Naoki Matsuda
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
by
Yusuke Ando
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
プロになるためのJavaScript入門読書会 レジュメ
by
Norito Agetsuma
PHP基本的関数QUIZ
by
Wataru Terada
What's hot
PDF
MT meets PHP
by
純生 野田
PDF
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
by
Hiroaki KOBAYASHI
KEY
Perlで伝統芸能
by
hitode909
PDF
よいことも悪いこともぜんぶPHPが教えてくれた
by
Moriyoshi Koizumi
PDF
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
by
Akabane Hiroyuki
KEY
あらためてPHP5.3
by
Masashi Shinbara
PDF
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
by
Arata Fujimura
PPT
Gen-Template-for-Perl
by
nasneg
PDF
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
by
codeal
PDF
Django boodoo
by
泰 増田
ODP
Ci tutorial
by
Kazuaki Ueda
PDF
test
by
a1yama1123
PDF
俺のフックがこんなに簡単なわけがない。
by
Hishikawa Takuro
PDF
Try Jetpack
by
Hideaki Miyake
PDF
40分濃縮 PHP classの教室
by
Yusuke Ando
PDF
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
by
Yuki Okamoto
PPTX
実用裏方 Perl 入門
by
keroyonn
MT meets PHP
by
純生 野田
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
by
Hiroaki KOBAYASHI
Perlで伝統芸能
by
hitode909
よいことも悪いこともぜんぶPHPが教えてくれた
by
Moriyoshi Koizumi
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
by
Akabane Hiroyuki
あらためてPHP5.3
by
Masashi Shinbara
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
by
Arata Fujimura
Gen-Template-for-Perl
by
nasneg
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
by
codeal
Django boodoo
by
泰 増田
Ci tutorial
by
Kazuaki Ueda
test
by
a1yama1123
俺のフックがこんなに簡単なわけがない。
by
Hishikawa Takuro
Try Jetpack
by
Hideaki Miyake
40分濃縮 PHP classの教室
by
Yusuke Ando
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
by
Yuki Okamoto
実用裏方 Perl 入門
by
keroyonn
Viewers also liked
PDF
AngularJSでの非同期処理の話
by
Yosuke Onoue
PDF
Behatで行う、E2Eテスト入門
by
leverages_event
PDF
behatで始めるBDD
by
Tsutomu Chikuba
KEY
Behat+Symfony2ではじめるBDD超入門
by
晃 遠山
PDF
PHP Codeception テスト -- 日本語
by
Florent Batard
PDF
AspectMock 最強のモッキングフレームワーク
by
kenjis
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
by
infinite_loop
PPTX
Phalcon勉強会資料
by
Yuji Otani
PDF
Phalcon + AngularJSで作る動画プラットフォーム
by
ryo-utsunomiya
PPTX
受託開発のPhalcon
by
Masatoshi Hiraoka
PDF
今、最もイケてるPHPフレームワークLaravel4
by
アシアル株式会社
PPT
今、最もイケてるPHPフレームワークLaravel4
by
leverages_event
PDF
「Selenium実践入門」で学ぶテスト自動化の世界
by
Nozomi Ito
PDF
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
by
Masahito Zembutsu
PDF
Mock
by
Motoi Washida
PPT
PHP buildpackでhackとphalconが動いた件について
by
健治郎 安井
PDF
Laravel 5.1 LTSでサービスを作る
by
infinite_loop
PDF
Yet another use of Phalcon
by
Yuji Iwai
PPTX
3流プログラマーから見たPhalconとWISP
by
YamaYamamoto
PPTX
デザイナさんにGithubでpr投げてもらうまで
by
Hideharu Okuma
AngularJSでの非同期処理の話
by
Yosuke Onoue
Behatで行う、E2Eテスト入門
by
leverages_event
behatで始めるBDD
by
Tsutomu Chikuba
Behat+Symfony2ではじめるBDD超入門
by
晃 遠山
PHP Codeception テスト -- 日本語
by
Florent Batard
AspectMock 最強のモッキングフレームワーク
by
kenjis
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
by
infinite_loop
Phalcon勉強会資料
by
Yuji Otani
Phalcon + AngularJSで作る動画プラットフォーム
by
ryo-utsunomiya
受託開発のPhalcon
by
Masatoshi Hiraoka
今、最もイケてるPHPフレームワークLaravel4
by
アシアル株式会社
今、最もイケてるPHPフレームワークLaravel4
by
leverages_event
「Selenium実践入門」で学ぶテスト自動化の世界
by
Nozomi Ito
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
by
Masahito Zembutsu
Mock
by
Motoi Washida
PHP buildpackでhackとphalconが動いた件について
by
健治郎 安井
Laravel 5.1 LTSでサービスを作る
by
infinite_loop
Yet another use of Phalcon
by
Yuji Iwai
3流プログラマーから見たPhalconとWISP
by
YamaYamamoto
デザイナさんにGithubでpr投げてもらうまで
by
Hideharu Okuma
Similar to 「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
PDF
PHPの今とこれから2025 (PHP Conference Japan 2025)
by
Rui Hirokawa
PDF
Mock and patch
by
Toru Furukawa
KEY
EC-CUBE + PHPUnit で 実践テスト駆動開発
by
Kentaro Ohkouchi
PDF
PHP 2大 web フレームワークの徹底比較!
by
Shohei Okada
PDF
PHPUnit でテスト駆動開発を始めよう
by
Yuya Takeyama
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
by
Junichi Ishida
PPTX
Php development efficiency improvement
by
伸幸 茂木
KEY
Unit testで定時帰宅!
by
Funato Takashi
PDF
Modern PHP Programming @ PFI Seminar
by
Sotaro Karasawa
PPTX
pecl-AOPの紹介
by
Hiraku Nakano
PDF
Web技術勉強会 20100925
by
龍一 田中
PDF
20120327 phpstudy58-phake
by
Katsuhiro Ogawa
PDF
いまどきのPHP開発現場 -2015年秋-
by
Masashi Shinbara
PPT
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
by
Tsutomu Chikuba
PDF
決済金融から始めるデータドリブンカンパニー #yjmu
by
Yahoo!デベロッパーネットワーク
POTX
決済金融から始めるデータドリブンカンパニー
by
Tokuhiro Eto
PDF
Nds#24 単体テスト
by
Kazumune Katagiri
PPT
PHP agile test tips
by
Tsutomu Chikuba
PPT
ビジネス的に高価値なアジャイルテスト
by
Tsutomu Chikuba
PDF
MakeGoodで快適なテスト駆動開発を
by
Atsuhiro Kubo
PHPの今とこれから2025 (PHP Conference Japan 2025)
by
Rui Hirokawa
Mock and patch
by
Toru Furukawa
EC-CUBE + PHPUnit で 実践テスト駆動開発
by
Kentaro Ohkouchi
PHP 2大 web フレームワークの徹底比較!
by
Shohei Okada
PHPUnit でテスト駆動開発を始めよう
by
Yuya Takeyama
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
by
Junichi Ishida
Php development efficiency improvement
by
伸幸 茂木
Unit testで定時帰宅!
by
Funato Takashi
Modern PHP Programming @ PFI Seminar
by
Sotaro Karasawa
pecl-AOPの紹介
by
Hiraku Nakano
Web技術勉強会 20100925
by
龍一 田中
20120327 phpstudy58-phake
by
Katsuhiro Ogawa
いまどきのPHP開発現場 -2015年秋-
by
Masashi Shinbara
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
by
Tsutomu Chikuba
決済金融から始めるデータドリブンカンパニー #yjmu
by
Yahoo!デベロッパーネットワーク
決済金融から始めるデータドリブンカンパニー
by
Tokuhiro Eto
Nds#24 単体テスト
by
Kazumune Katagiri
PHP agile test tips
by
Tsutomu Chikuba
ビジネス的に高価値なアジャイルテスト
by
Tsutomu Chikuba
MakeGoodで快適なテスト駆動開発を
by
Atsuhiro Kubo
More from leverages_event
PDF
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
by
leverages_event
PDF
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
by
leverages_event
PPTX
Node.js×mongo dbで3年間サービス運用してみた話
by
leverages_event
PDF
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
by
leverages_event
PDF
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
by
leverages_event
PDF
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
by
leverages_event
PPTX
インスタグラムを活用した、マーケティングについて
by
leverages_event
PDF
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
by
leverages_event
PDF
初心者向けGo言語勉強会
by
leverages_event
PDF
株式会社waja 安藤様 登壇資料
by
leverages_event
PDF
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
by
leverages_event
PDF
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
by
leverages_event
PPTX
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
by
leverages_event
PPTX
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
by
leverages_event
PDF
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
by
leverages_event
PDF
20171206 tsumugu4 人工知能特集_v1.00_抜粋
by
leverages_event
PPTX
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
by
leverages_event
PPTX
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
by
leverages_event
PDF
Ac tsumugu 20170712
by
leverages_event
PDF
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
by
leverages_event
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
by
leverages_event
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
by
leverages_event
Node.js×mongo dbで3年間サービス運用してみた話
by
leverages_event
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
by
leverages_event
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
by
leverages_event
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
by
leverages_event
インスタグラムを活用した、マーケティングについて
by
leverages_event
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
by
leverages_event
初心者向けGo言語勉強会
by
leverages_event
株式会社waja 安藤様 登壇資料
by
leverages_event
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
by
leverages_event
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
by
leverages_event
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
by
leverages_event
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
by
leverages_event
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
by
leverages_event
20171206 tsumugu4 人工知能特集_v1.00_抜粋
by
leverages_event
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
by
leverages_event
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
by
leverages_event
Ac tsumugu 20170712
by
leverages_event
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
by
leverages_event
Recently uploaded
PPTX
【ASW22-01】STAMP:STPAロスシナリオの発想・整理支援ツールの開発 ~astah* System Safetyによる構造化・階層化機能の実装...
by
csgy24013
PDF
0.0001秒の攻防!?快適な運転を支えるリアルタイム制御と組み込みエンジニアの実践知【DENSO Tech Night 第四夜】
by
dots.
PDF
サーバーサイド Kotlin を社内で普及させてみた - Server-Side Kotlin Night 2025
by
Hirotaka Kawata
PDF
Nanami Doikawa_寄り道の誘発を目的とした旅行写真からのスポット印象語彙の推定に関する基礎検討_EC2025
by
Matsushita Laboratory
PDF
Rin Ukai_即興旅行の誘発を目的とした口コミ情報に基づく雰囲気キーワード_EC2025.pdf
by
Matsushita Laboratory
PDF
Kubernetes Release Team Release Signal Role について ~Kubernetes Meetup Tokyo #72~
by
Keisuke Ishigami
PPTX
「グローバルワン全員経営」の実践を通じて進化し続けるファーストリテイリングのアーキテクチャ
by
Fast Retailing Co., Ltd.
【ASW22-01】STAMP:STPAロスシナリオの発想・整理支援ツールの開発 ~astah* System Safetyによる構造化・階層化機能の実装...
by
csgy24013
0.0001秒の攻防!?快適な運転を支えるリアルタイム制御と組み込みエンジニアの実践知【DENSO Tech Night 第四夜】
by
dots.
サーバーサイド Kotlin を社内で普及させてみた - Server-Side Kotlin Night 2025
by
Hirotaka Kawata
Nanami Doikawa_寄り道の誘発を目的とした旅行写真からのスポット印象語彙の推定に関する基礎検討_EC2025
by
Matsushita Laboratory
Rin Ukai_即興旅行の誘発を目的とした口コミ情報に基づく雰囲気キーワード_EC2025.pdf
by
Matsushita Laboratory
Kubernetes Release Team Release Signal Role について ~Kubernetes Meetup Tokyo #72~
by
Keisuke Ishigami
「グローバルワン全員経営」の実践を通じて進化し続けるファーストリテイリングのアーキテクチャ
by
Fast Retailing Co., Ltd.
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
1.
「スピード」と「品質」を実現する PHP開発チームの取り組み !
~AngularJS + FuelPHP + AspectMock~
2.
何者? 株式会社インテリジェンス マーケティング企画統括部
サービス開発部 テクノロジーグループ ! 清田 馨一郎 Twitter:@seikei1874 【経歴】 2002年 SIerに入社 PGから叩き上げでPMまで経験 大手企業の基幹システムからソーシャルゲーム開発まで幅広く経験 2014年04月から、インテリジェンスへJOIN 石抱き
3.
何してる? サービス開発部 dots.(http://eventdots.jp/)の開発、運営
マーケティング部門の業務改善、見える化 … etc ! (私の)ミッションを格好良く言うと 社内のデータサイロを見つけ、 サイロをつなぐデータパイプラインを構築し、 ビジネスの加速を促す
4.
本日の内容
5.
本日の内容 【「スピード」と「品質」を実現する】取り組みを紹介 その中でも、テストを中心に紹介
PHP勉強会なので、AspectMockについて詳しく紹介 Angularの技術的な話は。。。 ! ゴール 明日から、AspectMockが使いたくなっちゃう♥
6.
スピードと品質
7.
スピードと品質 計画(スプリント・プランニング) 実装
ユーザに見てもらう(スプリント・レビュー)
8.
スピードと品質 計画(スプリント・プランニング) サイクルを早く回す
実装 ユーザに見てもらう(スプリント・レビュー)
9.
サイクルを早く回すために テストは極力自動化 定常的、同じ作業は機械に任せる
! 細かいスパンでデプロイ ユーザは、見て・使ってみないと分からない 頻繁なデプロイが負荷にならないために自動化 ! 技術的負債は残さない 開発者の精神的安定
10.
開発
11.
開発システム PHP :5.5系
MySQL :5.6系 FuelPHP :1.7.2 ※ 一部システムでは、Phalcon使ったり ! Font-end :AngularJS、TypeScript Test :PHPUnit、AspectMock、Karma、Jasmine、PhantomJS コミュニケーション :Slack ジョブ管理 :SOS JobScheduler ビルド、デプロイ :Grunt、Fabric CI :Jenkins 構成管理 :Gitlab 開発環境 :Vagrant 課題管理 :OpenProject
12.
開発フローとCI 開発フロー テストコードを書いて実装完了
Gitlabにマージリクエスト。レビューしてマージ Jenkinsでテスト、デプロイ Slackに通知して共有 ! CI 毎朝、実行 Slackに結果を通知
13.
フロントサイド
14.
FuelPHP FulePHPでは極力APIを作るようにする ビュー部分はAngularJSで作りこむ
! 素のController_Restでは、 想定外エラーのレスポンスなど 扱いヅライのでカスタマイズ
15.
AngularJS 多分に漏れず、DOM地獄から逃げたかった 社内ツールではあるが、UIは今風にしたい
! 秘伝のjQueryソースは無くしたい ある程度、書き方が統一できる
16.
TypeScript コンパイルを通すので、構文チェックができる。 デバッグでエラー箇所が特定し易い
→ 作業効率は上がる
17.
Wijmo(ウィジモ) リッチUIを提供するJavaScriptライブラリ データグリッドやチャートなどのWidgetを多数提供
AngularのDirectiveが標準で提供 !
18.
Grunt + Karma
+ Jasmine + PhantomJS Grunt TypeScriptのコンパイル Karmaの実行 ! デプロイ、CI JenkinsでGrunt実行 ! Jasmine APIレスポンスをスタブ化し、 テストが柔軟にできる
19.
AspectMock
20.
AspectMock モック フレームワーク
https://github.com/Codeception/AspectMock ! PHPテストフレームワーク「Codeception」と同じ作者 ! PHPでAOPを実現する「Go-AOP」を使用して メソッドを差し替える仕組み ! Go-AOP https://github.com/lisachenko/go-aop-php AOP:アスペクト志向プログラミング
21.
なぜAspectMock? テストフルなコード??? !
FuelPHPとの親和性 Fuelは、staticを多様 1.7.2から標準で設定済(core/bootstrap_phpunit.php) ! 単体テストのバリエーションが増える テストデータ作成に苦労しない 異常ケースが容易にできる
22.
設定、使い方 達人出版会 「はじめてのフレームワークとし
てのFuelPHP第2版(3) 実践編」 ! ※AspectMock使用時のクラスロードエラーの解消の部分だけでも、1000円の価値はありました。 ○ PHP Advent Calendar 2014 kenjisさんの記事 「普通じゃないモッキングフレームワークAspectMockがパワフル過ぎる」 http://blog.a-way-out.net/blog/2014/12/10/aspect-mock/
23.
Proxy ClassProxy 静的メソッドのMock
! InstansProxy インスタンスのMock ! Test Doubles Builder ClassProxy, InstansProxyを良しなに作成してくれる ! FuncProxy (>= 5.0.0) 指定したNamespaceのファンクションをMock化。 NativeファンクションもMock化可能!!
24.
こんなときどうする? 1. オブジェクトの中で呼んでいるstaticメソッド
2. DBエラー、ネットワークエラーなどの例外 3. 外部リソースからの取得データ 4. 状態によって戻り値が変わるメソッド DEMOしながら説明します
25.
まとめ • 定常、定期的な作業は積極的に自動化すべし
• テストコードは、テスト実施と同時に書く • AspectMockを使えば、出来ないテストは無い(多分) • SpecメソッドでBDDも可能(試してません) • AspectMockのクセは強いので慣れましょう
26.
ご質問ありますか? http://eventdots.jp/
27.
ありがとうございました! http://eventdots.jp/ いっしょに働く仲間を募集中!!!
28.
付録
29.
FuelPHP 想定外のエラー発生時も、ちゃんとレスポンスを返すようにする !
protected function response($data = array(), $message = '') {! ! if(!array_key_exists('error_code', $data)) {! ! ! $m_array = Arr::merge(array('error_code' => '200', 'message' => $message), array('data' => $data));! ! }! ! parent::response($m_array);! }! ! public function router($resource, $arguments) {! ! try {! $ret = parent::router($resource, $arguments);! ! if ($ret === false) {! parent::response(array('error_code' => '403', 'message' => 'Exception'), 403);! }! } catch (Exception $e) {! Log::error($e->getTraceAsString());! Log::error($e->getMessage());! ! parent::response(array('error_code' => '500', 'message' => 'Internal error.'), 500);! }! }! }!
30.
AspectMockを使ってみる こんなクラスをMock化してみる <?php!
! namespace Sample;! ! class Model_User extends Model {! ! private $_id;! private $_name;! ! public function __construct($id, $name) {! $this->_id = $id;! $this->_name = $name;! }! ! public function getName() {! return $this->_name;! }! ! public function getDate() {! return date('Y-m-d H:i:s');! }! } <?php! ! namespace Sample;! ! class Model_Suser extends Model {! ! private static $_name = '静的な値';! ! public static function getName() {! return static::$_name;! }! ! public static function callPrivate() {! return static::privatefunc();! }! ! private static function privatefunc() {! $time = FuelCoreDate::time();! return "private:" . $time . PHP_EOL;! }! }
31.
AspectMockを使ってみる1 <?php! use
AspectMockTest as mock;! ! class Test_Sample extends FuelCoreTestCase {! ! protected function setUp() {! Autoloader::add_namespace(! ! ! ! ‘Sample',! ! ! ! APPPATH . 'classes' . DS . 'sample/');! }! ! public function test_インスタンスProxyのケース() {! $user = new SampleModel_User(1, 'TestName');! ! // Mock化! $mock = mock::double($user,! ! ! ! ['getName' => 'DummyName']);! ! // 指定したNamespace内であれば、標準関数もMock化できる! mock::func('Sample', 'date', ‘now!!');! ! $name = $user->getName();! $data = $user->getDate();! ! $mock->verifyInvokedOnce('getName');! $mock->verifyInvokedOnce('getDate');! ! $this->assertEquals('DummyName', $name);! $this->assertEquals('now!!', $data);! }! } public function test_ClassProxyのケース() ! {! ! mock::double('SampleModel_Suser', [! ! ! ! ! ! 'getName' => 'Dummy']);! ! $name = SampleModel_Suser::getName();! ! $this->assertEquals('Dummy', $name);! ! } インスタンスもMock化 クラス名からMock化 標準関数もMock化!
32.
AspectMockを使ってみる2 /**! *
@expectedException FuelException! */! public function test_例外発生ケース() {! 例外を強制的に発生できる DBエラー、ネットワークエラーなど、発生させ難いテストが容易になる ! mock::double('SampleModel_Suser', [! 'getName' => function() {throw new FuelCoreFuelException("例外発生");}! ]);! ! try {! SampleModel_Suser::getName();! ! } catch (FuelException $e) {! ! $this->assertTrue(true);! throw $e;! }! ! $this->assertTrue(false);! }!
33.
AspectMockを使ってみる3 public function
test_Privateなメソッドのケース() {! privateメソッドもMock化できる ※AspectMockの機能ではありませんが、Closureでprivateメソッドが直接呼べる ! // privateメソッドで呼んでるクラスをMock化! mock::double('FuelCoreDate', ['time' => 'hogehoge']);! ! // Privateメソッドを直接呼ぶ! Closure::bind(! function () {! $obj = new SampleModel_Suser();! $ret = $obj->privatefunc();! ! $this->assertEquals('private:hogehoge' . PHP_EOL, $ret);! },! $this,! 'SampleModel_Suser'! )->__invoke();! ! mock::clean();! mock::double('SampleModel_Suser', ['privatefunc' => 'プライベート関数もMock化']);! ! $ret = SampleModel_Suser::callPrivate();! $this->assertEquals('プライベート関数もMock化', $ret);! ! }
34.
AspectMockを使ってみる4 <?php! namespace
Sample;! ! use FuelCoreDB;! ! class Model_Transaction extends Model {! ! public static function transaction() {! ! if(!DB::in_transaction()) {! DB::start_transaction();! }! ! try {! // DB処理! Model_Orm_User::find();! ! DB::commit_transaction();! ! } catch(FuelException $e) {! if(DB::in_transaction()) {! DB::rollback_transaction();! }! ! throw $e;! }! }! }! 【ケース】 例外が発生したときの挙動をテストしたい 1. トランザクションが無ければ貼る 2. 例外が発生しとき、トランザクションが 貼ってあれば、Rollbackする
35.
AspectMockを使ってみる4 public function
test_呼び出し回数で挙動を変えるケース() ! {! ! $cnt = 0;! ! $mock = mock::double(! 'FuelCoreDB',! [! 'start_transaction' => true,! 'commit_transaction' => true,! 'rollback_transaction' => true,! 'in_transaction' => function () use (&$cnt) {! if ($cnt == 0) {! $cnt++;! return false;! } elseif ($cnt == 1) {! $cnt++;! return true;! } else {! $cnt++;! return __AM_CONTINUE__; // オリジナルの処理がされる! }! }]);! ! mock::double('SampleModel_Orm_User', [! ! ! ! 'find' => function() {! ! ! ! ! throw new FuelException(“Exception強制発生");}! ! ! ]);! ! try {! SampleModel_Transaction::transaction();! } catch(FuelException $e) {! $mock->verifyInvokedOnce('start_transaction');! $mock->verifyNeverInvoked('commit_transaction');! $mock->verifyInvokedMultipleTimes('in_transaction', 2);! $mock->verifyInvokedOnce('rollback_transaction');! }! } 無名関数の引数に 変数を参照渡しして 呼び出し回数を カウント
36.
AspectMockを使ってみる5 【ケース】 ORMでfindした値が、
想定どおりの処理が行われた値で saveされるかを確認したい <?php! ! namespace Sample;! ! class Model_Orm_User extends OrmModel! {! ! <?php! ! namespace Sample;! ! class Model_Update extends Model! {! public static function update()! {! $model = Model_Orm_User::find();! ! foreach($model as $ret) {! $ret['val'] = 'hugehuge';! $ret->save();! }! }! }! protected static $_properties = [! 'id',! 'val',! ];! }!
37.
AspectMockを使ってみる5 確認したいORMクラ スを継承してfindし
た結果をダミー値で 定義。 ! saveの引数を無名関 数でチェック <?php! Autoloader::add_namespace(‘Sample',! ! ! ! ! APPPATH . 'classes' . DS . 'sample/');! ! class Tests_Model_StubModel extends SampleModel_Orm_User {! ! protected $_data = [‘id','val'];! ! function __construct($id, $val){! $this->_data['id'] = $id;! $this->_data['val'] = $val;! }! } public function test_ORMでの更新値チェックのケース() {! // ORMでDBから値を取得して処理して更新するパターン! $modify_data = 'hugehuge';! ! $data = new Tests_Model_StubModel('1', 'hogehoge');! ! mock::double('SampleModel_Orm_User',! [! 'find' => function ($param) use ($data) {! // ORMのfindは、レコード単位のORMクラス配列が返る! return [$data];! }! ]);! ! mock::double('OrmModel',[! 'save' => function() use ($modify_data) {! FuelCoreTestCase::assertEquals(! ! ! ! $this->_data['val'], $modify_data! ! ! );! }! ]);! ! SampleModel_Update::update();! }!
Download