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
名単体テスト 禁断の傀儡(モック)
Search
iwamot
PRO
May 14, 2025
Technology
730
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
名単体テスト 禁断の傀儡(モック)
2025-05-14
シネマ de LT会〜あなたのナレッジ大上映〜
https://aeon.connpass.com/event/352070/
iwamot
PRO
May 14, 2025
More Decks by iwamot
See All by iwamot
MCP Appsを作ってみよう
iwamot
PRO
4
730
自己紹介
iwamot
PRO
1
95
パワポ作るマンをMCP Apps化してみた
iwamot
PRO
0
710
8万デプロイ
iwamot
PRO
2
370
AIエージェント・マイクロサービス時代。AWSでの手軽な構築法を考えて試してみた
iwamot
PRO
1
110
これがLambdaレス時代のChatOpsだ!実例で学ぶAmazon Q Developerカスタムアクション活用法
iwamot
PRO
10
2.8k
Developer Certificate of Origin、よさそう
iwamot
PRO
0
100
復号できなくなると怖いので、AWS KMSキーの削除を「面倒」にしてみた CODT 2025 クロージングイベント版
iwamot
PRO
1
210
復号できなくなると怖いので、AWS KMSキーの削除を「面倒」にしてみた
iwamot
PRO
3
170
Other Decks in Technology
See All in Technology
ループエンジニアリングでE2Eテストを実践
noriyukitakei
0
240
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
600
10x Speed With QA Agent Platform - How we scaled adoption from individual effort to organizational capability
lycorptech_jp
PRO
0
120
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
150
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
0
150
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
200
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
430
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
330
背中から、背中へ /paying forward to community
naitosatoshi
0
210
Why is RC4 still being used?
tamaiyutaro
0
280
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
340
AIエージェントとPhysical AIが拓く製造業の変革(ハノーバーメッセリキャップ)
iotcomjpadmin
0
210
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
340
The Limits of Empathy - UXLibs8
cassininazir
1
380
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
Six Lessons from altMBA
skipperchong
29
4.3k
Being A Developer After 40
akosma
91
590k
Designing Experiences People Love
moore
143
24k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Documentation Writing (for coders)
carmenintech
77
5.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Odyssey Design
rkendrick25
PRO
2
720
Transcript
名単体テスト 名単体テスト ~ 禁断の ~ 禁断の傀儡 傀儡 ~ ~ モ
ッ ク モ ッ ク 2025.5.14 シネマ de L T会@イオンシネマ シアタス調布 2025.5.14 シネマ de LT会@イオンシネマ シアタス調布 https:/ /aeon.connpass.com/event/352070/ https://aeon.connpass.com/event/352070/
俺の名前は岩本隆史 俺の名前は岩本隆史 ここ シアタス調布の常連さ ここ シアタス調布の常連さ
ENECHANGEって会社で ENECHANGEって会社で インフラを見てるのが表の顔 インフラを見てるのが表の顔
裏では Slackbotを開発してる 裏では Slackbotを開発してる 刑事じゃねえけど「 刑事じゃねえけど「Collmbo Collmbo」ってヤツさ 」ってヤツさ コ ロ
ン ボ コ ロ ン ボ
ある日 俺はAIエージェントに ある日 俺はAIエージェントに Collmboの単体テストを書かせてみた Collmboの単体テストを書かせてみた
だが 生成されたテストに だが 生成されたテストに 霧のような不安を覚えちまった 霧のような不安を覚えちまった
@patch("app.bolt_listeners.find_parent_message", return_value=None) @patch("app.bolt_listeners.is_this_app_mentioned") def test_is_child_message_and_mentioned_no_channel_id( mock_is_mentioned, mock_find_parent, mock_client, mock_context ):
mock_context.channel_id = None assert is_child_message_and_mentioned( mock_client, mock_context, "12345") is False mock_find_parent.assert_not_called() mock_is_mentioned.assert_not_called() ―― モックだらけじゃねえか ―― モックだらけじゃねえか こんなもん 受け入れていいのか? こんなもん 受け入れていいのか?
そんとき俺は ある本が そんとき俺は ある本が 棚に眠ってんのを思い出した 棚に眠ってんのを思い出した
None
読み進めて 俺は 読み進めて 俺は ようやく理解できた ようやく理解できた
「モックを単体テストで使うのは悪手」 「モックを単体テストで使うのは悪手」 ってことが ―― ってことが ――
モックって奴は モックって奴は 実装を知りすぎてんだ 実装を知りすぎてんだ
だから 実装を少し変えるだけで だから 実装を少し変えるだけで 簡単に壊れちまう 簡単に壊れちまう
実装を変えやすくするのが 実装を変えやすくするのが 単体テストの目的だってのによ 単体テストの目的だってのによ
bmi :: Float -> Float -> Float bmi weight height
= weight / height ^ 2 なら モックのいらない実装に変えりゃいい なら モックのいらない実装に変えりゃいい 理想は「副作用のない純粋関数」さ 理想は「副作用のない純粋関数」さ
def build_slack_user_prefixed_text(reply: dict, text: str) -> str: user_identifier = reply.get("user",
reply.get("username")) return f"<@{user_identifier}>: {text}" 光の見えた俺は Collmboに 光の見えた俺は Collmboに 純粋関数を増やしてった 純粋関数を増やしてった
@pytest.mark.parametrize( "reply, text, expected", [ ({"user": "U123"}, "hello", "<@U123>: hello"),
({"username": "someone"}, "hi", "<@someone>: hi"), ({}, "yo", "<@None>: yo"), ], ) def test_build_slack_user_prefixed_text(reply, text, expected): assert build_slack_user_prefixed_text(reply, text) == expected AIの書いたテストも 今なら AIの書いたテストも 今なら 自信を持って受け入れられるぜ 自信を持って受け入れられるぜ
もう俺は モックにゃ頼らねえ もう俺は モックにゃ頼らねえ あくまで単体テストでは ―― だけどな あくまで単体テストでは ―― だけどな
名単体テスト 名単体テスト ~ 禁断の ~ 禁断の傀儡 傀儡 ~ ~ モ
ッ ク モ ッ ク END END
速 報
名統合テスト 名統合テスト ~ 抗えぬ ~ 抗えぬ傀儡 傀儡 ~ ~ モ
ッ ク モ ッ ク 時期未定 時期未定