BlogBlog

  • Home
  • Blog
  • 単体テスト(ユニットテスト)とは | 目的や結合テストとの違い、メリット・デメリットまで詳しく解説

単体テスト(ユニットテスト)とは | 目的や結合テストとの違い、メリット・デメリットまで詳しく解説 ソフトウェアテスト・品質保証

更新日:2024/10/11 SAブログ編集部

単体テスト(ユニットテスト)とは | 目的や結合テストとの違い、メリット・デメリットまで詳しく解説

ソフトウェアの品質を担保するためには、適切にソフトウェアテストを実施することが必要不可欠です。
ソフトウェアテストには「テストレベル」というさまざまなテスト活動を系統的に分類したグループが存在していますが、そのテストレベルの考え方を活用することでより適切なソフトウェアテストが可能となります。

テストレベルにはさまざまなレベルがあり、こちらの記事で紹介する単体テスト(ユニットテスト、コンポーネントテスト、モジュールテストなどとも呼ばれる)のほかに結合テスト(統合テスト)やシステムテスト(総合テスト)、受入テストといったテストレベルがあります。
本記事では、テストレベルのなかで最も下位に位置する単体テストについて取り上げ、ISTQBのシラバスや、これまでに数多くのソフトウェアテストプロジェクトに関わってきた自身の経験をもとに、単体テストについての概要から目的、結合テストとの違い、メリット・デメリットまで詳しく解説します。

参考:Certified Tester Foundation Level Syllabus v4.0
参考:テスト技術者資格制度 Foundation Level シラバス Version 2018V3.1.J03

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

単体テストとは、ソフトウェアを構成する最小単位であるコンポーネント(ユニットやモジュールとも呼ばれる)が、仕様どおりに動作することを検証するテストです。
単体テストは、ユニットテストのほかにもコンポーネントテストやモジュールテストなどとも呼ばれることがありますが、こちらの記事では呼び方を「単体テスト」に統一して進めていきます。

単体テストによってコンポーネント内の不具合を検出し、機能的・非機能的な品質を高めることができます。
コンポーネント単位での不具合が見逃されてしまった場合、後の工程でより大きな問題が発生するリスクが高まることから、一般的にはテスト工程の最初に実施されます。
V字モデルにおいては、単体テストは結合テスト(統合テスト)の前に位置し、詳細設計に基づいて実装されたコンポーネントを対象にテストを行います。

参照:V字モデルとは|ウォーターフォール型開発における品質面でのメリット

単体テストの目的

ISTQBのシラバスによれば、単体テストの目的は以下のように説明されています。
※ISTQBのシラバスにおける「欠陥」と本文中の「不具合」は同義となります

  • リスクの軽減
  • コンポーネントの機能的/非機能的振る舞いが設計および仕様通りであることの検証
  • コンポーネント品質に対する信頼の積み上げ
  • コンポーネントに存在する欠陥の検出
  • 欠陥がより高いテストレベルまで見逃されることの防止

単体テストの重要な目的は、ソフトウェアの最小単位であるコンポーネントの品質を高め、リスクを軽減することと言えます。
仮にコンポーネントに不具合が存在していてそれが見逃されてしまった場合、以降の工程におけるより大きな不具合や故障につながり、大幅な開発の手戻りなどプロジェクトに重大な影響を及ぼすリスクがあります。
品質に問題がある部品を組み合わせて作られたソフトウェアは、品質により大きな問題が発生する可能性を抱えることになるためです。

コンポーネントは最小単位であるからこそ機能的・非機能的に仕様通りとなっていることを細かく確認することが重要です。
可能な限り早いタイミングで不具合を検出・修正していくことができれば、コンポーネントの品質、ひいてはソフトウェアの品質を着実に積み上げていくことができます。

単体テストと結合テストとの違い

単体テストと結合テストの違いとしては、そのテストの目的やテスト対象、テストレベルの違いが挙げられます。
結合テストは単体テストの一つ上位のテストレベルに該当し、V字モデルにおいては結合テストは単体テストの次に行われます。
※以下、V字モデルを再掲

参照:V字モデルとは|ウォーターフォール型開発における品質面でのメリット

また、単体テストではソフトウェアの最小単位となるコンポーネントを対象に動作を検証しますが、結合テストではコンポーネント同士を組み合わせたときに仕様どおりに動作することを検証するという違いがあります。

単体テストの種類

単体テストで用いられるテスト技法を大別すると、ホワイトボックステストとブラックボックステストの2種類に大別できます。

ホワイトボックステストでは内部構造に着目し、テスト対象のプログラムが正しく動作しているかを確認します。
ホワイトボックステストにはステートメントテストやデシジョンテストと呼ばれるテスト技法があり、コードを開発した開発担当者が実施することが一般的です。

