単体テスト(ユニットテスト)とは

単体テスト(ユニットテストと呼ばれることもあります)は、プログラムを構成する比較的小さな単位(ユニット)が個々の機能を正しく果たしているかどうかを検証するテストです。

通常、関数やメソッドが単体テストの単位(ユニット)となります。 プログラムが全体として正しく動作しているかを検証する結合テストは、開発の比較的後の段階でQAチームなどによって行なわれることが多いのとは対照的に、単体テストは、コード作成時などの早い段階で開発者によって実施されることが多いのが特徴です。

単体テストの利点

  • モジュールが結合される前の段階でテストが実施されるため、問題の原因の特定や修正が容易。開発全体のバグ修正コストを下げる効果が高い。
  • コードの内容をよく理解している開発者によって、コード作成と同時か直後に(または、『テスト駆動型開発』Test Driven Development:TDD と呼ばれる開発手法ではコードの作成よりも前に)テストケースが作成されるため、妥当性の高いテストケースを資産として残すことができ、後の拡張開発や改修時にも再利用できる。

単体テストの課題

  • 開発者にかかるテストの負担が大きくなりやすい。
  • テスト実施にある程度のスキルが必要なため、導入が難しい場合がある。
  • スケジュールの関係で単体テストに時間を割くことができない場合など、テストが省略されたり不完全になりやすい

単体テスト(ユニットテスト)の仕組み

プログラム全体ではなく、プログラムを構成するモジュールを個別にテストするために、テスト対象のコードのほかに、ドライバーやスタブといった付加的なコードが必要になる場合があります。

単体テスト(ユニットテスト)の仕組み

ドライバー
  • テスト対象のコードを呼び出すコードを代替します。

スタブ
  • テスト対象のコードが呼び出しているコードを代替するもので、呼び出し先のコードがまだ作成されていない場合などに使用します。

単体テストでは、これらの仕組みによって、テスト対象の関数・メソッドをプログラムの他の部分や外部のコードから隔離して徹底的に検証できるという利点があります。反面、これらの付加的なコードを作成したり管理するための負荷は、プロジェクトの規模が大きくなるほど、また改修を重ねて期間を経るほど増大します。

単体テスト(ユニットテスト)の種類

テストケースを作成する際、何に着目するかという観点から見ると、単体テストは大きくホワイトボックステストとブラックボックステストに分類できます。ホワイトボックステストは、テスト対象関数またはメソッドの内部構造に着目し、いっぽう、ブラックボックステストは、テスト対象関数またはメソッドの外から見た機能(入出力)に着目します。

  • ブラックボックステスト
    テスト対象関数またはメソッドの外から見た機能(入出力)に着目し、コードが期待される機能(仕様)を満たしているかどうかを検証します。仕様に関わる検証であるため、テストケースの作成や結果の確認には、人間による判断が必要になります

単体テスト(ユニットテスト)の自動化

単体テストは自動化することでより高い効果を期待できます。自動化することで、多数のテストケースを漏れなく確実に実行できます。また、毎晩すべてのテストケースをバッチで実行すると、前の日の変更によって既存のコードの動作にエラーが起きていないか、デグレードの有無を確認できます(回帰テスト、レグレッションテスト)。単体テストの自動実行を可能にするテストフレームワークと呼ばれるものがあります。よく知られているのは、Java言語用のJUnitですが、他のさまざまな言語用にもフレームワークが存在します。

  • Java言語 …… JUnit
  • C/C++言語 …… CppUnit
  • .NET言語 …… NUnit

これらを総称して xUnitと呼ばれることがあります。 xUnitフレームワークは、テストの実行および結果の検証機能を提供します。テストケースはすべてコードとして作成されるので、もちろん自動実行が可能です。ただし、基本的にはテストケースの生成機能は提供しないため、自力でテストケースを作成する必要があります。

有償ツールの有効性

 単体テスト実施において有償ツールを活用する方法もあります。ここでは、C/C++言語対応テストツール「C++test」を例に説明しますがフリーツールと大きく違うのは次の点です。

  • テストコード、スタブコードの実装フェーズの時間短縮
    • C++testではテストケースの入力値/期待値やスタブの振る舞いなどを独自のGUI上で設定することができます。 
      従来、多くの工数が必要となっていたコーディングを行うこと無く、テストケースとスタブの作成・メンテナンスを容易に実現します。
  • クロスコンパイラへの対応
    • C++testは標準で様々なコンパイラに対応しています。ホスト上での実行以外にもシミュレーターや実機上での単体テストをサポートしています。
  • 機能安全規格対応
    • C++testは第三者認証機関であるTÜV SÜD社よりISO 26262 (自動車機能安全の国際規格)に準拠したテストツールとして認証を取得しています。ユーザーによるツール認証を行なう必要がありません。
有償ツールには導入コストが必要となる一方で、作業負荷の軽減や対応環境、サポート体制の充実といったメリットがあります。

まずは無償体験版でお試しください。
  • C++testのすべての機能を無償で14日間ご利用可能
  • すぐにご評価可能なチュートリアル付属
  • ご評価を円滑に進めるための技術的なサポート対応

お問い合わせ

  • テクマトリックス株式会社
    東京本社

    システムエンジニアリング事業部
    ソフトウェアエンジニアリング営業部

    03-4405-7853

メールでのお問い合わせ
se-info@techmatrix.co.jp