Suche senden
Hochladen
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
•
9 gefällt mir
•
9,144 views
L
leverages_event
Folgen
2014年12月09日にヒカ☆ラボに登壇された株式会社インテリジェンスの清田氏のスライド資料です。
Weniger lesen
Mehr lesen
Ingenieurwesen
Diashow-Anzeige
Melden
Teilen
Diashow-Anzeige
Melden
Teilen
1 von 37
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
WordPress のキャッシュ機構
WordPress のキャッシュ機構
katanyan
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
Norito Agetsuma
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Naoki Matsuda
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
Empfohlen
WordPress のキャッシュ機構
WordPress のキャッシュ機構
katanyan
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
Norito Agetsuma
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Naoki Matsuda
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
WordPressと外部APIとの連携
WordPressと外部APIとの連携
Hidekazu Ishikawa
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
Hiroaki KOBAYASHI
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Yuki Okamoto
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
Yusuke Ando
Gen-Template-for-Perl
Gen-Template-for-Perl
nasneg
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
Perlで伝統芸能
Perlで伝統芸能
hitode909
Ci tutorial
Ci tutorial
Kazuaki Ueda
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
Try Jetpack
Try Jetpack
Hideaki Miyake
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
Moriyoshi Koizumi
あらためてPHP5.3
あらためてPHP5.3
Masashi Shinbara
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
codeal
MT meets PHP
MT meets PHP
純生 野田
実用裏方 Perl 入門
実用裏方 Perl 入門
keroyonn
test
test
a1yama1123
Django boodoo
Django boodoo
泰 増田
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
leverages_event
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
アシアル株式会社
AspectMock 最強のモッキングフレームワーク
AspectMock 最強のモッキングフレームワーク
kenjis
behatで始めるBDD
behatで始めるBDD
Tsutomu Chikuba
Weitere ähnliche Inhalte
Was ist angesagt?
WordPressと外部APIとの連携
WordPressと外部APIとの連携
Hidekazu Ishikawa
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
Hiroaki KOBAYASHI
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Yuki Okamoto
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
Yusuke Ando
Gen-Template-for-Perl
Gen-Template-for-Perl
nasneg
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
Perlで伝統芸能
Perlで伝統芸能
hitode909
Ci tutorial
Ci tutorial
Kazuaki Ueda
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
Try Jetpack
Try Jetpack
Hideaki Miyake
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
Moriyoshi Koizumi
あらためてPHP5.3
あらためてPHP5.3
Masashi Shinbara
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
codeal
MT meets PHP
MT meets PHP
純生 野田
実用裏方 Perl 入門
実用裏方 Perl 入門
keroyonn
test
test
a1yama1123
Django boodoo
Django boodoo
泰 増田
Was ist angesagt?
(18)
WordPressと外部APIとの連携
WordPressと外部APIとの連携
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
Gen-Template-for-Perl
Gen-Template-for-Perl
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Perlで伝統芸能
Perlで伝統芸能
Ci tutorial
Ci tutorial
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Try Jetpack
Try Jetpack
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
あらためてPHP5.3
あらためてPHP5.3
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
MT meets PHP
MT meets PHP
実用裏方 Perl 入門
実用裏方 Perl 入門
test
test
Django boodoo
Django boodoo
Andere mochten auch
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
leverages_event
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
アシアル株式会社
AspectMock 最強のモッキングフレームワーク
AspectMock 最強のモッキングフレームワーク
kenjis
behatで始めるBDD
behatで始めるBDD
Tsutomu Chikuba
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
晃 遠山
Yet another use of Phalcon
Yet another use of Phalcon
Yuji Iwai
PHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件について
健治郎 安井
受託開発のPhalcon
受託開発のPhalcon
Masatoshi Hiraoka
3流プログラマーから見たPhalconとWISP
3流プログラマーから見たPhalconとWISP
YamaYamamoto
Phalcon勉強会資料
Phalcon勉強会資料
Yuji Otani
Phalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォーム
ryo-utsunomiya
PHP Codeception テスト -- 日本語
PHP Codeception テスト -- 日本語
Florent Batard
「Selenium実践入門」で学ぶテスト自動化の世界
「Selenium実践入門」で学ぶテスト自動化の世界
Nozomi Ito
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
Masahito Zembutsu
Laravel 5.1 LTSでサービスを作る
Laravel 5.1 LTSでサービスを作る
infinite_loop
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
leverages_event
Mock
Mock
Motoi Washida
デザイナさんにGithubでpr投げてもらうまで
デザイナさんにGithubでpr投げてもらうまで
Hideharu Okuma
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話
Yosuke Onoue
Andere mochten auch
(20)
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
AspectMock 最強のモッキングフレームワーク
AspectMock 最強のモッキングフレームワーク
behatで始めるBDD
behatで始めるBDD
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
Yet another use of Phalcon
Yet another use of Phalcon
PHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件について
受託開発のPhalcon
受託開発のPhalcon
3流プログラマーから見たPhalconとWISP
3流プログラマーから見たPhalconとWISP
Phalcon勉強会資料
Phalcon勉強会資料
Phalcon + AngularJSで作る動画プラットフォーム
Phalcon + AngularJSで作る動画プラットフォーム
PHP Codeception テスト -- 日本語
PHP Codeception テスト -- 日本語
「Selenium実践入門」で学ぶテスト自動化の世界
「Selenium実践入門」で学ぶテスト自動化の世界
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
【17-E-1】自動化はどこに向かうのか~まだ開発・運用の自動化で消耗しているの?~
Laravel 5.1 LTSでサービスを作る
Laravel 5.1 LTSでサービスを作る
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
Mock
Mock
デザイナさんにGithubでpr投げてもらうまで
デザイナさんにGithubでpr投げてもらうまで
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話
Ähnlich wie 「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
純生 野田
Data api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo
純生 野田
Visualforce + jQuery
Visualforce + jQuery
Salesforce Developers Japan
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
Masashi Shinbara
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
WordPressで提供するWeb API
WordPressで提供するWeb API
Yuko Toriyama
広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習
x1 ichi
Cakephp api
Cakephp api
Eiji Yokota
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
Using Dancer
Using Dancer
Yoshihiro Sasaki
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
コンテナで作れるFaaS
コンテナで作れるFaaS
真吾 吉田
初めての Data api
初めての Data api
Yuji Takayama
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
Nishida Kansuke
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
Tatsuya Ishikawa
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
プログラマ講習第2回
プログラマ講習第2回
Yuma Yoshimoto
Ähnlich wie 「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
(20)
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
Data api workshop at Co-Edo
Data api workshop at Co-Edo
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo
Visualforce + jQuery
Visualforce + jQuery
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
WordPressで提供するWeb API
WordPressで提供するWeb API
広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習
Cakephp api
Cakephp api
Hack/HHVM 入門
Hack/HHVM 入門
Using Dancer
Using Dancer
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
コンテナで作れるFaaS
コンテナで作れるFaaS
初めての Data api
初めての Data api
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
プログラマ講習第2回
プログラマ講習第2回
Mehr von leverages_event
Ac tsumugu 20170712
Ac tsumugu 20170712
leverages_event
20171206 tsumugu4 人工知能特集_v1.00_抜粋
20171206 tsumugu4 人工知能特集_v1.00_抜粋
leverages_event
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
leverages_event
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
leverages_event
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
leverages_event
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
leverages_event
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
leverages_event
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
leverages_event
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
leverages_event
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
leverages_event
インスタグラムを活用した、マーケティングについて
インスタグラムを活用した、マーケティングについて
leverages_event
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
leverages_event
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
leverages_event
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
leverages_event
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
leverages_event
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
leverages_event
初心者向けGo言語勉強会
初心者向けGo言語勉強会
leverages_event
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
leverages_event
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話
leverages_event
株式会社waja 安藤様 登壇資料
株式会社waja 安藤様 登壇資料
leverages_event
Mehr von leverages_event
(20)
Ac tsumugu 20170712
Ac tsumugu 20170712
20171206 tsumugu4 人工知能特集_v1.00_抜粋
20171206 tsumugu4 人工知能特集_v1.00_抜粋
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
【ヒカ☆ラボ】アーキテクト養成講座「入門編」 折田 武己 氏 登壇資料 20171205
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 大竹 雅登氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 深尾 もとのぶ氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 三笠 斉輝氏 登壇資料 20171121
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
【ヒカ☆ラボ】 株式会社AMG Solution 山口 博史氏登壇資料 20170817
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
【ヒカ☆ラボ】株式会社ライナフ 登壇資料
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
【ヒカ☆ラボ】株式会社エアー様~ETLツール活用法について~
インスタグラムを活用した、マーケティングについて
インスタグラムを活用した、マーケティングについて
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
ヒカ☆ラボ ユニティ・テクノロジーズ・ジャパン合同会社 安原 祐二氏登壇資料_20170119
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
ヒカ☆ラボ 株式会社PR TIMES 山田 和広氏登壇資料 20161129
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
ヒカ☆ラボ 株式会社PR TIMES 新井 隆士氏登壇資料 20161129
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」開発エンジニア
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
ヒカラボ「自社サービス開発会社で活躍し続けるために必要な○○とは?」UIデザイナー
初心者向けGo言語勉強会
初心者向けGo言語勉強会
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
DMM.comラボはなぜSparkを採用したのか?レコメンドエンジン開発の裏側をお話します!
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話
株式会社waja 安藤様 登壇資料
株式会社waja 安藤様 登壇資料
「スピード」と「品質」を実現する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();! }!
Jetzt herunterladen