ブラックボックステストではその逆に、テスト対象をブラックボックスとして内部構造は参照せず、要件や仕様などをもとに入力と出力に着目をして対象の振る舞いが仕様通りかどうかを確認します。
ブラックボックステストには、同値分割法や境界値分析、デシジョンテーブルテスト、状態遷移テスト、ユースケーステストといったテスト技法が含まれます。

ホワイトボックステストとブラックボックステストを含む各テスト技法については、以下の記事で詳しくご紹介しています。
ソフトウェアテスト技法とは | 主な技法の種類や特徴について解説

続いては、単体テストについてのイメージや理解を深めるために、具体的な単体テストにおけるテストケースの例を見てみましょう。

単体テストのテストケース例

単体テストの例として、あるソフトウェアのログイン画面を対象とした、単体テストのブラックボックステストのテストケースを紹介します。
なお、どのようなテストを単体テストとして実施するかは現場や組織などによっても異なり、このようなテストは単体テストではなく結合テストとして実施するというケースもあります。
そのため、こちらのテストケースはあくまでも一例とお考え下さい。

テスト対象

  • ログイン画面のログインエリアにおける、ログイン認証機能およびパスワード再設定機能

テストケース例

  • パスワード入力エリアにパスワードを入力した際、パスワードが仕様通りに●で表示されること
  • 登録済みのIDとパスワードを入力してログインボタンを押下したときに、仕様通りにログインできること
  • 未登録のIDとパスワードを入力してログインボタンを押下したときに、仕様通りにエラーメッセージが表示されること
  • 「パスワードを忘れた方はこちら」ボタンを押下したときに、仕様通りに「パスワード再設定画面」に遷移すること

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

最後に、単体テストのメリットとデメリットについて、それぞれ詳しく紹介します。

単体テストのメリット

1.早期に不具合を検出することができ、手戻りなどのリスク防止につながる

テスト工程の最初となる単体テストで不具合を検出して修正することができれば、結合テスト以降で不具合を検出した場合に比べて原因の特定や修正を簡単に行うことができ、手戻りなどの影響も小さく済みます。

また、単体テストのテスト設計を通じて、設計のインプットとなる仕様自体のロジックの矛盾や抜け漏れ(いわゆる仕様バグや要件バグ)などをテストを実行する前の設計時点で検出することも可能です。
誤った仕様に基づいて不具合が実装されてしまう前に対処をすることができれば、そのまま不具合が実装されてしまう場合に比べてコスト面や時間面などで非常に大きなメリットがあります。

2.コンポーネントの品質を担保することで、以降のテストをよりスムーズに進めることができる

単体テストを適切に行うことで、ソフトウェアの最小単位であるコンポーネントの品質に対する信頼を高めることができます。
コンポーネントはソフトウェアを構成する部品にも例えられ、まずは部品の品質を十分に担保することが、それらを組み合わせて作られるソフトウェアの品質を担保し、以降のテストをスムーズに進めるために重要となります。

一方で、もし単体テストが十分に行われないまま結合テスト以降のテストレベルに進んでしまった場合、信頼のできないコンポーネントが組み合わさったソフトウェアをテストすることになり、より影響の大きな不具合が発生する可能性が高まります。
また、さまざまなレベル、粒度の不具合が検出されることになり、原因の特定や修正にもより多くの時間がかかってしまうことから、以降のテスト工程に支障をきたすリスクも伴います。

3.テストの成果物が仕様の理解や共有にも役立つ

単体テストの設計や実行のなかで作成されるテスト仕様書やテストケース、その実行結果といった成果物は、テスト対象の仕様に対するより深い理解につながります。
また、それらの成果物はドキュメントの形で残ることから、関係者間での共有にも有効です。

4.テスト自動化との相性が良く、自動化による品質の積み上げが期待できる

特にアジャイル開発などのイテレーティブな開発モデルでは、コードの変更や追加などが頻繁に発生するため、デグレを防止するリグレッションテストを高頻度で繰り返せるようにすることが品質を担保するうえで重要となります。
しかし、毎回手動でリグレッションテストを実施することは工数などの面から現実的ではありません。

単体テストのテストケースは、多くの場合複雑なパターンなどは使用せず、テストケースがシンプルになりやすく自動化しやすいという特徴があります。
単体テストを自動化することができれば、頻繁なコードの変更や追加などによって既存のコンポーネントに問題が発生していないことを都度自動で確認することができるようになるため、アジャイル開発においてもテストの工数を大きく増やすことなく品質を積み上げていくことが可能となります。

アジャイル開発やリグレッションテスト、デグレ、テスト自動化といったトピックについては、それぞれ以下の記事で詳しくご紹介しています。ぜひこれらの記事もあわせてご参照ください。

あらためて、アジャイル開発とは|その概要から進め方、メリット・デメリット、開発手法について
リグレッションテスト(回帰テスト)とは|目的や重要性、実施のポイント
デグレ(デグレード)とは|デグレのリスクや原因、対策
テスト自動化とは|テストを自動化するメリットと注意点

