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
1
510
名単体テスト 禁断の傀儡(モック)
2025-05-14
シネマ de LT会〜あなたのナレッジ大上映〜
https://aeon.connpass.com/event/352070/
iwamot
PRO
May 14, 2025
Tweet
Share
More Decks by iwamot
See All by iwamot
復号できなくなると怖いので、AWS KMSキーの削除を「面倒」にしてみた CODT 2025 クロージングイベント版
iwamot
PRO
1
55
復号できなくなると怖いので、AWS KMSキーの削除を「面倒」にしてみた
iwamot
PRO
3
69
IPA&AWSダブル全冠が明かす、人生を変えた勉強法のすべて
iwamot
PRO
13
10k
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
4
1k
クォータ監視、AWS Organizations環境でも楽勝です✌️
iwamot
PRO
2
510
Cline、めっちゃ便利、お金が飛ぶ💸
iwamot
PRO
22
22k
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
PRO
3
1.3k
始めないともったいない!SLO運用で得られる3つのメリット
iwamot
PRO
1
160
あなたの人生も変わるかも?AWS認定2つで始まったウソみたいな話
iwamot
PRO
3
8.2k
Other Decks in Technology
See All in Technology
roppongirb_20250911
igaiga
0
160
react-callを使ってダイヤログをいろんなとこで再利用しよう!
shinaps
1
220
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
170
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
200
これでもう迷わない!Jetpack Composeの書き方実践ガイド
zozotech
PRO
0
220
MCPで変わる Amebaデザインシステム「Spindle」の開発
spindle
PRO
3
3.1k
ガチな登山用デバイスからこんにちは
halka
1
230
Firestore → Spanner 移行 を成功させた段階的移行プロセス
athug
1
410
Snowflakeの生成AI機能を活用したデータ分析アプリの作成 〜Cortex AnalystとCortex Searchの活用とStreamlitアプリでの利用〜
nayuts
1
450
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
270
20250910_障害注入から効率的復旧へ_カオスエンジニアリング_生成AIで考えるAWS障害対応.pdf
sh_fk2
3
190
初めてAWSを使うときのセキュリティ覚書〜初心者支部編〜
cmusudakeisuke
1
200
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
111
20k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
Into the Great Unknown - MozCon
thekraken
40
2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Embracing the Ebb and Flow
colly
87
4.8k
Designing Experiences People Love
moore
142
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
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
速 報
名統合テスト 名統合テスト ~ 抗えぬ ~ 抗えぬ傀儡 傀儡 ~ ~ モ
ッ ク モ ッ ク 時期未定 時期未定