ユニットテストに関する世界観です。
プログラミングやシステム開発を行う上で、実際のコードを書くよりも大切な工程があります。
それはテストです。
システム開発を行う上で、実際にコードを書く時間は、全体からすると少ないです。より多くの時間をテストに割きます。
テストとは、そのシステムがきちんと動くかどうか、きちんとすべて確認するということです。
通常、テストは人間の力で行います。プログラムを書いた後で、システムがきちんと動くかどうか、あらゆる状況で人間が確認します。
ですが、ユニットテストを書くことで、これを少しばかり楽にできます。人間が状況ごとに手作業でテストを行わなくても、ユニットテストを書くことで半自動的にテストを行うことができます。
JavaやC/C++でプログラムを書いて、コンパイルエラーが出ることなく、プログラムを実行して不正終了もなかったからといって、そのプログラムにバグや誤動作が無いとは限りません。
プログラムを実行して、その実行した結果が正常だったからといって、別の条件で実行した時は、果たしてプログラムは期待通り動くでしょうか?
バグを修正する手助けとなる、ブレークポイントやステップ実行のできる「デバッガ」は、あくまで、バグを見つけてそのバグを直すものであり、「プログラムの実行の結果にバグがあるかどうか」までは判断してくれません。
このような時に、ひとつでも多く不正終了や誤動作を検出するために、「テスト」が重要になります。ユニットテストをするとプログラムの品質が上がります。
JUnitとEclipseを使って学ぶ、“テスト”の常識 (1/4) - @ITを参考に執筆しました。
要求分析(システムにおける要求の定義)→外部設計(システムを利用する顧客から見た外部的なシステム設計の定義)→内部設計(内部のプログラムとしてのシステム設計の定義)と下へ下がっていくように設計したソフトウェアシステムは、逆に単体テスト(内部設計に相当するテスト)→結合テスト(外部設計に相当するテスト)→総合テスト(要求分析に相当するテスト)と上に上がっていく。
システム開発の後々になってバグの存在に気付くよりも、できるだけ早期に少ないコストでバグを発見・修正することができるように考える必要がある。
Javaで開発された、ユニットテストの自動化を行うためのフレームワーク。
Javaを参照のこと。
C/C++向けには、Unity, CppUTest, Google Testなどがある。
C++を参照のこと。
PHPUnitはPHPのユニットテストフレームワーク。
PHPを参照のこと。
Python標準のunittestについては以下を参照のこと。
Pythonを参照のこと。
RubyならMinitestが使える。Railsでも標準で使うのはMinitest。
これに対して、gemでリリースされているTest::Unitというフレームワークもある。
Rubyを参照のこと。
Wikipediaに一覧がある。
ウォーターフォールも参照のこと。
Dockerも参照のこと。