39
phpspecで始める BDD yuuki takezawa

phpspecで始めるBDD

Embed Size (px)

Citation preview

Page 1: phpspecで始めるBDD

phpspecで始めるBDDyuuki takezawa

Page 2: phpspecで始めるBDD

profile

• ytake(GitHub), ex_takezawa(twitter)

• java, php, node.js, RDBMS, NoSQL, VoltDB

• 初福岡

Page 3: phpspecで始めるBDD

Laravelエキスパート養成読本4章担当

ご興味がある方は是非お願いします

Page 4: phpspecで始めるBDD

What is BDD? (Behavior Driven Development)?

Page 5: phpspecで始めるBDD

開発のサイクルを 振り返りましょう

Page 6: phpspecで始めるBDD

小さい範囲での開発

Page 7: phpspecで始めるBDD

テスト

コーディング

テストを先に記述し、 実装に着手

テストが成功するまで 最小限のサイクルで開発

Page 8: phpspecで始めるBDD

より大きな範囲

Page 9: phpspecで始めるBDD

テスト

コーディング

小さい範囲のサイクルは そのままに

設計

設計とリファクタリング 高い品質へ

Page 10: phpspecで始めるBDD

何のためのサイクルですか?

Page 11: phpspecで始めるBDD

アジャイルとの関連性も 一つのポイント

Page 12: phpspecで始めるBDD

技術的卓越性と 優れた設計に対する 不断の注意が 機敏さを高めます

Page 13: phpspecで始めるBDD

実装コードが正しく動くか? 実装要件を満たすか?

Page 14: phpspecで始めるBDD

テストとリファクタリングを繰り返す

-> 継続的インテグレーション

Page 15: phpspecで始めるBDD

ビヘイビア駆動開発とは?

Page 16: phpspecで始めるBDD

開発スケジュール

• データベースライブラリ入れ替え XX日

• メルマガ発行のため、Queueの導入と実装 XX日

• といった工数の出し方したことありませんか?

Page 17: phpspecで始めるBDD

ビジネスの観点で 評価ができるか?

Page 18: phpspecで始めるBDD

プロジェクトオーナーの存在

Page 19: phpspecで始めるBDD

情報を伝えるもっとも効率的で効果的な方法は

フェイス・トゥ・フェイスで 話をすることです

Page 20: phpspecで始めるBDD

ユーザーストーリー

Page 21: phpspecで始めるBDD

<役割>として <機能>が出来る それは<ビジネスの価値> のためだ

Page 22: phpspecで始めるBDD

テスト

コーディング設計

プロダクトへの理解と品質

要件

Page 23: phpspecで始めるBDD

ストーリーをサポートするBehat

要求仕様をサポートするPHPSpec

Page 24: phpspecで始めるBDD

http://www.phpspec.net

Page 25: phpspecで始めるBDD

"require-dev": { "phpspec/phpspec": "~2.1" },

Page 26: phpspecで始めるBDD

PHPSpec

• オブジェクトの振る舞いを仕様として記述

例). ○を追加したら配列に含まれること

• 仕様(spec)を先に書いて実装する

• 記述方法は自然言語(英語) => 仕様になる

Page 27: phpspecで始めるBDD

$ phpspec describe App/FizzBuzz

Page 28: phpspecで始めるBDD

phpspec describe

• 振る舞いを記述するクラスとして指定

• 実クラスが無くて構いませんspecファーストの為、対象はphpspecが作成

Page 29: phpspecで始めるBDD

namespace spec\App;

use PhpSpec\ObjectBehavior; use Prophecy\Argument;

class FizzBuzzSpec extends ObjectBehavior {

function it_is_initializable() { $this->shouldHaveType('App\FizzBuzz'); }

}

Page 30: phpspecで始めるBDD

Specを記述

• スネークケースでit, またはitsから書き始める

• Spec内の$thisは振る舞うオブジェクトを指す

• 存在すると仮定するメソッドを記述し、返却すべき値を記述

Page 31: phpspecで始めるBDD

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'); }

期待する返却値を記述

Page 32: phpspecで始めるBDD

$ phpspec run

Page 33: phpspecで始めるBDD

phpspec run

• テストを実行

• メソッドがない場合は作成—fakeオプションで簡単な返却値も生成

• 失敗時のサポート

Page 34: phpspecで始めるBDD
Page 35: phpspecで始めるBDD

テスト失敗時

返却すべき値を表示してくれるわかりやすい

Page 36: phpspecで始めるBDD

よく利用するもの

• モック

• マッチャー = assertに相当するもの

• コンストラクタの振る舞い

• featureファイルのサンプルが付属しています

Page 37: phpspecで始めるBDD

function let(Message $message) { $this->beConstructedWith($message); }

function it_is_initializable() { $this->shouldHaveType('App\FizzBuzz'); }

Page 38: phpspecで始めるBDD

function it_should_return_message_for_3( Message $message ) { $message->getText(3) ->shouldBeCalled()->willReturn(‘message’); $this->transform(3)->shouldReturn('message'); }

Page 39: phpspecで始めるBDD

まとめ

• 仕様書としてもカバー

• 最小のサイクルとフェイス・トゥ・フェイス

• 包括的なドキュメントよりも動くソフトウェア

• スクラムにも、個人開発にも