システム分野やソフトウェア分野に携わる開発エンジニアは自身の実務外となる評価の知識を持っていないケースが多々あります。
一方で、開発責任者やテスト責任者に任命された方の中には「単体テストとは何を指すのか知りたい」「手っ取り早く単体テストを学びたい」等のニーズが多いのも事実です。
そこでこの記事では、テスト工程で重要な単体テストの概要から進め方・テストケース作成のポイントを解説します。
- もくじ
1.単体テストとは?
1-1 単体テストとは
単体テスト(ユニットテスト)とは、プログラムを構成する最小単位となる「※モジュール」の機能が正しく動作しているかを確認するテストです。
多くの場合、コーディングを行ったプログラマ自身が担当します。
※モジュールとは...ソフトウェアでは機能ごとに分けられた関数やメソッド、といったパーツを組み合わせて構成されています。このパーツをユニットのことを「モジュール」と呼びます。
単体テストでは、主にホワイトボックステストを実施します。
ホワイトボックステストは、個々のモジュール中の命令文や条件判定「if-else文」といった論理的な構成とその組み合わせや、入出力のデータパターンによるエラーを発見することを目的としたテストです。「モジュール内で実行されうる処理を確認するテスト」という事になります。
このテストはバグを早期に発見することが可能です。ここでバグを出し切って、後工程につなげるという意識が重要になります。
1-2 他のテストとの違い
単体テストは通常、開発フェーズかもしくはテストフェーズで初めに実施されるテストであり、後続にも異なる観点のテストが実施されます。
一般的には結合テスト、システムテスト、受け入れテストというテストが実施されます。
各テストは基本的に、以下で説明するような内容のテストになりますが、実際のシステム開発の現場ではプロジェクトの初めに各テストのスコープをそのプロジェクトに合わせて定義することがほとんどです。そのため、テストの呼び方やスコープが異なる場合があるので皆さんのプロジェクトに合わせて適宜読み替えてください。
結合テスト
モジュールなど決められた単位で実装したプログラムを結合し、想定通りの動作をするかどうかを確認するテストになります。単体テストの後続のテストで、結合部分や機能の連携部分の検証を行うテストになります。
システム(総合)テスト
システム開発会社がクライアントと合意した設計書通りに動作するかどうかを確認するテストです。単体テストとは異なり、業務観点でのテストも含みます。通常は、システム開発会社が実施します。
受け入れテスト
クライアントが実施する業務観点のテストです。システムが要求した仕様通りに動作することや、実際にシステムを利用してビジネスシナリオなどを実施してみて、問題無いかどうかを確認します。
2.単体テストのメリット・デメリット
2-1 メリット
単体テストのメリットは、以下の2つです。比較的小さな単位でテストを実施することで、不具合の発見とその修正が容易となります。
不具合を早期に発見し、修正や調整ができる
単体テストは、関数やメソッド等の細かい単位でテストを実施するため、バグや不具合を発見しやすく問題箇所の特定が容易となります。その結果、プログラムの修正や調整もスムーズに行うことができます。
リファクタリングを行いやすい
リファクタリングとは、システムやソフトウェアの外部的な動きは変更せず、プログラムの内部構造に変更や改善を行うことを指します。コードの内部構造を最適な状態に保つためには重要な作業です。
単体テストの要件や実施内容を適切に準備すれば、外部的な動きに問題があった時にテスト結果として検出されます。それにより、リファクタリングをスムーズに行うことが可能です。一方、単体テストの準備が不十分であれば、リファクタリングの実施が困難になるだけでなく、内部構造の把握や、原因調査の工数増加につながる恐れがあります。
2-2 デメリット
単体テストでのデメリット・注意点は主に以下の3点が挙げられます。小さい単位でテストを実施することによる手間と負荷がかかり、テスト実施者のスキルに応じて品質の差が生じる可能性があります。
テストケースの数が増える
単体テストは、個々のプログラムの小さな機能に対してテストケースを作成します。そのため、テストケースの数が増え、負担が大きくなります。
テストの品質が実施者のスキルに左右される
単体テストの品質は、テスト実施者のスキルにより品質が大きく左右されます。効果的なテストを実施するには、一定以上のスキルと経験値が必要です。なぜなら、不具合が起こりやすい条件を想定したテストコードの作成やパラメーターの設定を行うことが重要だからです。
大きな負荷を理由にテストの一部を省略するケースも
開発工程の中で単体テストの準備と実施は、特に負荷が大きくなります。そのため、スケジュールやリソースを十分に確保できず、ある程度妥協したテストを実施せざるを得ない場合があります。その場合は、テスト内容が不十分となり、品質を十分に確保できない恐れがあります。
3.単体テストやり方とテストケース作成のポイント
3-1 単体テストのやり方
単体テストを実施するやり方には、デバッグ実行やログ出力で確認する方法やフレームワークを使用する方法などがあります。
フレームワークを使用する場合、まず「テストケース」と「テスト用プログラム」を作成します。テストケースとは、開発中のシステムに合わせて検証するポイントをまとめたドキュメントのことです。
そして、テストケースを作成した後はその内容に従ってテスト用のプログラムを作成します。
ほとんどのプログラミング言語でテスト用のフレームワークが用意されているため、それを利用して作成することが一般的です。例えば、JavaであればJUnit、C/C++言語であればCppUnit、PHPであればPHPUnitがあります。
3-2 テストケース作成のポイント
テストケースは現場のルールに従って作成する必要があります。
そのため、すでにテンプレートが用意されているプロジェクトであれば、それを利用して作成しますが、特にテンプレートやルールなどが無い場合は、主に以下の点に注意して作成することが重要になります。
ポイント1:テスト観点の明確化
まずは必要なテスト観点を明確にします。そうすることでテストケースを書く際や用意するデータを決める時に方針がぶれることが無くなり、効率的に作業を進めることができます。テストにかけられる工数は基本的に限られており、量をこなせば品質が上がるものではないため、必要なテストだけを実施することが求められます。
ポイント2:割愛シナリオの記載
一般的に存在するテストパターンが全て実施されるプロジェクトはほとんどありません。テストにかけられるコストと時間には限りがあるためです。そのため、実施するテストを決定する際は、必要なテストに絞って、不要だと思われる部分は割愛することになります。そこで重要になるのが、不要と判断した部分も記録に残すことになります。
記録に残すことで、後続のテストで不具合が発見された場合、単体テストのテストケースを見ながら不足していたケースを確認し、必要に応じて追加テストを実施することで効率的に品質を上げることができます。
ポイント3:多角的視点の取り入れ
様々な観点から必要なテストを洗い出すことも効率的にテストを実施する上で必要な方法です。プログラムの担当者だけでテストケースを作成するのではなく、他の開発者などにも確認してもらうことで、死角になっている検証観点も洗い出すことができます。そのため、実際の現場では、単体テストのテストケースを作成する際は他の開発者のレビューを受けることをルールとしていることがよくあります。
4.単体テスト自体の品質を示す指標=「カバレッジ」
一般的に、単体テスト自体の品質は「カバレッジ」という指標を利用されます。
カバレッジ(網羅率)とは、所定の条件でテストがどれだけ網羅されたかを数値化したものを指します。カバレッジを使うことで、テストは十分だったか、それとも不足しているかといった、テストそのものの評価を行うことができるため、テストの品質を確認するためのツールとして頻繁に利用されます。
カバレッジは様々な側面から計測することが可能ですが、単体テストの場合は、命令網羅率、分岐網羅率、条件網羅率で評価されることが多くなっています。
命令網羅率
プログラムの全ての命令文の中で、テスト実施中に1回以上実行されたものをパーセンテージで示したものです。
分岐網羅率
プログラムの全ての条件文(if文などとも呼ばれる)の判定により発生する可能性のあるすべての結果の中で、テスト実施中に1回以上実行されたものをパーセンテージで示したものです。例えば、条件文が1つのプログラムでtrueとfalseという2つの結果があり、テストではtrueのみが実行された場合、分岐網羅率は50パーセントとなります。
条件網羅率
プログラムの全ての条件文の中の全ての判定条件の中で、テスト実施中に1回以上判定されたものをパーセンテージで示したものです。例えば、if文で変数a=1の場合はtrue、a=2またはそれ以外の場合はfalseとなる場合、aが「1」、「2」、「それ以外」の3つのパターンを実施することで条件網羅率は100%となります。
まとめ
単体テストとは、プログラムを構成する最小単位となる「モジュール」の機能が正しく動作していることを検証するテストです。
実施のメリット・デメリットとしては以下のようなものがあります。
メリット
- 不具合を早期に発見し、修正や調整ができる
- リファクタリングを行いやすい
デメリット
- テストケースの数が増える
- テストの品質が実施者のスキルに左右される
- 大きな負荷を理由にテストの一部を省略するケースも
単体テストは、開発フェーズかもしくはテストフェーズで初めに実施されるテストです。単体テストでバグを早期に見つけ出し、後工程のテスト効率を上げていきましょう。