ソフトウェアテスト基本テクニック

第5回 単体テスト

この記事を読むのに必要な時間:およそ 2.5 分

今回は,テスト工程の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.2Pleiades All in Oneを利用)
JUnit3.8.1(Eclipseに同梱)

著者プロフィール

加藤智巳(かとうさとみ)

株式会社NTTデータ ソフトウェア工学推進センタ所属。

Webアプリケーション開発のテストプロセス改善を行うチームにて,日夜自社システムの品質向上を目指して努力している。


町田欣史(まちだ よしのぶ)

1999年,株式会社NTTデータに入社。社内の情報共有システムの開発に4年間携わった後,テストプロセス改善の研究,社内サポートを担当。現在は,プログラムの品質向上に向けた研究および社内サービス運用を行っている。JSTQB技術委員,日本品質管理学会正会員。

著書

コメント

  • Re:

    リスト2に

    boolean[] result = sample.doSample01(“abz”);

    と書かれていますがabzが全角のダブルコーテーションで括られています。直接関係の無い指摘ですみません。

    Commented : #1  あsdf (2010/08/25, 13:47)

コメントの記入