今回は,テスト工程の1つである単体テストにフォーカスを当てます。前回,前々回ではテストケースを作成する技法を見てきましたが,そこで作ったテストケースをどのように実行するかという観点で,単体テストの基本的な進め方と,ツールを用いた単体テストの実行方法について解説していきます。
単体テストとは
単体テストとは,ソフトウェアを構成する最小単位である関数やメソッドに対して品質を確認する作業です。ソースコードレベルでのテストと考えるとわかりやすいでしょう。
一般的なテストにおいては,先入観なくテストするためには,テスト対象を作った人以外がテストをすることが望ましいのですが,単体テストに関しては,作業効率を考慮して,ソースコードを作ったプログラマ自身が実施するのが一般的です。
また,単体テストはツールを用いることで効率よく実施できます。よく使われるツールには,xUnitと呼ばれる単体テスト用のテスティングフレームワークがあります。これは,さまざまなプログラミング言語に対して提供されており,これにより容易にテストの実行や結果の確認ができます。
単体テストの進め方
通常のテストは,テスト対象が出来上がった後に実行するものですから,単体テストではテスト対象のソースコードを作成した後に実行することになります。先ほどのxUnitを使った場合,ソースコードとは別にテスト用のソースコード(以下,テストコード)を作成する必要があるため,手順は以下のようになります。
![]()
しかし,単体テストの場合は,ソースコードの作成よりも先にテストを実行する「テストファースト」と呼ばれる方法で進めることもできます。先にテストを実行するといってもピンとこないかもしれませんが,ソースコードが未完成の状態でテストをわざと失敗し,テストが成功するようにソースコードを完成させていくという手法です。この場合の手順は以下のようになります。
![]()
この手法では,テストコードを先に作ることで正しい仕様を確認し,さらに無駄のないソースコードを実装できるというメリットがあります。ただし,テスト対象もできていないのにテストコードを先に書くというのは慣れないとなかなかうまくいきませんので,初めて単体テストをする人が,いきなりテストファーストでやってみるというのはあまりお勧めしません。
実際には,「ソースコード作成」「テストコード作成」「テスト実行」の3つの作業を細かいサイクルで回して,テストが通るようなソースコードを完成させていくことで,効率よく品質の高いソースコードを実装することができるでしょう(※1)。
それでは,次からは,Javaのテスティングフレームワークである「JUnit」を使った単体テストの実行方法について見ていきましょう。
- ※1)
- 詳細は「エンジニアマインド」Vol.9特集の第3章参照
JUnitとは
JUnitはJava用のテスティングフレームワークで,オープンソースで提供されており,Eclipseなどの統合開発環境にもデフォルトで同梱されています。
JUnitの機能
先ほども説明した通り,テスティングフレームワークを使う場合は,テストコードを作成する必要があります。JUnitが提供する機能には以下のものがあります。
- テストコードを記述するためのライブラリ
- テストコードの実行
- テスト結果の表示
JUnitのメリット・デメリット
これらのJUnitの機能の恩恵として,さまざまなメリットが得られます。代表的なものを挙げてみましょう。
- 統一された方法で効率よくテストを実行することができる
- 一度テストコードを作成すれば,簡単に回帰テストを実施することができる
- テストコードは,どのようなテストが実施されたかの証拠(エビデンス)となる
その一方で,テストコードを作成するための工数がかかることがデメリットとなります。ただし,先ほど挙げた通り,回帰テストの工数を削減できるメリットがありますので,単体テストだけでなく後工程でもうまく使いこなせば,全体としては工数削減につながるでしょう。
JUnitを使った単体テスト手順
では,第3回と同じサンプルコードに対して,実際にJUnitを利用してテストを実施してみましょう(リスト1)。
リスト1 本稿で利用するサンプルコード(テスト対象)
public class Sample {
public boolean[] doSample01(String param) {
boolean[] result = new boolean[] { false, false };
// 条件①
if (param == null || param.length() < 2) {
throw new IllegalArgumentException("param is illegal");
}
// 条件②
if (param.charAt(0) == 'a') {
result[0] = true;
}
// 条件③
if (param.charAt(1) == 'b' && param.charAt(param.length() - 1) == 'z') {
result[1] = true;
}
return result;
}
}
なお,今回は以下の実行環境を前提とします。Eclipseのインストール方法はページ数の都合により省略しますので,関連する書籍やWebサイト等を参考にしてください。
- 実行環境:
- Eclipse3.3.2(Pleiades All in Oneを利用)
JUnit3.8.1(Eclipseに同梱)

