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
生成AIが出力するテストコードのリアル よくあるコードと改善のヒント
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
starfish719
November 18, 2025
Technology
930
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
生成AIが出力するテストコードのリアル よくあるコードと改善のヒント
starfish719
November 18, 2025
More Decks by starfish719
See All by starfish719
VibeCodingからAgenticWorkflowへ
starfish719
0
1.9k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
7.5k
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
3
14k
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
1
470
生成AI時代のエンジニア育成 変わる時代と変わらないコト
starfish719
0
16k
【Claude Code】Plugins作成から始まったファインディの開発フロー改革
starfish719
0
1.2k
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
4.3k
生成AI時代に若手エンジニアが最初に覚えるべき内容と、その学習法
starfish719
2
990
開発生産性を上げるための生成AI活用術
starfish719
3
3.5k
Other Decks in Technology
See All in Technology
LLM Content Moderationを支える評価・改善ループの実践
suikabar
2
290
【データ横丁主催】AI エージェント時代のTranslytical Data Platform
shisyu_gaku
0
210
フィンテック養成勉強会#68
finengine
0
190
AI駆動開発におけるハーネスエンジニアリングの勘所
tsukuboshi
1
430
Codex を使った障害対応机上演習の実際
orgachem
PRO
0
250
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
0
230
野良MCPサーバーを排除せよ!MCPサーバーのガバナンス
yukiogawa
1
150
Turning Repos into the Product Second Brain with an LLM Wiki
linedevth
0
130
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
1
220
「エーアイ」をバズワードにしないために RPA 導入経験と Kiro 上での Claude モデル利用経験から
kazzpapa3
0
110
小規模OSSモデルは サイバーセキュリティ業務に どこまで使えるか
bbrbbq
0
170
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
140
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
The Language of Interfaces
destraynor
162
27k
Being A Developer After 40
akosma
92
590k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
830
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
450
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
430
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Transcript
© Findy Inc. 2025.11 Findy AI Meetup ⽣成AIが出⼒するテストコードのリアル よくあるコードと改善のヒント 1
ファインディ株式会社 テックリードマネージャー ⼾⽥ 千隼 @starfish0206
© Findy Inc. 2 ⽣成AI時代のテストコードの役割
© Findy Inc. 3 暴⾛を防ぐためのガードレール • テストコードが持つ役割 ◦ 仕様を把握するための情報源 ◦
暴⾛しないためのガードレール • ⽣成AIが出⼒したコードが原因で既存のテストコードが失敗した場合 ◦ エラー内容を元に⽣成AIが実装または、テストコードを修正する ◦ エラーの原因がどこにあるのかの判断を間違えないことがポイント • 「何が正しいのか」を⽣成AIが理解することで、出⼒内容の⽅向性がズレないようにする
© Findy Inc. 4 ⽣成されるテストコードの実状と改善⽅法
© Findy Inc. 不要な新規ケースが追加される 5
© Findy Inc. 6 どんどんテストケースが追加されてしまう • 既存のテストケースに⼿を加えればいいだけなのに、新しいテストケースが追加されてし まう ◦ モデルなどに項⽬追加する時に⾒られる
• テストケースの名称がポイントになる
© Findy Inc. 7 class TestUserModel: def test_user_attributes(self): user =
User( name="Test User", is_deleted=True ) assert user.name == "Test User" assert user.is_deleted is True def test_user_default_is_deleted(self): user = User( name="Test User", ) assert user.is_deleted is False
© Findy Inc. 8 class TestUserModel: def test_user_attributes(self): user =
User( name="Test User", role="admin", is_deleted=True ) assert user.name == "Test User" assert user.role == "admin" assert user.is_deleted is True def test_user_default_is_deleted(self): user = User( name="Test User", ) assert user.is_deleted is False def test_user_default_role(self): user = User( name="Test User", ) assert user.role == "member"
© Findy Inc. 9 class TestUserModel: def test_user_attributes(self): user =
User( name="Test User", role="admin", is_deleted=True ) assert user.name == "Test User" assert user.role == "admin" assert user.is_deleted is True def test_user_default_is_deleted(self): user = User( name="Test User", ) assert user.is_deleted is False def test_user_default_role(self): user = User( name="Test User", ) assert user.role == "member"
© Findy Inc. 10 class TestUserModel: def test_user_attributes(self): user =
User( name="Test User", role="admin", is_deleted=True ) assert user.name == "Test User" assert user.role == "admin" assert user.is_deleted is True def test_user_default_attributes(self): user = User( name="Test User", ) assert user.role == "member" assert user.is_deleted is False
© Findy Inc. 11 class TestUserModel: def test_user_attributes(self): user =
User( name="Test User", role="admin", is_deleted=True ) assert user.name == "Test User" assert user.role == "admin" assert user.is_deleted is True def test_user_default_attributes(self): user = User( name="Test User", ) assert user.role == "member" assert user.is_deleted is False まずは既存のテストコードを⾒直す
© Findy Inc. テストを通すためのテスト 12
© Findy Inc. 13 無理やりテストを通そうとする • テストを通すための修正をやりがち ◦ テストが通るまでトライアンドエラーを繰り返す ◦
⾊々試している流れでテストが通ったら、それが正解だと判断されてしまう • 適切にmockを使いましょう
© Findy Inc. 14 class TestEmailService: def test_create_invite_mail_body(self): to_email =
"
[email protected]
" invite_link = "https://example.com/invite/12345" text_body = email_service.create_invite_mail_body(to_email, invite_link) assert f"{to_email}様" in text_body assert invite_link in text_body assert "このリンクの有効期限は " in text_body assert "です" in text_body
© Findy Inc. 15 class TestEmailService: def test_create_invite_mail_body(self): to_email =
"
[email protected]
" invite_link = "https://example.com/invite/12345" text_body = email_service.create_invite_mail_body(to_email, invite_link) assert f"{to_email}様" in text_body assert invite_link in text_body assert "このリンクの有効期限は " in text_body assert "です" in text_body - 有効期限の⽇時の確認が漏れている - 意図しない⽂字列が⼊っていても通っ てしまう
© Findy Inc. 16 class TestEmailService: def test_create_invite_mail_body(self, monkeypatch): mock_datetime
= MagicMock() mock_datetime.now.return_value = datetime(2025, 11, 1, 0, 0, 0, tzinfo=UTC) monkeypatch.setattr("src.service.email.datetime", mock_datetime) to_email = "
[email protected]
" invite_link = "https://example.com/invite/12345" text_body = email_service.create_invite_mail_body(to_email, invite_link) assert text_body == f"{to_email}様\n{invite_link}\nこのリンクの有効期限は 2025/11/15 です。"
© Findy Inc. 17 class TestEmailService: def test_create_invite_mail_body(self, monkeypatch): mock_datetime
= MagicMock() mock_datetime.now.return_value = datetime(2025, 11, 1, 0, 0, 0, tzinfo=UTC) monkeypatch.setattr("src.service.email.datetime", mock_datetime) to_email = "
[email protected]
" invite_link = "https://example.com/invite/12345" text_body = email_service.create_invite_mail_body(to_email, invite_link) assert text_body == f"{to_email}様\n{invite_link}\nこのリンクの有効期限は 2025/11/15 です。" ケースに応じたmockの使⽤⽅法を カスタムインストラクションなどに 追記
© Findy Inc. システムを守るテスト 18
© Findy Inc. 19 現状は問題ないが、拡張してもコケてくれない • テストを通すことが⽬的ではない ◦ 適切な理由とタイミングでコケるのが良いテスト •
意図しない変更を、テストがコケることで事前に検知したい ◦ 何がどうなったらテストがコケてくれるのかをイメージしましょう
© Findy Inc. 20 class TestGetUserById: def test_get_user_by_id_success(self, client): target_user
= User( name="Test User", ) response = client.get(f"/api/v1/users/{target_user.id}") assert response.status_code == status.HTTP_200_OK assert response["id"] == target_user.id assert response["name"] == "Test User"
© Findy Inc. 21 class TestGetUserById: def test_get_user_by_id_success(self, client): target_user
= User( name="Test User", ) response = client.get(f"/api/v1/users/{target_user.id}") assert response.status_code == status.HTTP_200_OK assert response["id"] == target_user.id assert response["name"] == "Test User" responseに項⽬が 追加されてもコケない
© Findy Inc. 22 class TestGetUserById: def test_get_user_by_id_success(self, client): target_user
= User( name="Test User", ) response = client.get(f"/api/v1/users/{target_user.id}") assert response.status_code == status.HTTP_200_OK assert response.json() == { "id": target_user.id, "name": "Test User", }
© Findy Inc. class TestGetUserById: def test_get_user_by_id_success(self, client): target_user =
User( name="Test User", ) response = client.get(f"/api/v1/users/{target_user.id}") assert response.status_code == status.HTTP_200_OK assert response.json() == { "id": target_user.id, "name": "Test User", } 23 意図しない項⽬追加時に コケてくれる ケースごとの テストのサンプルコードを カスタムインストラクションに追記
© Findy Inc. 24 まとめ
© Findy Inc. まとめ 25 • ⽣成AIが出⼒するテストコードの質には伸び代がある ◦ 伸び代ポイントを⾒つけた場合 ▪
既存のテストコードの⾒直し ▪ カスタムインストラクションなどにサンプルコードを記述 • ⽣成AI時代のテストコードが持つ役割は、今までよりも重要になった ◦ 出⼒される実装コードの質を向上させるために、テストコードとも向き合いましょう ファインディに興味がある⽅は、ぜひカジュアル⾯談しましょう
© Findy Inc. ご清聴ありがとうございました 26