単体テスト(コンポーネントテストまたはユニットテスト)とは何か?

ユニットテストとは

ソフトウェア開発のテストレベルの一つが単体テスト(※)になります。
※JSTQBでは「コンポーネントテスト」と表記され、プロジェクトによっては「ユニットテスト」と呼ばれることもありますが、全て同じテストレベルになりますので、本記事では「単体テスト」に統一します。

単体テストはソフトウェアを構成する小規模なプログラムのまとまり(関数、ユニット、モジュール、クラスなどのコンポーネント)についてテストを行うテストレベルとなります。

単体テストの段階では、お客様が見るような画面でのテストができず、プログラムのコードがテスト対象となるため、開発者の負担が重くなることや費用対効果がわかりにくいこともあり、省略されることが多いテストになります。

本記事では、開発の現場で省略されがちな単体テストの概要、メリット・デメリット、手法、自動化による効率化に関して解説します。

単体テストとは

単体テストとは、ソフトウェアを構成する小規模なプログラムのまとまり(関数、ユニット、モジュール、クラスなどのコンポーネント)について行うテストになります。

文言だけではどのようなテストを行うのかイメージができないと思いますので、ソフトウェア開発モデルの一つ、ウォーターフォールモデルの上流工程と下流工程の関係性を示した「V字モデル」を参考にして解説をします。

※ウォーターフォールモデルの詳細については下記記事をご確認ください。

ソフトウェアテストとは何かソフトウェアテストとは何か?テストの内容や実施するタイミングについて
ソフトウェア開発のV字モデルの単体テストの範囲

上図のV字モデルは、ソフトウェア開発の上流工程(品質を決める工程)と下流工程(品質の確認を行う工程)をV字で折り返すことにより、上流工程と下流工程の対応付けを明確にしたモデルになります。

V字モデルのコンポーネントテストの箇所が単体テストに相当しますので、単体テストは詳細設計をもとにコーディングした内容が正しいかどうかをテストする工程になります。

単体テストは様々なプログラムを組み合わせて行う「統合テスト」の一つ下の工程となりますので、組み合わせる前の個々のプログラムの確認に重点を置いたテスト工程になります。

単体テストのメリットとデメリット

単体テストには下記のようなメリットとデメリットがあります。

単体テストのメリット

  • 工程の早い段階で欠陥を発見して修正することで、品質の向上に貢献し、後の工程での手戻りを防ぐ
  • 欠陥の調査範囲を小さい範囲に留めることができる

開発の工程が進むほど、故障が検出された際の調査や修正の範囲は大きくなり、かかる工数も多くなります。

単体テストは開発工程の中では比較的早い段階でのテストとなりますので、故障が検出された際の修正範囲は比較的小さく済みますので、修正自体も容易なものとなります。

単体テストのメリットは、早期のテスト実施によって後の工程での手戻りを最小限に留めることにあります

単体テストのデメリット

  • 基本的に開発者がテストを実施するため、開発者の負担が増える
  • テスト担当者がテストを実施する際には、開発者に近い知識を持つリソースを割く必要がある
  • テストの実施に必要なスタブやドライバを作成する工数が別途必要になる

単体テストの対象となるプログラムは基本的に単体で動くことができないため、プログラムを動かすためのテスト用のプログラム(スタブやドライバなど)が必要となります。

そのため、単体テストを行う際には、開発者はテスト用のプログラムを作成し、プログラムを実行して正しいか否かを判定する必要があります。

このように、単体テストは基本的に開発者が行うテストとなりますので、開発者の負担が大きくなることがデメリットになります

また、単体テストは実施によってどのようなリスクが軽減できたのか把握しづらく、有効性や費用対効果がステークホルダーに伝わりにくいため、工程自体が省略されてしまう場合もあります。

単体テストの手法

単体テストの手法(テストタイプ)としては下記のようなテストがあります。

機能テスト

機能テストは機能が仕様通りに実装されているか否かを確認するテストになります。

機能の仕様についてはテストベース(詳細設計書、企画書、要求仕様書、ユースケース、ユーザーストーリーなど)を参考にして、テスト対象のプログラムが仕様通りに動くかどうかをテストします。

