FizzBuzz問題をbakeしてみる

TDD(Test Driven Development)をFizzBuzz問題で実践しよう!@phpmatsuri2011TDDワークショップの話。

TDD

TDDってなんじゃらほい。って方は ↓ TDD@wiki

テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

TDDという考え方を知ってからは、270°くらいプログラムの仕方が変わりまして。
180°超えとるがなって言うのはなしです。こういうの気持ちじゃん、気持ち。

ただ、テストを書こう!っていうことじゃなくて、@kunitさんの言葉を借りれば
テストを先に書くのではない、どういう風に動いてほしいかをあらかじめ決めるだけ
ということなのだが。

これ嫁!的なオススメ本ありましたら是非。

FizzBuzz問題

FizzBuzz問題知ってる人ー?」・・・私「・・・(しーん。虫の生体に関するものか何か?」

ということで、これです。

1から100までの数を出力するプログラムを書く。
それぞれの値は改行して出力する。
ただし、
3の倍数のときは数の代わりに「Fizz」、
5の倍数のときは「Buzz」、
3と5両方の倍数の場合には「FizzBuzz」と出力する。

採用試験で簡単な技術レベルを知るためによく使われる問題のようです。
問題自体の難易度は低い(5分もかからない)ですが、これをTDDで実装しようというのが焦点ですね。

bakeしてみる

TDDにはPHPUnitを採用しております。(ワークショップがそういう前提だったので。
詳しくは@shin1x1さんのこちらをご覧頂くのがよいかと(勝手に張っていいのかな?

TDDの進め方は、上のリンクをみれば、「なるほど〜ほげ〜。」っとなるのですが、気になる点がひとつ。

$ phpunit FizzBuzzTest.php
PHPUnit 3.5.14 by Sebastian Bergmann.

ん???

by Sebastian Bergmann.

・・・phpunitを動かしてるのは、「by The_SunnySideup 」ですよ。の突っ込みはおいといて、
記憶が確かならば、PHPUnitの作成者の方のようです。
phpunitを実行するたびに、「オレが作ったんだよ、PHPUnit.」と主張してきます。
@せばすちゃんべるぐまんさんですね、覚えました。(もはや洗脳ですね。

ってことで、


<?php
require_once '../src/FizzBuzz.php';

/**
* FizzBuzzTest
*/
class FizzBuzzTest extends PHPUnit_Framework_TestCase {
/**
* setup
*/
public function setUp(){
$this->object = new FizzBuzz();
}

/**
* makeFizzBuzz
* @dataProvider provideMakeFizzBuzz
*/
public function test_MakeFizzBuzz($expected,$no){
$this->assertEquals($expected, $this->object->makeFizzBuzz($no));
}

public function provideMakeFizzBuzz(){
return array(
array('1',1),
array('Fizz',3),
array('Buzz',5),
array('FizzBuzz',15),
);
}
}

こうなって・・・

$phpunit FizzBuzzTest.php 
PHPUnit 3.5.15 by Sebastian Bergmann.

....

Time: 0 seconds, Memory: 3.25Mb

OK (4 tests, 4 assertions)

こうなりましたよ。ということが伝えたかった訳ですね。(@shin1x1さんの内容と同じですが。
ということで、おいしくめだまやきのできあがり。

格言的な

「よいプログラマとそうでないプログラマの違いは、 よいプログラマはテストを行って間違いをできるだけ早く発見してしまうことです。」