Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not be...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
プッシュ
February 22, 2025
Programming
1.4k
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
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7.1k
JIS keyboard support in Omarchy
lef237
0
170
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.1k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
490
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
200
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
1.9k
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
630
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
180
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.5k
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
200
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
Performance Optimization With LLMs
xleitix
0
230
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
570
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
Balancing Empowerment & Direction
lara
6
1.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
Code Reviewing Like a Champion
maltzj
529
40k
Making the Leap to Tech Lead
cromwellryan
135
10k
Odyssey Design
rkendrick25
PRO
2
900
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
550
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Test your architecture with Archunit
thirion
2
2.5k
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