テストファーストプログラムを実装する前に、先にテストプログラムを作ること。JUnitの単体テストプログラムの作成方法を指す。古くからのプログラムのテスト方法は、まずプログラムを作り、そしてそれをテストするというものだった。逆にテストファーストでは、publicメソッドの呼び出し部分(メソッド名、引数、戻り値)のみを作り、そのメソッドをテストするテストプログラムをJUnitを使用して先に作成する。そのあとにメソッドを実装するため「テストファースト(テストが先)」と呼ばれる。実際の作成方法としては、まずクラスとpublicメソッドの呼び出し部分のみを作り、実装は何も作らない。コンパイルエラーになっては意味がないため、適当な戻り値を返すようにする。この時、実装はしてはいけない。次に、publicメソッドをテストするテストメソッドを作成する。通常1クラスにつき1テストクラスをTestCaseクラスのサブクラスとして作り、publicメソッド1つにつきテストメソッド1つを作成する。テストメソッドに、テスト対象のpublicメソッドのテストプログラムを実装する。通常は数とおりのテストを行うようにする。値のチェックはassertEquals()メソッド等で行う。この段階でテストを実行する。最後に、このテストが失敗しないよう、publicメソッドを実装する。すれば、晴れてテストは成功し、プログラムは完成することになる。テストファーストの利点は、「契約による設計」によって「明確な仕様を決める」という点にある。メソッドには、仕様という名の「契約」が存在する。引数に渡せる値の範囲、それによって返される戻り値の種類、等が決められる。仕様書という形で明示されていない場合、その仕様は曖昧になりがちである。その曖昧さを取り除くのがテストファーストである。プログラムの実装前に、まずメソッドの仕様を決める事で、曖昧になりがちなメソッドの実装を確かなものとする。これは「契約による設計」という手法に基づいた方法であり、より安全なプログラムを作ることができる。テストはことある毎に実行することで、常に「これまでに実装したメソッドが、今も正しく実装されている」ことを確認することができる。他のメソッドを変えたためにバグが産まれる「デグレード」を常にチェックすることができるため、新たな機能の追加や、「リファクタリング」といったプログラムの修正がしやすくなる。これも、テストファーストにより「先に必ずテストプログラムを作っている」からできることである。後からテストプログラムを作っていくと必ずテスト漏れができるが、テストファーストを守ればそれはなくなる。よって、常にプログラムの整合性が検証されることになり、品質が高まる。問題も少なからずある。テストプログラムそのものの工数が馬鹿にできない。総合的に見れば、テストファーストの方が品質を保てるため工数はテストファーストの方が少なくて済むが、そもそもの工数に「バグが出た場合の修正工数」など含まれておらず、テストプログラムの分だけ明かに工数が増えることは確かなため、上司や客先を説得する材料に乏しい。次に、仕様変更に弱い。仕様変更が行われた場合、それに伴いテストプログラムを修正しなければならない。仕様が完全に決まっていない案件の場合、テストファーストで始めていても、プロジェクト終盤では形骸化する可能性が高い。テストプログラムそのものにバグが含まれる可能性もある。テストプログラムは分量が多く、手を抜きやすく、さらにコピペが多いため、単純な記載ミスが頻発しやすい。テストプログラムが誤っているとどうしようもなくなる。システム上テストが難しい場合もある。データベースやファイルへの書き込みが伴う場合、それらのテスト環境がなければテストはできない。テスト環境があったとしても、その環境が本番環境と異なれば完全なテストとは言えなくなる。テストファーストは最近生まれた概念のため、浸透に時間が掛かる。テストファーストは「プログラムの作成をミスする可能性がある」という「性悪説」に基づいて作られており、無意味にプライドの高いプログラマーから敬遠される傾向にある。テストファーストを行うためにはクラスやメソッド間の関係が疎である必要があるため、旧来のプログラムの作り方には合わず、プロジェクト全体でテストファーストを実行できない場合も多い。テストファーストは、ある意味理想論のシステムであるとも言える。実現できれば、そのプロジェクトは絶対に失敗しないだろう。テスト対象のメソッド。1~4までを追っていってください。※当然、本当のメソッド名はplus()とtestPlus()です。数字は便宜的に付けているものですから。→Sample#plus1()メソッドの説明につづく。→Sample#plus()メソッドの説明のつづき。引数や、返される戻り値を決めます。ならないよう適当な値を返しておきます。→SampleTest#testPlus2()の説明に続く。→SampleTest#testPlus2()メソッドの説明のつづき。メソッドを実装します。いうわけで、ちゃんと完成させました。→SampleTest#testPlus4()の説明に続く。Sampleクラスのテストクラスです。クラス名をセットします。→Sample#plus1()メソッドの説明の続き。Sample#plus1()メソッドをテストします。未完成のメソッドplus()を呼び出します。未完成なので、当然誤った値が返ってきます。assertEquals()メソッドで結果をチェックします。第2引数にテスト対象の変数を渡します。これは、このメソッドの「仕様」になります。返される」ということを明記しているわけです。これは「契約による設計」に基づいた手法です。