Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

ライブコーディング題材

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

題材:Myers の三角形問題

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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()); } }

Slide 11

Slide 11 text

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()); } }

Slide 12

Slide 12 text

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()); } }

Slide 13

Slide 13 text

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()); } }

Slide 14

Slide 14 text

data provider の使い方

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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 (任意)

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

filter_var の使い方

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

まとめ

Slide 29

Slide 29 text

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