# TDDの写経をしてみる ###### tags: `php` `TDD` Qiitaの下書きで眠っていた記事を一度こちらに書き出すことに。 ## テストケースのみを実装します (RED) ```php <?php use PHPUnit\Framework\TestCase; use tarohida\Sample\Sample; class SampleTest extends TestCase { /** * @dataProvider inputProvider */ public function testReturnHatsuneMiku(int $input, ?string $expected): void { $this->assertSame($expected, Sample::getHatsuneMiku($input)); } public function inputProvider() { return [ [39, 'ハツネミク'], [0, NULL], [-1, NULL], [1, NULL], [40, NULL], [38, NULL] ]; } } ``` 利用する`Sample`クラスが存在しないので、エラーが出力されます。テストは書けました。 この状態がREDです。 ``` $ ./vendor/bin/phpunit ./tests/Sample/SampleTest.php PHPUnit 9.1.5 by Sebastian Bergmann and contributors. EEEEEE 6 / 6 (100%) Time: 00:00.041, Memory: 4.00 MB ``` ## テストをパスする最低限のコードを実装 (GREEN) ```php <?php namespace tarohida\Sample; use PHPUnit\Framework\TestCase; class Sample{ public static function getHatsunemiku(int $input): ?string { if ($input === 39) { return 'ハツネミク'; } return NULL; } } ``` テストを実行するとエラーなく実行されました。if文の条件式の中身を`if ($input !== 39)`と素でひっくり返して、一度テストコードに怒られました。テストコードを書いててよかったですね。この状態がGREENです。 ``` $ ./vendor/bin/phpunit ./tests/Sample/SampleTest.php PHPUnit 9.1.5 by Sebastian Bergmann and contributors. ...... 6 / 6 (100%) Time: 00:00.038, Memory: 4.00 MB ``` ## リファクタリング (REFACTOR) ```diff <?php namespace tarohida\Sample; - use PHPUnit\Framework\TestCase; class Sample{ - public static function getHatsunemiku(int $input): ?string + public static function getHatsuneMiku(int $input): ?string { if ($input === 39) { return 'ハツネミク'; } return NULL; } } ``` テストにパスする範囲で、内部の処理をリファクタリングします。 よく見たら関数名に大文字小文字が混ざっていた[^1]ので、これを修正しました。 また、不要な名前空間を利用していたため、この行を削除しました。 おそらく単純なコードのため今回リファクタリング等は必要なかったのですが、もっと複雑なコードになるとリファクタリングが必要になるものと思います。 [^1]: [関数名の大文字小文字は区別されません](#q-phpは大文字小文字を区別するか) ## まとめ スケジューリングと見積もりについて悩んでたどり着いた書籍 (Clean Coder) にTDDについての記述があり、一度コーディングのスタイルとして取り込んでみようとしています。 ## 参考 ### [Q. PHPは大文字小文字を区別するか?](https://qiita.com/tadsan/items/6c6329eeb43929271119) ドキュメントではここに書いてありました。 > 注意: **関数名は ASCII 文字 A から Z で構成されている場合、 大文字小文字を区別しません**が、 通常は関数宣言時と同じ名前で関数をコールする方が好ましいです。 https://www.php.net/manual/ja/functions.user-defined.php