Try   HackMD

TDDの写経をしてみる

tags: php TDD

Qiitaの下書きで眠っていた記事を一度こちらに書き出すことに。

テストケースのみを実装します (RED)

<?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
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)

<?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]ので、これを修正しました。
また、不要な名前空間を利用していたため、この行を削除しました。
おそらく単純なコードのため今回リファクタリング等は必要なかったのですが、もっと複雑なコードになるとリファクタリングが必要になるものと思います。

まとめ

スケジューリングと見積もりについて悩んでたどり着いた書籍 (Clean Coder) にTDDについての記述があり、一度コーディングのスタイルとして取り込んでみようとしています。

参考

Q. PHPは大文字小文字を区別するか?

ドキュメントではここに書いてありました。

注意: 関数名は ASCII 文字 A から Z で構成されている場合、 大文字小文字を区別しませんが、 通常は関数宣言時と同じ名前で関数をコールする方が好ましいです。
https://www.php.net/manual/ja/functions.user-defined.php


  1. 関数名の大文字小文字は区別されません ↩︎