テスト対象のソフトウェアの特性によっては、テストベースだけではテストを作れず、専門的な知識や技術が必要となる場合があります。

非機能テスト

非機能テストは、性能、使用感、セキュリティ、保守性など、開発するソフトウェアの特性の評価を目的としたテストとなります。
テストの範囲としては、機能テストの範囲外のものは全て非機能テストの範囲となります。

非機能テストは、テストベース(詳細設計書、企画書、要求仕様書、ユースケース、ユーザーストーリーなど)を参考にしながら「システムの動き」について評価するテストを行います。

非機能テストでは使用感やセキュリティなどのテストを行いますが、これらのテストはある程度ソフトウェアが動かせる状態でなければテストの実施が難しいため、単体テストでは実施しないことが多いです

ですが、例えばソフトウェアの仕様で特定の処理速度が求められる場合は、単体テストレベルでの処理速度のテストは実施できますので、一概に「単体テストでは非機能テストを実施しない」という判断はできません

ホワイトボックステスト

ホワイトボックステストは、プログラムの構造に着目し、仕様通りに命令文の処理や分岐処理を行うことを確認するテストになります。

テスト技法としては、テスト対象のすべての命令文の実行を確認するステートメントカバレッジ(命令文網羅率)を計測する方法と、すべての処理の分岐を確認するデシジョンカバレッジ(分岐網羅率)を計測する方法の2種類があります。

どちらもプログラムの処理に着目したテスト技法となり、プログラムが仕様通りの処理を行うことを確認するためのテスト技法になります。

単体テストの自動化

単体テストは特定のプログラムのまとまりをテスト対象とするため、一つ一つのテスト範囲は狭く、試験自体は単純な内容となる場合が多いです。

単純なテストはテスト自動化ツールとの相性が良いため、ソフトウェアのライフサイクルを考慮してなるべく早い段階で自動化ツールの検討を行うことができれば、大きなメリットとなる場合があります。

ですが、自動化ツールの導入にはデメリットもありますので、メリット・デメリットを正しく理解したうえで自動化ツール導入の判断を行う必要があります

テスト自動化ツールの導入におけるメリット・デメリットは下記の通りとなります。

自動化ツール導入のメリット

  • 大量のテストを少ないリソースで実施できる
  • テスト結果のブレが無くなり、再現性が高くなる
  • 手動では実施できないテストが実施できる
  • テスト担当者もテストの設定と実施が可能になる
  • 予め自動化しておくことで、リグレッションテスト(※)の際に大幅に工数を削減できる
    プログラムの変更をした際に、既にテストをした他の箇所にも不具合が出ないことを確認するテスト

自動化ツール導入のデメリット

  • 導入コストがかかる
  • 運用サポートコストがかかる
  • 費用対効果に関して即効性がない
  • メンテナンスなどの管理コストが必要になる
  • メンテナンスや管理を怠ると正確なテストが実施されないことがある
  • ツールを過信して誤ったテストの実施に気づかない場合がある

上記の通り、単体テストにおける自動化ツールの導入はメリットも多いですがデメリットも多くあります。

自動化ツールの導入を検討する際には、メリットだけでなくデメリットも考慮して慎重に検討を行う必要があります。

まとめ

単体テストの概要は下記の通りとなります。

  • 単体テスト
    ソフトウェアを構成する小規模なプログラムのまとまり(関数、ユニット、モジュール、クラスなどのコンポーネント)について行うテスト

単体テストはプログラムを動かして確認を行う最初のテストレベルになりますので、後のテストの手戻りを少なくするためにも重要な工程になります。

また、自動化ツールの導入を含め、テストに関する様々な方針を検討する工程でもありますが、どのような単体テストを行うにしても、テスト担当者よりも開発者の方に負担がかかることを認識しておく必要があります

「開発者が行う作業は全て開発者に任せる」という進め方をするのではなく、開発者が行う作業も正しく理解したうえで、開発全体が効率良く進む方法を考えて品質の向上につなげましょう。