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
生成AIが出力するテストコードのリアル よくあるコードと改善のヒント
Search
starfish719
November 18, 2025
Technology
890
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
760
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
5.1k
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
2
13k
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
1
400
生成AI時代のエンジニア育成 変わる時代と変わらないコト
starfish719
0
15k
【Claude Code】Plugins作成から始まったファインディの開発フロー改革
starfish719
0
1.1k
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
4.2k
生成AI時代に若手エンジニアが最初に覚えるべき内容と、その学習法
starfish719
2
940
開発生産性を上げるための生成AI活用術
starfish719
3
3.4k
Other Decks in Technology
See All in Technology
関東Kaggler会発表資料
takoi
1
280
AIで変わるエンジニアの働き方(仮)
naoinaoi
0
380
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
280
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
5
830
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
120
コーチングの奥義 何もしないテクニック
jinwatanabe
0
140
AI時代に、人は何を、どう学ぶのか #pbl_pub / What and How Do We Learn in the AI Era?
takaking22
1
230
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
580
Oracle MCP Servers Explained
thatjeffsmith
0
390
コネクションをピン留めさせずに SELECTクエリのタイムアウトを設定した話
codmoninc
0
200
AIのためのEthernet技術動向 (SerDes)
markunet
1
290
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
360
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
280
Amusing Abliteration
ianozsvald
1
260
How to train your dragon (web standard)
notwaldorf
97
6.8k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
270
GraphQLとの向き合い方2022年版
quramy
50
15k
The Language of Interfaces
destraynor
162
27k
From π to Pie charts
rasagy
0
310
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
210
Git: the NoSQL Database
bkeepers
PRO
432
67k
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