単体テストのデメリット

1.単体テストの実施に工数がかかる

単体テストを実施するためには、テスト対象の仕様の分析やテスト設計、テスト実行といったさまざまな作業が必要となるため、そのための工数・時間・コストがかかります。
そのため、スケジュールやコストなどの制約から単体テストを十分に行わずに先の工程に進んでしまうプロジェクトもあります。

しかしながら、自身の経験上でも、単体テストを実施した方が結果的に時間やコストなどの面で得をすることがほとんどです。
本来は単体テストで検出されるべき不具合が以降のテストレベルまで持ち越されてしまった場合、その不具合による影響はより深刻になりやすく、過去には納品直前のタイミングで単体レベルの不具合が見つかってリリースが延期になってしまったというクライアントから相談を頂いたケースもあります。
必ずしも単体テストのみに限ることではありませんが、ある程度の工数をかけてでもテストを実施した方が結果的には良いことが多く、あらかじめテストを行うことを前提とした予算やスケジュールを立てることが重要と言えます。

2.適切にテストを実施するためには、テストに対する経験やスキルが必要

ソフトウェアの開発には専門的な技術や経験、スキルが求められるのと同じように、ソフトウェアテストを適切に行うにはテストの専門的な技術や経験、スキルを持つテストエンジニアが必要です。
特に、テストベースの分析やテストの設計などには高度なスキルが必要となります。
また、ソフトウェアテストにもさまざまなテスト技法が存在し、テストの目的や対象に合わせて適切なテスト技法を選択することもまた重要です。
ソフトウェアテスト技法とは | 主な技法の種類や特徴について解説

テストに関するスキルが不十分な状態で単体テストを行った場合、観点やパターンの漏れなどテスト自体の品質に問題が生じてしまい、適切に不具合が検出されずに大きなリスクを抱えたままプロジェクトが進むことになってしまう恐れがあるため注意が必要です。
プロジェクト内にソフトウェアテストの有識者がいない場合は、外部のソフトウェアテストベンダーを活用するのも一つのオプションとなるでしょう。

3.開発者がテストをする場合、モチベーションに悪影響を及ぼすリスクがある

コードを書いたり、開発をしたりすることは好きでも、開発したものをテストすることが好き、テストが得意という開発者はそう多くありません。
しかし、今もなお多くの開発現場において開発者自身がテストも担当しているというケースが見られます。
開発者自身がテストも担当する場合、テストに対するモチベーションは上がりにくく、またテストの専門的な知見を有しているわけではないことから、テストが適切に行われないということもありがちです。
さらに、テストにはそれなりの時間もかかるため、本来注力すべき開発にかけられる時間が減少し開発の進捗に支障を来してしまうというケースもあり、これらはさまざまなソフトウェア開発現場で見られる典型的な課題でもあります。

上でも述べたように、テストには専門的な知見が必要となることや、開発者自身とは異なる第三者がテストを行う「第三者検証」の方が不具合を検出しやすいことから、テストを専門的に担当するテストエンジニアをアサインすることができればこれらのデメリットの解消につながります。

まとめ

こちらの記事では単体テストについて、その概要から目的、結合テストとの違い、メリット・デメリットなどについて紹介しました。
単体テストでは、ソフトウェアの部品となるコンポーネントを対象にテストを行いますが、単体テストを疎かにしてしまうと品質に不安のある部品を使ってソフトウェアを構築することになり、ソフトウェア全体の品質に大きな影響を及ぼしてしまう恐れがあります。
単体テストを適切に行うためには、専門的な知見や実施工数などが必要となりますが、テスト対象がソフトウェアの最小単位であるからこそ、十分に品質を担保することが肝要となります。

わたしたちSHIFT ASIAでは、単体テストだけでなく結合テスト、システムテスト、受け入れテストまですべてのテストレベルにおける豊富な実績があり、またテストの戦略や計画の策定、設計、実行までトータルでのご支援が可能です。
また、マニュアルテストだけでなく自動テストの実装やコンサルティングなどあらゆるソフトウェアテストや品質保証に関するソリューションを提供しています。
もしソフトウェアの品質やソフトウェアテストにお悩み・お困りごとなどがありましたら、ぜひお気軽にご相談ください。

お問い合わせ

ご不明点やご相談、ご依頼などがありましたら、お気軽にお問い合わせください

お問い合わせ

導入事例

SHIFT ASIAのソフトウェアテスト・開発などの導入事例はこちらから

導入事例

会社紹介資料

SHIFT ASIAの概要やソリューション、プロジェクト体制例などについてまとめた会社紹介資料を無料でDLいただけます

会社紹介資料

お問い合わせContact

ご不明点やご相談などがありましたら、お気軽にお問い合わせください。

今すぐご相談をご希望の方

お問い合わせ

まずは情報収集をご希望の方

資料ダウンロード