Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not be...
Search
プッシュ
February 22, 2025
Programming
1.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
プッシュ
February 22, 2025
Other Decks in Programming
See All in Programming
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
550
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
400
「人を評価する AI」の設計と実装
ryoyanara
0
180
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
仕様駆動開発の消費期限
watany
16
7.3k
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
300
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
310
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.5k
メールのエイリアス機能を履き違えない
isshinfunada
0
230
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
620
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Utilizing Notion as your number one productivity tool
mfonobong
4
520
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Making the Leap to Tech Lead
cromwellryan
135
10k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
410
Transcript
1年目の私に伝えたい! テストコードを怖がらなくなるための ヒント💡 2025/02/22 PHPカンファレンス名古屋2025 #phpcon_nagoya #q
自己紹介 名前 プッシュ(@push_gawa) 所属 株式会社カオナビ 職種 バックエンドエンジニア #phpcon_nagoya #q
挫折 #phpcon_nagoya #q
😱 1年目の私 一つのAPIのテスト作成に 1週間かけたが大失敗 #phpcon_nagoya #q
原因 • なぜテストを書くのかわからない • どんなテストケースを書けばいいのか わからない • テストの書き方もわからない #phpcon_nagoya #q
😱 1年目の私 テストを書くことさえ、できなかった #phpcon_nagoya #q
📝 今日話すこと • なぜテストを書くのか • 私なりのテストの書き方 • テストコードを書いたことでの変化 • 一年目の私へのメッセージ
#phpcon_nagoya #q
なぜテストを書くのか #phpcon_nagoya #q
変更を加えた際に問題がないと 自信を持つために書く テストは #phpcon_nagoya #q
修正箇所は意図した 動作をしていますか? #phpcon_nagoya #q
修正箇所は意図した 動作をしていますか? 既存の動作は 壊れていないですか? #phpcon_nagoya #q
YES 修正箇所は意図した 動作をしていますか? 既存の動作は 壊れていないですか? #phpcon_nagoya #q
テストコードが問題を事前に発見! - 組織分析機能の開発事例 - 具体例 #phpcon_nagoya #q
組織分析機能イメージ #phpcon_nagoya #q
具体的なレスポンスのイメージ #phpcon_nagoya #q [ { 'department' => '営業部', 'member_count' =>
30, }, … … { 'department' => '経理部', 'member_count' => 5, }, ];
• 営業部メンバー:30人 • 田中さん ◦ 所属1:営業部 ◦ 所属2:営業第1グループ • 他メンバー:29人
具体的なデータ例 #phpcon_nagoya #q
具体的なデータ例(図) 営業部 [30人] ├── 👔 田中さん ├── 👤 ├── 👤
└── 営業第1グループ ├── 👔 田中さん(兼務) ├── 👤 #phpcon_nagoya #q
- 期待する結果:30人 結果 #phpcon_nagoya #q
- 期待する結果:30人 - 実際の結果:31人 結果 #phpcon_nagoya #q
差分の原因 営業部 : 👔 田中さん └── 営業第1グループ: 👔 田中さん(兼務) ※同じ人なのに2回カウント
#phpcon_nagoya #q
✓ 兼務者の重複カウント問題を発見 ✓ 本番環境に出す前に問題を発見 ✓ 早期に修正対応が可能 テストコードを書いていてよかったこと #phpcon_nagoya #q
テストは 変更を加えた際に問題がないと 自信を持つために書く 🔑 ヒント #phpcon_nagoya #q
どうやってテストを書くのか #phpcon_nagoya #q
テストケース名は test_前提条件_期待する結果 で書く #phpcon_nagoya #q
具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { } #phpcon_nagoya #q
テストコード 1. AAAパターンを使う #phpcon_nagoya #q
具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { /** Arrange(準備) */ /**
Act(実行) */ /** Assert(確認) */ } #phpcon_nagoya #q
テストコード 1. AAAパターンを使う 2. 期待値を先に書く #phpcon_nagoya #q
具体的なコード例 public function test_兼務社員が存在する場合_重複なしで人数がカウントされるべき(): void { /** Arrange(準備) */ /**
Act(実行) */ /** Assert(確認) */ $expected = [ 'department' => '営業部', 'member_count' => 30, ]; $response->assertExactJson($expected) ->assertOk(); } #phpcon_nagoya #q
テストコード 1. AAAパターンを使う 2. 期待値を先に書く 3. コメント駆動で実現したいことを書く #phpcon_nagoya #q
具体的なコード例 /** Assert(確認) */ $expected = [ 'department' => '営業部',
'member_count' => 30, ]; $response ->assertExactJson($expected) ->assertOk(); } public function test_兼務社員が存在する場合_重複な しで人数がカウントされるべき(): void { /** Arrange(準備) */ // 田中さんを営業部で登録 // 田中さんを営業第一グループで登録 /** Act(実行) */ // API叩く #phpcon_nagoya #q
テストコード 1. AAAパターンを使う 2. 期待値を先に書く 3. コメント駆動で実現したいことを書く 4. 実際にコードを書いていく #phpcon_nagoya
#q
具体的なコード例 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
テストを書くときは 段階的に書いて、やることを明確にしよう 🔑 ヒント #phpcon_nagoya #q
私の中での変化 #phpcon_nagoya #q
• テストを書くことが「怖い」=>「楽しい」になった • レビューでの質問などがしやすくなった • とりあえず動くものが作れるようになった 変化 #phpcon_nagoya #q
✨ 1年目の私へ #phpcon_nagoya #q テストコードは僕たちの未来を守ってくれる道具さ 失敗を恐れないで小さく始めよう
ご清聴ありがとうございました #phpcon_nagoya #q