テスト駆動開発
#TDD
テスト駆動開発とは?
以下のサイクルをクラス・関数・ファイル単位で行う開発手法
1. 次の目標を考える
2. その目標を示すテストを書く
3. そのテストを実行して失敗させる (RED)
4. 目的のコードを書く
5. 2で書いたテストを成功させる (Green)
6. テストが通るままでリファクタリングを行う (Refactor)
7. 1~6を繰り返す
https://scrapbox.io/files/634b950bd33db7001de48b7c.png
よくある勘違い
テスト駆動開発は、テスト手法ではない。
なのでテスト駆動開発をしたからといって、必ずしもテストが高品質になり・バグの混入率が下がるわけではない。
テストの品質を上げるためには、テストケースをちゃんと洗い出すなどする必要がある。
じゃあ、テスト駆動ってなんのためにやるん?
主要な目的
TDDは、本コードを綺麗な実装にし、かつ、開発速度を上げるための実装手法。
何度も言うがテスト手法ではない。
参考:テスト駆動開発って何だろう | DevelopersIO
TDDの目指すゴール。いやTDDじゃなくてもエンジニアなら誰もが目指すゴール。 それは「キレイな実装で」で「ちゃんと動く」ソースコードです。
要するに...「綺麗なコードをちゃんと書かせるための手法」。
テストはその手段。
「動作する綺麗なコード」のこの簡潔な言葉が、TDDのゴールだ。動作する綺麗なコードはあらゆる意味で価値がある。
- Kent Beck
Tips
リファクタリングまでしなければ、テスト駆動の意味ない!!
目的は綺麗な保守性の高いコードを書くことだよ
テスト書いて、期待なコード書いて、よし動くね終わり。じゃダメ。
それだとTDDが泣くよ。
テストコードが先にあるから、リファクタリングも積極的にすぐできる!
「あとでリファクタリングしよ」は絶対しない。
なので、すぐリファクタリングしろ。テストを書いて、動く指標を作ってから、すぐリファクタリングしろ。
TDDをマスターすれば、開発スピードもコード品質も上がるよ!
TDDをマスターすれば、絶対にスピードと品質が上がる。
手に馴染ませろ。TDDを。
先に仕様をテストで書き切ってしまう。そして、ALL Greenになるコードを書く。そして綺麗にする。
この一連の流れで一流にまた近づける。
TDDでは、テストコードのバグを先に無くすんだぜ??
「先にGreenにする」あるやん?これなんのためにしてんのて思わない?
本コード側でreturn "1"とかして、テストをGreenにしに行くって言う、まるで茶番のようなことするやん、TDDって。
ただ、これには意味があって、テストコード側にバグがないことを確認してるんだよ。
本コード側は、めちゃくちゃわかりやすいコードを書いてるのに、テストでREDが出るってのは、完全にテストコード側に誤りがあるんだよ。
TDDでは、テストコードのリファクタリングもちゃんと行うんだぜ??
TDDでは、テストコードが仕様のようにわかりやすい構造になってると良いんだぜ?
テスト駆動開発って何だろう | DevelopersIOの記事にt_wadaの講演動画があるんだが、それがめっちゃ参考になるから見てみなonigiri.w2.icon
注意点
何度も言うが、、、TDDをやったからと言って、完全にテストの品質が上がるわけではない。
確かに、TDDやらないよりもカバレッジが増えて、テスト品質が上がる節はある。
けど、TDDで書いたテストケースが本来必要な分の1/2とかだと、システムの品質が高いとは言えないよな。
そう言うわけで、TDDとは別に、システムの品質を上げるためのテスト手法を学ぶといい。
参考
テスト駆動開発で品質は上がるのか。Googleの事例などを参考に考察。 - サックルMAGAZINE
ZOZOMO開発チームのユニットテスト戦略とテスト駆動開発 - ZOZO TECH BLOG
テスト駆動開発:実はそれは設計技術です
テスト駆動開発入門(ケントベック)