Upload
yuuki-takezawa
View
941
Download
1
Embed Size (px)
Citation preview
phpspecで始めるBDDyuuki takezawa
profile
• ytake(GitHub), ex_takezawa(twitter)
• java, php, node.js, RDBMS, NoSQL, VoltDB
• 初福岡
Laravelエキスパート養成読本4章担当
ご興味がある方は是非お願いします
What is BDD? (Behavior Driven Development)?
開発のサイクルを 振り返りましょう
小さい範囲での開発
テスト
コーディング
テストを先に記述し、 実装に着手
テストが成功するまで 最小限のサイクルで開発
より大きな範囲
テスト
コーディング
小さい範囲のサイクルは そのままに
設計
設計とリファクタリング 高い品質へ
何のためのサイクルですか?
アジャイルとの関連性も 一つのポイント
技術的卓越性と 優れた設計に対する 不断の注意が 機敏さを高めます
実装コードが正しく動くか? 実装要件を満たすか?
テストとリファクタリングを繰り返す
-> 継続的インテグレーション
ビヘイビア駆動開発とは?
開発スケジュール
• データベースライブラリ入れ替え XX日
• メルマガ発行のため、Queueの導入と実装 XX日
• といった工数の出し方したことありませんか?
ビジネスの観点で 評価ができるか?
プロジェクトオーナーの存在
情報を伝えるもっとも効率的で効果的な方法は
フェイス・トゥ・フェイスで 話をすることです
ユーザーストーリー
<役割>として <機能>が出来る それは<ビジネスの価値> のためだ
テスト
コーディング設計
プロダクトへの理解と品質
要件
ストーリーをサポートするBehat
要求仕様をサポートするPHPSpec
http://www.phpspec.net
"require-dev": { "phpspec/phpspec": "~2.1" },
PHPSpec
• オブジェクトの振る舞いを仕様として記述
例). ○を追加したら配列に含まれること
• 仕様(spec)を先に書いて実装する
• 記述方法は自然言語(英語) => 仕様になる
$ phpspec describe App/FizzBuzz
phpspec describe
• 振る舞いを記述するクラスとして指定
• 実クラスが無くて構いませんspecファーストの為、対象はphpspecが作成
namespace spec\App;
use PhpSpec\ObjectBehavior; use Prophecy\Argument;
class FizzBuzzSpec extends ObjectBehavior {
function it_is_initializable() { $this->shouldHaveType('App\FizzBuzz'); }
}
Specを記述
• スネークケースでit, またはitsから書き始める
• Spec内の$thisは振る舞うオブジェクトを指す
• 存在すると仮定するメソッドを記述し、返却すべき値を記述
function it_return_1_for_1() { $this->transform(1)->shouldReturn(1); }
function it_return_2_for_2() { $this->transform(2)->shouldReturn(2); }
function it_should_return_crazy_for_3() { $this->transform(3)->shouldReturn('crazy'); }
期待する返却値を記述
$ phpspec run
phpspec run
• テストを実行
• メソッドがない場合は作成—fakeオプションで簡単な返却値も生成
• 失敗時のサポート
テスト失敗時
返却すべき値を表示してくれるわかりやすい
よく利用するもの
• モック
• マッチャー = assertに相当するもの
• コンストラクタの振る舞い
• featureファイルのサンプルが付属しています
function let(Message $message) { $this->beConstructedWith($message); }
function it_is_initializable() { $this->shouldHaveType('App\FizzBuzz'); }
function it_should_return_message_for_3( Message $message ) { $message->getText(3) ->shouldBeCalled()->willReturn(‘message’); $this->transform(3)->shouldReturn('message'); }
まとめ
• 仕様書としてもカバー
• 最小のサイクルとフェイス・トゥ・フェイス
• 包括的なドキュメントよりも動くソフトウェア
• スクラムにも、個人開発にも