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
社内LT
Search
b1t
October 07, 2025
27
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
社内LT
b1t
October 07, 2025
Featured
See All Featured
New Earth Scene 8
popppiees
4
2.7k
Marketing to machines
jonoalderson
1
5.9k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Docker and Python
trallard
47
4.2k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
For a Future-Friendly Web
brad_frost
184
10k
Into the Great Unknown - MozCon
thekraken
41
2.8k
Mind Mapping
helmedeiros
1
400
WCS-LA-2024
lcolladotor
0
890
Transcript
激論!単体テストの考え方につ いて あなたは古典学派?ロンドン学派?
目的 ・ukiに単テを導入するに当たって、一人で妄想するのに限界があるので皆の意見を借りたい ・単体テストについての認識合わせ ・ディスカッションの機会が欲しい!
注意点 ・「どちらがいい」と結論を決めるのが主目的ではなく、あくまで単体テストの考え方や手法、ウキに導入するにあ たっての理解を深める&認識を併せるのが目的です。 ・このスライドの正しさは保証できません。間違ってる事あるかもしれません。
アジェンダ 1.単体テストの定義 2.依存について 3.単・結テストとE2Eテストの違い 4.古典学派?ロンドン学派? 5.ukiでの実装例 6.ukiにとってどちらがよい? 7.良い単体テストとは?
1.単体テストの定義とは? 「単体」と呼ばれる少量 のコードを検証する事 実行時間が短い事 隔離された状態で実行 する事 「単体」とは?? 「隔離された状態」 とは??
2.依存について 依存 プライベート依存 共有依存 不変依存 可変依存 ※言葉が難しいだけで平易な概念です
2.依存について 不変依存とは? ・テスト対象クラスのオブジェクトが生成された時点から変更されない依存のこと ・例えばukiのCDefとか
2.依存について 可変依存とは? ・テスト対象クラスのオブジェクトが生成された時点から変更される可能性のある依存のこと ・例えば変数とか ・setterを用いて他クラスをsetするのも可変依存(…だと思います)
2.依存について 共有依存とは? ・テストケース間で共有される依存のこと ・例えばDBとか
3.単体と結合、結合と E2Eテストの違い ・単体と結合テストの違いはテストケース間で 共有される依存も含めるか否か →「共有依存」 ・結合テストとE2Eテストの違いはシステム外 部の依存(郵便番号取得APIとか)も含めるか 否か
4.古典学派?ロンドン学派? 「単体」と呼ばれる少 量のコードを検証する 事 実行時間が短い事 隔離された状態で実 行する事 単体?それって何を持って「単体」って言って るんすか?テスト対象のクラス?別にそのク ラスが中で何してようが振る舞いが変わんな
きゃ目的達成できてると思うんすよね。何をテ … 隔離?それって何を持って「隔離」って言っ てるんすか?他のクラスと隔離してるんす か?それとも他のテストケースとの隔離を 意味してるんすか?てかそもそも何のため に単体テストで隔離する… 解釈の不一致が生まれる!
4.古典学派?ロンドン学派? 隔離対象 単体の意味 テスト・ダブル(モック) 化対象 ロンドン学派 クラス単位 1つのクラス 不変依存を除く全ての 依存
古典学派 テストケース単位 テスト対象のクラスの振る舞い 共有依存
4.古典学派?ロンドン学派? 依存 プライベート依存 共有依存 不変依存 可変依存 古典学派のモック対象 ロンドン学派のモック対象
5.実装例(わたなべ式古典学派 ) あまりに長いのでこちら
6.学派ごとのメリデメ 古典学派 メリット ・クラス内部の振る舞いについては記載をしないので、テスト対象のリファクタリングがしやすい →クラスの振る舞いに関しては正しいのに、テストではアウトとされてしまう (偽陽性) ・モック化せずに実際のインスタンスを使うので、深くまで振る舞いを見に行く必要がない →モックを使用してテストを書く場合、モック対象のメソッドがどの引数を取った時に何を返すか等を把握しないといけない ・テストケースが仕様書になる(らしい) デメリット
・テスト失敗時の原因の特定が難しい ・依存が複雑な時にもモックを使用しないので、テストデータの作成が難しい (らしい)
6.学派ごとのメリデメ ロンドン学派 メリット ・テストがこけた時に原因が分かりやすい →依存クラスをモック化しているので、テストがこけた原因はテスト対象のクラスだと分かる ・依存が複雑な時にもモック化できるので、テストデータの用意が平易 (らしい) ・テストが書きやすい デメリット ・内部の処理に依存するので、偽陽性が起きやすい
→振る舞い正しいのにテストこけちゃう…リファクタリングするたびにテストコード変えないといけない ・テストコードを見ただけではそのクラスがどのような振る舞いをしているのか分かりづらい
激論!ukiでテスト導入をするなら …古典 学派?ロンドン学派?あなたはどっち派で すか?
7.良い単体テストとは? 良い単体テストを構成するものとして以下の4本の柱があり、これらの掛け算でテストの価値 を評価できる。 • 退行に対する保護 • リファクタリングへの耐性 • 迅速なフィードバック •
保守のしやすさ 参考URL
7-1.退行に対する保護 テストをすることでバグの存在をいかに検出できるのかを示す性質 • テストの際に実行されるプロダクションコードが多くなるほどより多くのバグを検知できる。 →モックを使用せず実際のインスタンスを使用する古典学派の方が優位
7-2.リファクタリングへの耐性 偽陽性を生み出すことなく、どのくらいのプロダクションコードに対してリファクタリン グを行えるかを示す性質 • 偽陽性=正しい振る舞いをしているのに、テストでバグだと出てしまう事。(かかっ てないのに検査結果コロナ陽性みたいな) • テストを作成する際に内部処理をアサーションすると、リファクタリングの際に振る 舞いは変わらないけど内部処理変わるから陽性と出る •
振る舞いを検証する古典学派の方が優位
7-3.迅速なフィードバック テストの実行時間がどのくらい短くなるのかに影響する性質 • 速やかにテストを行えるようになると、用意されるテストケースやテストの頻度が増え る。 • 最終的にはバグがすぐ検出されるようになり、バグの修正コストも減る。 • モック使用する方が処理早そうだからロンドン学派の方が優位
7-4.保守のしやすさ テストケースを理解することがどのくらい難しいか、テストを行うことがどのくらい難しいかとい う指標 • 「外部から注入されるインスタンスは全てモック化する」「if文があるならC2の基準でテスト する」等、ルールを決めやすいからロンドン学派が優位(だと思います) • 古典学派のように振る舞いを検証するやり方は質にバラつきが出そうだな…とも
7.良い単体テストとは? 退行に対する保護 迅速なフィードバック リファクタリングへの耐性 保守のしやすさ 古典学派 ロンドン学派