PHPカンファレンス福岡でBDDとphpspecについて話してきました

Posted: 2015-06-29 14:02 |  PHP全般 
2015/6/27 福岡で開催されたPHPカンファレンス福岡2015にて「phpspecで始めるBDD」について話してきました

phpspecで始めるBDD from Yuuki Takezawa

今回は15分枠で応募したのもあり、phpspecの利用方法よりも、

ビヘイビア駆動開発ってなーに?
TDDとの視点の違いはなーに?

にフォーカスしてアジャイルによる開発サイクルと混ぜた内容にしました。
後日どこかでもっとphpspecとBehatを合わせるとどうなるの?とか実践的なところや、
スペックファーストで取り入れるのにどうしたらいいのか、などもやれたらいいな!と思います。

簡単ですが、PHPUnitとの棲み分けについて補足程度にさらりと

PHPUnitとの違いは?

ユニット単位でのテストであればPHPUnitでもphpspecでも変わりません。
それに多くの方はPHPUnitで全て記述したほうが楽です。
ただしRSpecや他の言語のBDDフレームワークを利用している方であれば自然に取り入れれると思います。

phpspecを使う意味があるのか?
phpspecは利用したことがある方はご存知かと思いますが、BDDフレームワークということもあり、
自然言語でテストを記述します。
PHPUnitの場合、テストを書く場合のメソッドは次のような視点で記述するケースが多いはずです。

hogeメソッドがfugaのとき値をpiyoと返す

各テストではそれに伴ってassertなどを利用してテストを行います。
これ対してphpspecでは次のようにテストを記述します。

ユーザーがログインしている場合、値をpiyoと返す

視点がPHPUnitのプログラム単位から仕様からの視点となります。
もちろんこのメソッドが何々のときに何を返す、という記述をしても構いませんが、
シナリオをサポートするBehatと組み合わせることでビヘイビア駆動開発の姿を表します。

誰がみても明らかな要求仕様に応えるテストであればあるほど、
資料にあるような要求、テスト、コーディング、設計・リファクタリングのサイクルへ近づくはずです。

開発者視点からプロダクトへの視点へと変化させ、プロダクトをより理解して、
ソフトウェアの品質を向上させるためのサイクルをサポートする側面が強いため、
開発スタイルによってはあまりメリットが感じられない場合も多いはずです。
(ドキュメントが多いプロジェクトではあまり活用する機会がないと思います)
このため、個人開発で利用する以外には、開発チームでクラスの仕様に対しての指標としてphpspecを利用し、
より実装にフォーカスしたテストにはphpunit、といった併用スタイルから始めてみると良いのかなと思います。

今回紹介できなかったものとして、phpspec, Behatを共に利用して
フィーチャーファイルを結合させた状態で利用する場合に次のような形式になります。
Feature: Developer generates a class
  As a Developer
  I want the tests to automatically rerun after code generation events
  In order to avoid repetitive tasks and interruptions in development flow

  @smoke
  Scenario: Rerun after class generation
    Given I have started describing the "CodeGeneration/RerunExample1/Markdown" class
    When I run phpspec and answer "y" when asked if I want to generate the code
    Then the tests should be rerun

  Scenario: Rerun after method generation
    Given the spec file "spec/CodeGeneration/RerunExample2/MarkdownSpec.php" contains:
      """
      <?php

      namespace spec\CodeGeneration\RerunExample2;

      use PhpSpec\ObjectBehavior;
      use Prophecy\Argument;

      class MarkdownSpec extends ObjectBehavior
      {
          function it_converts_plain_text_to_html_paragraphs()
          {
              $this->toHtml('Hi, there')->shouldReturn('

Hi, there

'); } } """ And the class file "src/CodeGeneration/RerunExample2/Markdown.php" contains: """ <?php namespace CodeGeneration\RerunExample2; class Markdown { } """ When I run phpspec and answer "y" when asked if I want to generate the code Then the tests should be rerun Scenario: No rerun if code generation is off Given I have started describing the "CodeGeneration/RerunExample3/Markdown" class When I run phpspec non interactively Then the tests should not be rerun Scenario: No rerun if rerun flag is passed Given I have started describing the "CodeGeneration/RerunExample4/Markdown" class When I run phpspec with the option "no-rerun" and I answer "y" when asked if I want to generate the code Then the tests should not be rerun Scenario: No rerun if rerun flag is passed Given I have started describing the "CodeGeneration/RerunExample5/Markdown" class And the config file contains: """ rerun: false """ When I run phpspec and answer "y" when asked if I want to generate the code Then the tests should not be rerun

シナリオ内にspecが自然言語で記述されるのでなんとなく使いどころがイメージできると思います。
こうした特徴があり、モックなどもphpspecに取り込まれているので簡単です。
assetに相当するマッチャーとモックさえ理解してしまえば短時間で習得できます。

BDDがうまく回り出すにはおそらく時間がかかるでしょう、とは言われています。
ですが導入自体は簡単ですので、チャレンジしてみてください

参考資料
ビヘイビア駆動開発 ― ウォーターフォールモデルからのステップ
アジャイルサムライ−達人開発者への道−
 

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014