Slide 1

Slide 1 text

1年目の私に伝えたい! テストコードを怖がらなくなるための ヒント💡 2025/02/22 PHPカンファレンス名古屋2025 #phpcon_nagoya #q

Slide 2

Slide 2 text

自己紹介 名前 プッシュ(@push_gawa) 所属 株式会社カオナビ 職種 バックエンドエンジニア #phpcon_nagoya #q

Slide 3

Slide 3 text

挫折 #phpcon_nagoya #q

Slide 4

Slide 4 text

😱 1年目の私 一つのAPIのテスト作成に 1週間かけたが大失敗 #phpcon_nagoya #q

Slide 5

Slide 5 text

原因 ● なぜテストを書くのかわからない ● どんなテストケースを書けばいいのか わからない ● テストの書き方もわからない #phpcon_nagoya #q

Slide 6

Slide 6 text

😱 1年目の私 テストを書くことさえ、できなかった #phpcon_nagoya #q

Slide 7

Slide 7 text

📝 今日話すこと ● なぜテストを書くのか ● 私なりのテストの書き方 ● テストコードを書いたことでの変化 ● 一年目の私へのメッセージ #phpcon_nagoya #q

Slide 8

Slide 8 text

なぜテストを書くのか #phpcon_nagoya #q

Slide 9

Slide 9 text

変更を加えた際に問題がないと 自信を持つために書く テストは #phpcon_nagoya #q

Slide 10

Slide 10 text

修正箇所は意図した 動作をしていますか? #phpcon_nagoya #q

Slide 11

Slide 11 text

修正箇所は意図した 動作をしていますか? 既存の動作は 壊れていないですか? #phpcon_nagoya #q

Slide 12

Slide 12 text

YES 修正箇所は意図した 動作をしていますか? 既存の動作は 壊れていないですか? #phpcon_nagoya #q

Slide 13

Slide 13 text

テストコードが問題を事前に発見! - 組織分析機能の開発事例 - 具体例 #phpcon_nagoya #q

Slide 14

Slide 14 text

組織分析機能イメージ #phpcon_nagoya #q

Slide 15

Slide 15 text

具体的なレスポンスのイメージ #phpcon_nagoya #q [ { 'department' => '営業部', 'member_count' => 30, }, … … { 'department' => '経理部', 'member_count' => 5, }, ];

Slide 16

Slide 16 text

● 営業部メンバー:30人 ● 田中さん ○ 所属1:営業部 ○ 所属2:営業第1グループ ● 他メンバー:29人 具体的なデータ例 #phpcon_nagoya #q

Slide 17

Slide 17 text

具体的なデータ例(図) 営業部 [30人] ├── 👔 田中さん ├── 👤 ├── 👤 └── 営業第1グループ ├── 👔 田中さん(兼務) ├── 👤 #phpcon_nagoya #q

Slide 18

Slide 18 text

- 期待する結果:30人 結果 #phpcon_nagoya #q

Slide 19

Slide 19 text

- 期待する結果:30人 - 実際の結果:31人 結果 #phpcon_nagoya #q

Slide 20

Slide 20 text

差分の原因 営業部 : 👔 田中さん └── 営業第1グループ: 👔 田中さん(兼務) ※同じ人なのに2回カウント #phpcon_nagoya #q

Slide 21

Slide 21 text

✓ 兼務者の重複カウント問題を発見 ✓ 本番環境に出す前に問題を発見 ✓ 早期に修正対応が可能 テストコードを書いていてよかったこと #phpcon_nagoya #q

Slide 22

Slide 22 text

テストは 変更を加えた際に問題がないと 自信を持つために書く 🔑 ヒント #phpcon_nagoya #q

Slide 23

Slide 23 text

どうやってテストを書くのか #phpcon_nagoya #q

Slide 24

Slide 24 text

テストケース名は test_前提条件_期待する結果 で書く #phpcon_nagoya #q

Slide 25

Slide 25 text

具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { } #phpcon_nagoya #q

Slide 26

Slide 26 text

テストコード 1. AAAパターンを使う #phpcon_nagoya #q

Slide 27

Slide 27 text

具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { /** Arrange(準備) */ /** Act(実行) */ /** Assert(確認) */ } #phpcon_nagoya #q

Slide 28

Slide 28 text

テストコード 1. AAAパターンを使う 2. 期待値を先に書く #phpcon_nagoya #q

Slide 29

Slide 29 text

具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { /** Arrange(準備) */ /** Act(実行) */ /** Assert(確認) */ $expected = [ 'department' => '営業部', 'member_count' => 30, ]; $response->assertExactJson($expected) ->assertOk(); } #phpcon_nagoya #q

Slide 30

Slide 30 text

テストコード 1. AAAパターンを使う 2. 期待値を先に書く 3. コメント駆動で実現したいことを書く #phpcon_nagoya #q

Slide 31

Slide 31 text

具体的なコード例 /** Assert(確認) */ $expected = [ 'department' => '営業部', 'member_count' => 30, ]; $response ->assertExactJson($expected) ->assertOk(); } public function test_兼務社員が存在する場合_重複な しで人数がカウントされるべき(): void { /** Arrange(準備) */ // 田中さんを営業部で登録 // 田中さんを営業第一グループで登録 /** Act(実行) */ // API叩く #phpcon_nagoya #q

Slide 32

Slide 32 text

テストコード 1. AAAパターンを使う 2. 期待値を先に書く 3. コメント駆動で実現したいことを書く 4. 実際にコードを書いていく #phpcon_nagoya #q

Slide 33

Slide 33 text

具体的なコード例 public function test_兼務社員が存在する場合_重複なし で人数がカウントされるべき(): void { /** Arrange(準備) */ Department::query()->insert([ // 田中さんを営業部で登録 [ 'id' => 1, 'name' => '営業部', 'member' => '田中', ], // 田中さんを営業第一で登録 [ 'id' => 2, 'name' => '営業第一', 'member' => '田中', ], ]); /** Act(実行) */ // API叩く $response = $this->getAjax(self::URI); /** Assert(確認) */ $expected = [ 'department' => '営業部', 'member_count' => 30, ]; $response ->assertExactJson($expected) ->assertOk(); } #phpcon_nagoya #q

Slide 34

Slide 34 text

テストを書くときは 段階的に書いて、やることを明確にしよう 🔑 ヒント #phpcon_nagoya #q

Slide 35

Slide 35 text

私の中での変化 #phpcon_nagoya #q

Slide 36

Slide 36 text

● テストを書くことが「怖い」=>「楽しい」になった ● レビューでの質問などがしやすくなった ● とりあえず動くものが作れるようになった 変化 #phpcon_nagoya #q

Slide 37

Slide 37 text

✨ 1年目の私へ #phpcon_nagoya #q テストコードは僕たちの未来を守ってくれる道具さ 失敗を恐れないで小さく始めよう

Slide 38

Slide 38 text

ご清聴ありがとうございました #phpcon_nagoya #q