FizzBuzz問題のテストをPHP-Unitで書いてみる

今まであまりテストを書いたことがなかったので簡単な問題のテストを書いてみた。内容は、以前話題になったFizzBuzz問題フレームワークはCakePHP2系。
ref. どうしてプログラマに・・・プログラムが書けないのか?

やってみてわかったけど、この問題だと骨子の判定の条件がテストの方にも出てしまうのでなんかイマイチ感がある。ただ、テストのほうをプリミティブに書いておいて、実際のモデルのほうをリファクタリングして行ったりすることを考えれば十分意味があるのだろうと思う。

また、モデルのロジックの修正を何度かやってみたけどテストを通すだけで動作の文字通りテストができてしまうという便利さは実感できたので、手始めには良いのかもしれない。

謎があるとすれば、FizzBuzzのテストを10000回ほどforを回してチェックしているけど、もし何らかの原因で10001回目にバグがあったらどうするのだろうか。無限に回すわけには行かないので、もしかすると何らかの証明的な何かを考えてテストしないといけないのかもしれない

世の中は難しいことがいっぱいある

<?php

    class FizzbuzzTest extends CakeTestCase {  
        public function setUp() {  
            parent::setUp();

            // Fizzbuzz用のモデルを生成する  
            $this->Fizzbuzz = ClassRegistry::init('Fizzbuzz.Fizzbuzz');  
        }

        /**  
         * t()のテスト  
         *  必ずtrueが返ってくる  
         */  
        public function testT() {  
            $this->assertTrue($this->Fizzbuzz->t());  
        }

        /**  
         * f()のテスト  
         *  必ずfalseが返ってくる  
         */  
        public function testF() {  
            $this->assertFalse($this->Fizzbuzz->f());  
        }

        /**  
         * fizzbuzz()のテスト  
         *  3の倍数で5の倍数でない場合は"Fizz"が返ってくる  
         */  
        public function testGetFizz() {  
            for ($i = 0; $i < 10000; $i++) {  
                if ($i % 3 == 0 && $i % 5 != 0) {  
                    $this->assertEquals("Fizz", $this->Fizzbuzz->get($i));  
                }  
            }  
        }

        /**  
         * fizzbuzz()のテスト  
         *  5の倍数で3の倍数でない場合は"Buzz"が返ってくる  
         */  
        public function testGetBuzz() {  
            for ($i = 0; $i < 10000; $i++) {  
                if ($i % 5 == 0 && $i % 3 != 0) {  
                    $this->assertEquals("Buzz", $this->Fizzbuzz->get($i));  
                }  
            }  
        }

        /**  
         * fizzbuzz()のテスト  
         *  3の倍数と5の倍数の場合は"FizzBuzz"が返ってくる  
         */  
        public function testGetFizzbuzz() {  
            for ($i = 0; $i < 10000; $i++) {  
                if ($i % 5 == 0 && $i % 3 == 0) {  
                    $this->assertEquals("FizzBuzz", $this->Fizzbuzz->get($i));  
                }  
            }  
        }

        /**  
         * fizzbuzz()のテスト  
         *  3の倍数でも5の倍数でもない場合は与えられた数値がそのまま返ってくる  
         */  
        public function testGetOther() {  
            for ($i = 0; $i < 10000; $i++) {  
                if ($i % 5 != 0 && $i % 3 != 0) {  
                    $this->assertEquals($i, $this->Fizzbuzz->get($i));  
                }  
            }  
        }

    }