CakePHP2 で
効果が上がった話
2015-07-18 GMOリサーチ 寺田渉
facebook: 寺田渉
github: waterada
twitter: @wa_terada
自己紹介 (会社)
- PHP (CakePHP) / java (Spring MVC) を主に使って開発
- 継続的インテグレーション
- github + git flow で運用
- PHPUnit / JUnit で カバレッジ 100%
- Behat (Selenium Driver 経由の画面テスト) 利用
- vagrant で開発環境構築
自己紹介 (趣味)
CakePHP 公式ドキュメント 翻訳
自己紹介 (趣味)
ボードゲーム 翻訳
自己紹介 (趣味)
TED 翻訳
自己紹介
プログラミング & 翻訳
大好き人間です
弊社 GMOリサーチ では
30人ほどで開発
しており、
使っているフレームワークは
で、本題。
CakePHP
CI (継続的インテグレーション)
回しています。
PHPUnit の
テストカバレッジも
100% を維持してます。
behat という
Selenium WebDriver を使った
画面自動テスト も行ってます。
今日は CakePHP2 を使っていて
非常に効果が出たとこの紹介と
効果を引き出す勘所を
お伝えしたいと思います。
非常に効果出たところ 1
開発工数 / 教育コスト 激減!
bake
DBテーブルがあれば1コマンドで画面を作成。
Ruby on Rails にあるアレです。
どうして効果が出るの?
一覧/追加/変更/削除画面の作成は
一番のボリュームゾーンであるが
単純作業であり ビジネス価値は低い。
ならば
そこは自動で済ませて
エンジニアは
よりビジネス価値の高い
機能に集中しよう!
しかし
標準の bake では、次の問題が。
- デザイン、細かい動き等、
自社仕様が入っていない。
-
単体テストが書かれていない。
- bake コマンドが多機能で
利用者が選択肢に迷う。
ならば
自社用 bake を作ろう。
- 自社仕様 全部入り。
リリースできる状態 にまで bake する。
-
単体テスト も bake する。
- bake コマンドから選択肢を消す。
もう迷わない。
デモ
非常に効果出たところ 2
結合試験 工数 激減!
単体テスト
仕様の門番 + Fabricate
単体テストには2つの問題が
1. 何のためにテストするのか問題
自分のコードを動かしてみる
(今の自分のため)
仕様をテストする門番を配置する
(将来の担当者のため)
デグレ対策のテストの工数が激減。
テストしやすいコードを書くと
自然と 粗結合 に。
テストコードが仕様書に。
(使い方はテスト見る。)
単体テストには2つの問題が
2. Fixture ではテストの維持が大変
Fabricate (sizuhikoさん作) で解決!
- 新機能に合わせてデータ変更
- 別のテストが落ちたので両方動くデータへと再調整
- さらに別のテストが落ちたので・・・2 へ戻って繰り返し
データ調整地獄に陥りがち
※ Fabricate はテストデータを生成するツール。
テストで必要ない列は適当にでっちあげてくれる。
参考(sizuhikoさんのブログ):
Fabricate の例
Fabricate::create('Apple', 6);
public $records = array(
array('apple_id' => 2, 'color' => 'Red 1', 'name' => 'Red Apple 1', 'created' => '2006-11-22 10:38:58', 'date' => '1951-01-04', 'modified' => '2006-12-01 13:31:26', 'mytime' => '22:57:17'),
array('apple_id' => 1, 'color' => 'Bright Red 1', 'name' => 'Bright Red Apple', 'created' => '2006-11-22 10:43:13', 'date' => '2014-01-01', 'modified' => '2006-11-30 18:38:10', 'mytime' => '22:57:17'),
array('apple_id' => 2, 'color' => 'blue green', 'name' => 'green blue', 'created' => '2006-12-25 05:13:36', 'date' => '2006-12-25', 'modified' => '2006-12-25 05:23:24', 'mytime' => '22:57:17'),
array('apple_id' => 2, 'color' => 'Blue Green', 'name' => 'Test Name', 'created' => '2006-12-25 05:23:36', 'date' => '2006-12-25', 'modified' => '2006-12-25 05:23:36', 'mytime' => '22:57:17'),
array('apple_id' => 5, 'color' => 'Green', 'name' => 'Blue Green', 'created' => '2006-12-25 05:24:06', 'date' => '2006-12-25', 'modified' => '2006-12-25 05:29:16', 'mytime' => '22:57:17'),
array('apple_id' => 4, 'color' => 'My new appleOrange', 'name' => 'My new apple', 'created' => '2006-12-25 05:29:39', 'date' => '2006-12-25', 'modified' => '2006-12-25 05:29:39', 'mytime' => '22:57:17'),
array('apple_id' => 6, 'color' => 'Some wierd color', 'name' => 'Some odd color', 'created' => '2006-12-25 05:34:21', 'date' => '2006-12-25', 'modified' => '2006-12-25 05:34:21', 'mytime' => '22:57:17')
);
従来の Fixture (すべての必須列の値が必要)
とにかく 6 件ほしいなら ※各caseの中で書く。
Fabricate::create('Apple', 1, ['id' => 1, 'color' => '']);
color が空のレコード1件が欲しいなら
非常に効果出たところ 3
結合試験 工数 激減!
behat
Selenium WebDriver を用いた自動テスト。
意外と書きやすく、メンテしやすい。
デモ
# language: ja
フィーチャ:
集計担当者として、ぴったりカットと割付を作成できる。
なぜならば、集計結果は余剰なしのものを納品を求められるからだ
背景:
前提 "analysis-test@gmo-research.jp" 、 "test" でログインできる
かつ 集計画面を表示している
@javascript
シナリオ:初期表示の値を確認する
もし "ぴったりカット" ページを表示している
ならば ぴったりカット画面で以下の出力対象が選択状態になっていること
| 出力対象 |
| complete |
かつ ぴったりカット画面で以下の出力対象が選択状態になっていないこと
| 出力対象 |
| screened |
| quotafull |
かつ 割付の設定の "不要" が選択状態になっていること
かつ ぴったりカット画面の割付選択項目が表示されていないこと
かつ ぴったりカット画面の設定の保存が表示されていること
behat の例 (feature):
$steps->Given('/^ぴったりカット画面の設定の保存が表示されていること$/',
function($world) {
$node = $world->getSession()->getPage()->find('css', '#commitData');
$scr_bool = $node->isVisible();
assertTrue($scr_bool);
});
behat の例 (steps):
非常に効果出たところ 4
教育コスト 激減!
書籍が充実
この本 読んどいて作戦!
非常に効果出たところ 5
やる気 激増!
熱いコミュニティ
以上です!
感想などあれば:
facebook: 寺田渉
github: waterada
twitter: @wa_terada
ご静聴ありがとうございました!
CakePHP で効率が上がることろまで行った話
By Wataru Terada
CakePHP で効率が上がることろまで行った話
- 3,708