TL;DR
ソースコードの個々のユニット(テストできる最小の部品)が正しく動くかを、ほかの部分から切り離して確かめるテスト。
なぜ必要か
Wikipedia によると、単体テストの目的は、プログラムの各部分を分離し、個々の部品が正しく動くことを示すことである。開発の早い段階でバグを見つけられ、リファクタリングや回帰テストを安全に行える。部品ごとに確かめておくと、後の統合テストも楽になる。テストコードは、ユニットの使い方や期待される動作を示す文書の役割も果たす。テスト駆動開発では、コードより先にテストを書き、テストがクラスやメソッドの仕様を決める設計の役割も担う。
仕組み
Wikipedia によると、何をユニットとするかはプログラミングのやり方で変わる。手続き型のプログラミングでは個々の関数や手続きが基本で、モジュール全体をユニットとすることもある。オブジェクト指向プログラミングでは、クラスなどのインタフェース全体や、個々のメソッドが対象になる。
注意点
Wikipedia によると、単体テストはすべての実行経路を確かめられないので、特定のエラーがあるかを示すだけで、エラーがないことの証明にはならない。統合したときのエラーや性能などの非機能的な問題も見つけられない。現実的な初期条件は作りにくく、非決定的な処理やマルチスレッドの処理は扱いが難しい。失敗したテストを放置すると、テストスイートが実態からずれて信頼できなくなる。また、単体テストはテストの粒度による分類で、自動化されているとは限らない。