$30 off During Our Annual Pro Sale. View Details »

【PHPカンファレンス沖縄 2023】素朴で考慮漏れのある PHP コードをテストコードとともに補強していく(ライブコーディング補足資料) / #phpcon_okinawa 2023 livecoding supplementary material

Shohei Okada
September 16, 2023

【PHPカンファレンス沖縄 2023】素朴で考慮漏れのある PHP コードをテストコードとともに補強していく(ライブコーディング補足資料) / #phpcon_okinawa 2023 livecoding supplementary material

2023/09/16 開催「PHPカンファレンス沖縄2023」(https://phpcon.okinawa.jp/ )にて実施したライブコーディングの補足資料です。

詳細:https://fortee.jp/phpcon-okinawa-2023/proposal/0512a121-2983-4c60-90f3-651c7e7f79fd

Shohei Okada

September 16, 2023
Tweet

More Decks by Shohei Okada

Other Decks in Programming

Transcript

  1. 素朴で考慮漏れのある PHP コードを
    テストコードとともに補強していく
    (ライブコーディング補足資料)
    2023/09/16 PHPカンファレンス沖縄 2023
    @okashoi

    View Slide

  2. 所属:株式会社ウィルゲート
    登壇:
    寄稿:
    岡田 正平/おかしょい
    X(Twitter): @okashoi
    GitHub: @okashoi

    View Slide

  3. • 本セッションはライブコーディングがメインのため、
    この資料は補助的な位置づけです(公開はします)
    • 本セッションはもともと、数時間にわたる社内研修
    コンテンツを 30 分に収めたものです
    • 重要な説明以外は多く省略してしまいます
    • GitHub Copilot をフル活用します
    おことわり

    View Slide

  4. https://github.com/okashoi/phpconokinawa2023-livecoding
    • main ブランチ:初期状態
    • reference ブランチ:最終状態
    • コミットログも参考にしてください
    コード自体も公開しています

    View Slide

  5. • PHP 8.2.8
    • Composer 2.5.8
    • PHPUnit 10.3.2 ※
    ※ PHPUnit は 9 → 10 間で大きな変更があるので注意
    ライブコーディング環境

    View Slide

  6. ライブコーディング題材

    View Slide

  7. “このプログラムは入力ダイアログから3つの整数を読
    む。 この3つの値は、それぞれ三角形の3辺の長さをあら
    わすものとする。 プログラムは、三角形が不等辺三角
    形、二等辺三角形、正三角形のうちどれであるかを示す
    メッセージを表示する。”
    題材:Myers の三角形問題

    View Slide

  8. 題材:Myers の三角形問題

    View Slide

  9. PHPUnit を使った
    テストコードの書き方

    View Slide

  10. PHPUnit を使ったテストコードの書き方
    use Okashoi\MyersTriangle\Triangle;
    use PHPUnit\Framework\TestCase;
    use PHPUnit\Framework\Attributes\Test;
    class TriangleTest extends TestCase
    {
    #[Test]
    public function 三辺の長さが等しければ正三角形であること
    (): void
    {
    $triangle = new Triangle(1, 1, 1);
    $this->assertSame('正三角形', $triangle->getType());
    }
    }

    View Slide

  11. PHPUnit を使ったテストコードの書き方
    use Okashoi\MyersTriangle\Triangle;
    use PHPUnit\Framework\TestCase;
    use PHPUnit\Framework\Attributes\Test;
    class TriangleTest extends TestCase
    {
    #[Test]
    public function 三辺の長さが等しければ正三角形であること
    (): void
    {
    $triangle = new Triangle(1, 1, 1);
    $this->assertSame('正三角形', $triangle->getType());
    }
    }

    View Slide

  12. PHPUnit を使ったテストコードの書き方
    use Okashoi\MyersTriangle\Triangle;
    use PHPUnit\Framework\TestCase;
    use PHPUnit\Framework\Attributes\Test;
    class TriangleTest extends TestCase
    {
    #[Test]
    public function 三辺の長さが等しければ正三角形であること
    (): void
    {
    $triangle = new Triangle(1, 1, 1);
    $this->assertSame('正三角形', $triangle->getType());
    }
    }

    View Slide

  13. PHPUnit を使ったテストコードの書き方
    use Okashoi\MyersTriangle\Triangle;
    use PHPUnit\Framework\TestCase;
    use PHPUnit\Framework\Attributes\Test;
    class TriangleTest extends TestCase
    {
    #[Test]
    public function 三辺の長さが等しければ正三角形であること
    (): void
    {
    $triangle = new Triangle(1, 1, 1);
    $this->assertSame('正三角形', $triangle->getType());
    }
    }

    View Slide

  14. data provider の使い方

    View Slide

  15. data provider の使い方(data provider の定義)
    public static function getTypeDataProvider()
    {
    return [
    '三辺の長さが...正三角形であること' => [1, 1, 1, '正三角形'],
    '二辺の長さが...二等辺三角形であること' => [1, 2, 2, '二等辺三角形'],
    '三辺の長さが...不等辺三角形であること' => [2, 3, 4, '不等辺三角形'],
    ];
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  16. data provider の使い方(data provider の定義)
    public static function getTypeDataProvider()
    {
    return [
    '三辺の長さが...正三角形であること' => [1, 1, 1, '正三角形'],
    '二辺の長さが...二等辺三角形であること' => [1, 2, 2, '二等辺三角形'],
    '三辺の長さが...不等辺三角形であること' => [2, 3, 4, '不等辺三角形'],
    ];
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  17. data provider の使い方(data provider の定義)
    public static function getTypeDataProvider()
    {
    return [
    '三辺の長さが...正三角形であること' => [1, 1, 1, '正三角形'],
    '二辺の長さが...二等辺三角形であること' => [1, 2, 2, '二等辺三角形'],
    '三辺の長さが...不等辺三角形であること' => [2, 3, 4, '不等辺三角形'],
    ];
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers
    (任意)

    View Slide

  18. data provider の使い方(テストケース側)
    use PHPUnit\Framework\Attributes\{DataProvider, Test};
    // (略)
    #[Test]
    #[DataProvider('getTypeDataProvider')]
    public function getType($a, $b, $c, $expected)
    {
    $triangle = new Triangle($a, $b, $c);
    $this->assertSame($expected, $triangle->getType());
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  19. data provider の使い方(テストケース側)
    use PHPUnit\Framework\Attributes\{DataProvider, Test};
    // (略)
    #[Test]
    #[DataProvider('getTypeDataProvider')]
    public function getType($a, $b, $c, $expected)
    {
    $triangle = new Triangle($a, $b, $c);
    $this->assertSame($expected, $triangle->getType());
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  20. data provider の使い方(テストケース側)
    use PHPUnit\Framework\Attributes\{DataProvider, Test};
    // (略)
    #[Test]
    #[DataProvider('getTypeDataProvider')]
    public function getType($a, $b, $c, $expected)
    {
    $triangle = new Triangle($a, $b, $c);
    $this->assertSame($expected, $triangle->getType());
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  21. data provider の使い方(テストケース側)
    use PHPUnit\Framework\Attributes\{DataProvider, Test};
    // (略)
    #[Test]
    #[DataProvider('getTypeDataProvider')]
    public function getType($a, $b, $c, $expected)
    {
    $triangle = new Triangle($a, $b, $c);
    $this->assertSame($expected, $triangle->getType());
    }
    公式ドキュメント:
    https://docs.phpunit.de/en/10.3/writing-tests-for-phpunit.html#data-providers

    View Slide

  22. filter_var の使い方

    View Slide

  23. 公式ドキュメント
    https://www.php.net/manual/ja/function.filter-var.php

    View Slide

  24. 公式ドキュメント
    $a = filter_var($a, FILTER_VALIDATE_INT);
    https://www.php.net/manual/ja/filter.filters.validate.php#:~:text=FILTER_VALIDATE_INT

    View Slide

  25. 三角形が成立しないケース

    View Slide

  26. 三角形が成立しないケース

    View Slide

  27. 任意の三角形の 3 辺の長さを x, y, z、最大辺を z とした
    とき、次の不等式が必ず成立する
    ⇔ 不等式が成立しない場合は三角形が成立しない
    三角不等式

    View Slide

  28. まとめ

    View Slide

  29. • 「テストコードによって何が担保されているのか」を
    は意識しよう
    • 実装する対象の知識を深めよう
    • 業務知識、ユーザの行動、メンタルモデル等
    • (おまけ)ロジックと入出力を分けて考えよう
    まとめ

    View Slide