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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
picopico
October 09, 2023
Programming
16
5.7k
良いテストとは何か:持続可能で保守性の高いテストを書く
PHPカンファレンス2023の登壇資料です。
https://fortee.jp/phpcon-2023/proposal/10143d00-ca44-4db1-aeb6-b618c423b646
picopico
October 09, 2023
Tweet
Share
More Decks by picopico
See All by picopico
PHP 8.4がリリース! あなたはもうアップデートしましたか?
picopico
0
660
PHPとFluentdで実現するリアルタイムログ分析
picopico
2
440
2023 State of DevOps Report」簡易ピックアップ
picopico
0
130
トーク力は一生役に立つよ
picopico
1
690
伝え方で変わるLTの世界
picopico
3
1.4k
エラー処理関数を完全に理解する
picopico
0
170
一日30回リリースを可能にするpixiv開発
picopico
6
3.2k
Other Decks in Programming
See All in Programming
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
230
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
160
Rethinking API Platform Filters
vinceamstoutz
0
910
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
270
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.1k
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.4k
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
250
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
170
安いハードウェアでVulkan
fadis
1
800
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
ikezoemakoto
0
290
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.5k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
120
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Amusing Abliteration
ianozsvald
0
140
The agentic SEO stack - context over prompts
schlessera
0
720
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
200
Skip the Path - Find Your Career Trail
mkilby
1
89
GraphQLとの向き合い方2022年版
quramy
50
14k
Design in an AI World
tapps
0
180
Transcript
良いテストとは何か: 持続可能で保守性の⾼いテストを書く @picopico_dev
テスト、書いていますか?
「良い」テスト、書いていますか?
4 会社 ピクシブ株式会社 経歴 2023年4⽉ 新卒⼊社 業務 Web API設計/PHP .
移⾏ picopico @picopico_dev
⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅
⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅
前提:テストは書くべき
テストを書く恩恵 • 機能変更‧リファクタリングしやすい • 素早いフィードバックによる⾼速な開発 • 優れたドキュメンテーション • etc…
テストの質が悪いと‧‧‧? • テストを修正しづらい • すぐテストが壊れる • テストの実⾏が終わらない • たまに原因不明で落ちる •
etc…
コードは資産ではなく負債 コードが多いほど、保守‧運⽤コストがかかる =書かれたテストはゼロコストではない
⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅
「良い単体テストを構成する4本の柱」 • リグレッションへのセーフティネット • リファクタリング耐性 • 迅速なフィードバック • 保守のしやすさ 「単体テストの考え⽅/使い⽅」p.96
「単体テストを早期に⾏う利点」 • 瞬間的な満⾜感 • モジュール性‧再利⽤性の向上 • リファクタリング‧セーフネット • ドキュメンテーション 「The
Advantages of Unit Testing Early」- Google Testing Blog (https://testing.googleblog.com/2009/07/by-shyam-seshadri-nowadays-when-i-talk.html)
良いテスト =価値の⾼いテスト シンプルに‧‧‧
価値=機能÷コスト
価値=機能÷コスト
コードが正しいことを保証すること 半分間違い
テストの機能 フィードバックループの構築 ドキュメンテーション +
テストの機能 フィードバックループの構築 ドキュメンテーション +
フィードバックループの構築 コードの変更 テスト リリース
シフトレフト
低い⽋陥コストでバグを修正できる →素早いリリースが可能になる →持続可能で保守性の⾼いプロダクトに
テストの機能 フィードバックループの構築 ドキュメンテーション +
ドキュメンテーション • 信頼度が⾼い • Howをコードで⽰している
信頼度が⾼い システム ⽂書 コメント テスト
価値=機能÷コスト
テストのコスト 実装コスト 保守コスト 運⽤コスト + +
テストのコスト 実装コスト 保守コスト 運⽤コスト + +
実装コスト • フレームワークの導⼊ • テストの作成 • CIへの組み込み • 学習
実装コスト テストコードはプロダクションコードより多い
テストのコスト 実装コスト 保守コスト 運⽤コスト + +
保守コスト • フレームワークのアップデート • コード変更時のテストの修正
テストのコスト 実装コスト 保守コスト 運⽤コスト + +
運⽤コスト • テストの実⾏ • CIサーバーの運⽤
価値=機能÷コスト
フィードバックループの構築 実装コスト ドキュメンテーション 運⽤コスト 保守コスト 価値 = ÷
⽬次 1. なぜ良いテストが必要なのか 2. 良いテストの指標 3. 良いテストの書き⽅
良いテストを書くには • 正確なフィードバック • ⾼速なフィードバック • 理解しやすいテスト • テストする価値の⾼いシステムをテストする
良いテストを書くには • 正確なフィードバック • ⾼速なフィードバック • 理解しやすいテスト • テストする価値の⾼いシステムをテストする
正確なフィードバック • 機能が正しく実装されているとき →テストが通る • 機能が正しく実装されていないとき →テストが落ちる
正確なフィードバック 機能が正しくない 機能が正しい テストが通らない 真陰性 偽陽性 テストが通る 偽陰性 真陽性
正確なフィードバック コードの変更 テスト リリース 偽陽性
ホワイトボックステスト • ソフトウェアが内部的に⾏っていることを検証する • Howに依存するため、リファクタリング耐性が低い
ブラックボックステスト • ソフトウェアの振る舞いのみを検証する • Whatに依存するため、リファクタリング耐性が⾼い
正確なフィードバック コードの変更 テスト リリース 偽陰性
偽陰性を減らす • ロジックが正しく動くか • コンポーネントが結合された状態で動くか
テストピラミッド E2E Integration Unit
良いテストを書くには • 正確なフィードバック • ⾼速なフィードバック • 理解しやすいテスト • テストする価値の⾼いシステムをテストする
⾼速なフィードバック コードの変更 テスト リリース できるだけ速く
テストピラミッド E2E Integration Unit
テストサイズ 機能 Small Medium Large ネットワークアクセス No localhost only Yes
データベース No Yes Yes ファイルシステムアクセス No Yes Yes 外部システムの利用 No Discouraged Yes マルチスレッド No Yes Yes スリープ文 No Yes Yes システムプロパティ No Yes Yes 時間制限 (秒) 60 300 900+ 「Test Sizes」- Google Testing Blog (https://testing.googleblog.com/2010/12/test-sizes.html)
良いテストを書くには • 正確なフィードバック • ⾼速なフィードバック • 理解しやすいテスト • テストする価値の⾼いシステムをテストする
理解しやすいテスト • AAAパターン ◦ Arrange - 準備 ◦ Act -
実⾏ ◦ Assert - 確認 • テストケースと振る舞いを対応させる • ⼀度に⼀つの振る舞いを検証する
良いテストを書くには • 正確なフィードバック • ⾼速なフィードバック • 理解しやすいテスト • テストする価値の⾼いシステムをテストする
テストする価値の⾼いシステム • コアドメインに近い • ロジックが複雑である
テストする価値の低いシステム • 単発のスクリプト • 書き直した⽅が早い • ロジックをほぼ持たない
テスタビリティについて
フィードバックループの構築 実装コスト ドキュメンテーション 運⽤コスト 保守コスト 価値 = ÷
実装コスト =テスト対象システムで決まる
Class A Class C Class B Class D
DIとテストダブル • 依存をコンストラクタで注⼊する • テスト時には依存クラスをテストダブルに置き換える
おわり