# 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