テスト駆動(TDD)-概要-

■概要

テスト駆動開発(Test Driven Development)とは
テストを開発の手段指定利用した開発手法のことです。

●TDDの特徴
	TDDでは開発実装コードよりも先にテストコードを先に作成します。
	この方法はテストファーストと呼ばれています。
	実装コードよりもそのコードが書かれた関数やクラスが
	どのように使用されるのかを重点的に考えることで
	「テストコードを成功させることを第一に考えたシンプルな設計」になります。

●開発手順の違い
	・従来の開発手順
		1.仕様に基づいた動作をするコードを書く

		2.テストコードを作成し、1で作成したコードが
		  正しく動作しているか確認する

	・TDDの開発手順
		1.テストコードを先に作成する

		2.テストコードが正しく動作するためのコードを作成する
	
●TDDの進め方
	TDDは仕様の機能を小さい単位に分けて、テスト=>実行を繰り返し、
	開発を進めていきます。

	1.ToDoリストの作成
		実装する必要のある機能の内容を細かく洗い出します。
		(TDD実施中に追加作業が発生したらToDoリストに追加する)

	2.ToDoリストから1つ選択する
		ToDoリストの中で最も簡単に実装できそうな内容を選ぶ

	3.テストコードを作成する
		2で選択した機能が実装できたことを確認できるテストコードを作成する

	4.失敗する実装コードを作成する
		3のテストコードでテストした場合に100%失敗する実装コードを作成する
		もし、失敗しない場合はテストコード、実装コードを見直す
		※テストが失敗する状態のことをRed状態またはRedと呼ぶ

	5.テストが成功する実装コードを書く
		テストを通すための最低限の実装コードを書いてテストを実行し、
		問題なく動作することを確認する
		もし、成功しない場合はテストコード、実装コードを見直す
		※テストが成功する状態のことをGreen状態またはGreenと呼ぶ

	6.リファクタリングする
		実装コードを整理整頓する
		この時の変更で正常に動作していた機能にバグが発生していないか
		テストをして確認する
		※実装コードをきれいなコードに変更する状態をRefactoring状態、
		 またはRefactoringと呼ぶ

	7.ToDoリスト選択の2に戻る
		実装が完了したToDoをリストから削除し、次のToDoを選択する
		ToDoリストが0になれば作業完了とする

■TDDの本質

●TDDは設計手法
	TDDはテストコードを書くことで実装コードの挙動を
	明らかにしていく設計手法です。

	①.テストコードを最初に書く
			↓
	②.外部からどのように使用されるのかを考える必要が出る
		どのようなクラスか?
		関数名は何にするか?
		引数は必要か?
		戻り値はあるか?
		関数の結果はどのようなものがあるか?
		etc
			↓
	③.外部からどのように使用されるかが判明する
			↓
	④.実装コードを書き、テストする

●TDDの目標
	TDDの目標は「動作する」「きれいな」コードを作成することです。
	そのためにTDDは「動作する」と「きれいな」コードの作成を分けています。
	まず、仕様を満たすコードを作成し(レッドからグリーン状態)、
	それからコードをきれい(グリーンからリファクタリング状態)にします。
	こうすることで、仕様を満たしつつも、将来的に仕様変更がやりやすい
	コードの作成を行うことができます。

●進化的設計と計画的設計
	プログラムの設計は計画的設計と進化的設計によって設計されています。
	進化的設計は近年注目を集めているアジャイルやXPによる開発、
	計画的設計はウォーターフォールによる開発で使用されいます。

	・進化的設計:
		TDDはXPのプラクティスの一つです。
		XPは進化的設計という考え方が根底にあり、
		進化的設計とは今から作成するToDoの内容についてのみ
		設計を行い、それを繰り返して行くことでシンプルな設計を
		目指す設計方法です。

	・計画的設計
		計画的設計とは開発当初に計画的設計は進化的設計とは対極の設計方法で、
		概要レベルの設計を行った上で、それを詳細設計に落とし込み、
		コーディングできるレベルまで設計する設計方法です。
		ウォーターフォール開発はこの設計方法が使用されています。

■信頼性を積み重ねる

TDDはある程度のクオリティの動作保障と継続的テストにより、
一つ一つのToDoのプログラムに対する信頼性を向上させます。

・信頼性の積み重ねの流れ
	①.ToDoの洗い出し
		まずはTDDではToDoの洗い出しを行います。
		そしてそれらを複数同時に対処せず、
		一つずつ確実に消化していきます。
		一つのToDoに対するテストを作成し、
		レッド=>グリーン=>リファクタリングの
		ステップを踏んでToDoへの対応が終了したことを
		確認して次へ進みます。

	②.テストを行う
		作成されたToDoはテストファーストによるテストコードと
		実装コードが常にセットになっています。
		このテストが正常に通ることで最低限の動作が保障はされます。

	③.テストの継続
		テストが完了したToDoはその後もテストを続行して
		エラーが発生しないかを確認していきます。

■TDDの注意点

●TDDはあくまで開発手法
	TDDは品質保証のためのテストとは異なります。
	あくまで開発を進めるためのテストです。
	TDDでテストを行ったからといって従来の品質保証テストである
	単体テストや統合テストを行わなくてもいいわけではありません。

●万能な方法はない
	TDDだけではなく、XPやアジャイルによる開発を行えば
	開発の問題が全て解決するわけではありません。
	あくまでも、選択肢の一つであり、使う側が使っている手法の
	内容を理解している必要があります。