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

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

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

単体テストの利点

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

単体テストの課題

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

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

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

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

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

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

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

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

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

  • ホワイトボックステスト
    テスト対象関数またはメソッドの内部構造に着目し、条件分岐や繰り返しなどの各部分を確実にテストします。関数・メソッド中のすべての命令を実行する命令網羅(ステートメントカバレッジ)、すべての分岐条件で真/偽の両方の分岐を通るようにする判定条件網羅(デシジョンカバレッジ、または分岐網羅、ブランチカバレッジとも呼ばれます)などがあります。そのため、網羅率の測定(カバレッジ解析)や条件を網羅するためのテスト値の抽出などが必要になります。
  • ブラックボックステスト
    テスト対象関数またはメソッドの外から見た機能(入出力)に着目し、コードが期待される機能(仕様)を満たしているかどうかを検証します。仕様に関わる検証であるため、テストケースの作成や結果の確認には、人間による判断が必要になります

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

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

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

これらを総称して xUnitと呼ばれることがあります。 xUnitフレームワークは、テストの実行および結果の検証機能を提供します。テストケースはすべてコードとして作成されるので、もちろん自動実行が可能です。ただし、基本的にはテストケースの生成機能は提供しないため、自力でテストケースを作成する必要があります。また、最近ではGoogleが提供するC++言語向けユニットテストフレームワーク Google C++ Testing Framework(Google Test)も有名です。

有償ツールの有効性

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

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

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

関連項目

単体テストに役立つツールのご紹介

静的解析ツール・単体テストツール C++test

静的解析ツール・単体テストツール C++test

C++testは、静的解析(コーディング規約チェック/フロー解析)、単体テスト、カバレッジ計測、実行時メモリエラー検出機能などを搭載したC言語/C++言語対応のオールインワンテストツールです。

C#/VB.NET対応 静的解析・動的解析ツール dotTEST

C#/VB.NET対応 静的解析・動的解析ツール dotTEST

dotTEST は、C#言語/VB.NET言語対応した静的解析・動的解析テストツールです。Windows アプリケーション・Web アプリケーションなどのさまざまな.NET アプリケーションの開発に用いられています。

Java対応静的解析・単体テストツール Jtest

Java対応静的解析・単体テストツール Jtest

Jtestは、テスト工数の大幅削減とセキュアで高品質なJavaシステムの開発を強力にサポートするJava対応テストツールです。2,000個以上のコーディング規約をもとにソースコードを静的に解析し、プログラムの問題点や処理フローに潜む検出困難なエラーを検出します。

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。