ホワイトボックステストとは?種類、網羅条件について解説
ホワイトボックステストとは、開発者目線でソフトウェアの内部構造が意図した通りに動作するかを確認するためのテスト手法です。また、ホワイトボックステストでは、システムやソフトウェアの品質を確認するうえで、網羅基準が設けられています。本記事では、ホワイトボックステストとは何か、その手法や4つの網羅条件についてご紹介します。
目次
ホワイトボックステストとは
ホワイトボックステストとは、開発者の視点でソフトウェアの内部構造が意図した通りに動作するかを確認するためのテストを指します。つまり、内部構造を知っている人がソースコードの仕様や動作を評価することを目的としています。
この手法では、テストケースを設計するために、コードの制御フロー、分岐、ループ、条件分岐などを考慮します。そして、ソースコードの特定の部分に対して、テストケースを作成し、それらを実行して、結果が期待通りであることを確認します。
ホワイトボックステストは、ソフトウェアの品質を向上させるために非常に重要な手法です。ただし、テスターがソースコードの実装に精通している必要があり、専門知識とスキルが求められます。また、すべてのコードパスをカバーすることが困難であるため、完全なテストカバレッジを達成することはできません。
具体的な手法については後半にてご紹介します。
ホワイトボックステストの4つの網羅基準
ホワイトボックステストには「命令網羅」「判定条件網羅」「条件網羅」「複数条件網羅」の4つの網羅基準があります。ここでは、それらについて詳しくご紹介します。
「命令網羅」
ホワイトボックステストの「命令網羅」とは、ソフトウェアの全ての命令文が少なくとも一度は実行されるようにテストケースを設計することを指します。
具体的には、命令網羅を達成するためには、以下のようなテストケースを設計する必要があります。
全ての命令文が実行されるテストケース:ソフトウェアの全ての命令文が実行されるように、適切な入力を与えたテストケースを設計します。
条件分岐のテストケース:
条件分岐が含まれる場合には、真偽両方の結果を確認するために、真と偽の両方の入力を与えたテストケースを設計します。
ループのテストケース:
ループが含まれる場合には、ループの各イテレーションが正しく実行されることを確認するために、適切な回数の入力を与えたテストケースを設計します。
「判定条件網羅」
ホワイトボックステストの「判定条件網羅」とは、ソフトウェアの全ての判定条件が、真と偽の両方の場合で少なくとも一度は実行されるようにテストケースを設計することを指します。
具体的には、判定条件網羅を達成するためには、以下のようなテストケースを設計する必要があります。
判定条件が真となるテストケース:ソフトウェアの全ての判定条件が真となるような入力を与えたテストケースを設計します。
判定条件が偽となるテストケース:ソフトウェアの全ての判定条件が偽となるような入力を与えたテストケースを設計します。
「条件網羅」
ホワイトボックステストの「条件網羅」とは、ソフトウェア内の全ての条件式の組み合わせが少なくとも一度は実行されるように、テストケースを設計することを指します。
具体的には、条件網羅を達成するためには、以下のようなテストケースを設計する必要があります。
各条件式が真と偽の両方で実行されるテストケース:ソフトウェア内の各条件式が真と偽の両方で実行されるように、適切な入力を与えたテストケースを設計します。
条件式の組み合わせが真となるテストケース:ソフトウェア内の全ての条件式の組み合わせが真となるような入力を与えたテストケースを設計します。
条件式の組み合わせが偽となるテストケース:ソフトウェア内の全ての条件式の組み合わせが偽となるような入力を与えたテストケースを設計します。
「複数条件網羅」
ホワイトボックステストの「複数条件網羅」とは、複数の条件式がある場合に、それらの条件式が組み合わさった状態でのテストケースを設計することを指します。
例えば、2つの条件式 A と B がある場合、複数条件網羅を達成するには、以下のようなテストケースを設計します。
- A と B の両方が真となるテストケース
- A が真で B が偽となるテストケース
- A が偽で B が真となるテストケース
- A と B の両方が偽となるテストケース
複数条件網羅は、条件式の数が増えるにつれて複雑になっていきますが、それに応じてより高い品質のテストを行うことができます。この方法により、プログラム内のすべての条件式の組み合わせを実行し、プログラムの欠陥を検出することができます。
ただし、複数条件網羅は完全性が高いため、網羅するためには大量のテストケースが必要になる場合があります。そのため、網羅する必要がある条件式を適切に選択することが重要です。また、網羅基準や他のテスト手法を併用することで、より効率的かつ効果的なテストを行うことができます。
ホワイトボックステストの種類
1つ前の章では、ホワイトボックスの網羅基準についてご紹介しました。この章では、それらの基準を満たしているかどうかをテストするための具体的なテスト手法をご紹介します。
ステートメントテスト
ホワイトボックステストにおけるステートメントテストとは、プログラム内の全ての命令文が少なくとも一度は実行されるようなテストケースを設計する手法のことです。
ステートメントテストは、プログラム内のすべてのステートメントが正しく動作するかどうかを検証するために使用されます。テストケースは、プログラムの各ステートメントを少なくとも1回実行するように設計され、実行された各ステートメントに対してテスト結果を検証します。
ステートメントテストの例として、以下のようなプログラムがあったとします。
このプログラムに対するステートメントテストでは、以下のようなテストケースが考えられます。
- テストケース1: aとbに任意の値を代入し、条件式(c > 10)が真となるようにする
- テストケース2: aとbに任意の値を代入し、条件式(c > 10)が偽となるようにする
- テストケース3: aとbに任意の値を代入し、条件式(c > 10)が真となるようにし、かつ、条件式を実行した後にステートメント5が実行されるようにする
これらのテストケースを実行することにより、プログラム内の全てのステートメントが実行されることが保証されます。
ステートメントテストは、プログラムの欠陥を見つけるために非常に効果的な手法ですが、プログラムの複雑さが増すと、必要なテストケースの数が指数関数的に増加することがあります。そのため、ステートメントテストを他のテスト手法と併用することで、より効率的かつ効果的なテストを行うことができるでしょう。
デシジョンテスト
ホワイトボックステストにおけるデシジョンテストとは、プログラム内の全ての条件分岐文(if文、switch文など)について、真偽を評価する条件をすべて網羅するようなテストケースを設計する手法のことです。
デシジョンテストでは、プログラム内の条件分岐が正しく動作するかどうかを検証するために使用されます。テストケースは、条件分岐文の真偽をすべて網羅するように設計され、各条件分岐に対してテスト結果を検証します。
デシジョンテストの例として、以下のようなプログラムがあったとします。
このプログラムに対するデシジョンテストでは、以下のようなテストケースが考えられます。
- テストケース1: aとbに任意の値を代入し、条件式(c > 10)が真となるようにする
- テストケース2: aとbに任意の値を代入し、条件式(c > 10)が偽となるようにする
これらのテストケースを実行することにより、プログラム内の全ての条件分岐が網羅されることが保証されます。
デシジョンテストは、ステートメントテストよりも高度なテストケースの設計が必要となりますが、より効率的なテストを実現することができます。また、テストケースの数がステートメントテストよりも少なくなるため、大規模なプログラムに対しても実行可能なテストを設計することができます。
ただし、デシジョンテストでも、複雑な条件分岐が含まれるプログラムでは、全ての条件分岐を網羅することが困難な場合があります。そのため、網羅率を上げるために、他のテスト手法と併用することが推奨されます。
ホワイトボックステストにおける条件テストとは、プログラム内の複合条件式を評価するために使用されるテスト手法です。複合条件式は、複数の単純な条件式が結合されたものであり、論理演算子(&&、||、!など)を使用して結合されることが一般的です。
条件テスト
条件テストでは、プログラム内の複合条件式が正しく動作するかどうかを検証するために使用されます。テストケースは、複合条件式内の全ての単純条件式が真となるように、または偽となるように設計されます。
条件テストの例として、以下のようなプログラムがあったとします。
このプログラムに対する条件テストでは、以下のようなテストケースが考えられます。
テストケース1: aとbに任意の値を代入し、aが5より大きくかつbが20より小さい場合
テストケース2: aとbに任意の値を代入し、aが5より小さいか、bが20より大きい場合
これらのテストケースを実行することにより、プログラム内の複合条件式が正しく動作することが保証されます。
条件テストは、デシジョンテストよりも高度なテストケースの設計が必要となりますが、より効率的なテストを実現することができます。また、テストケースの数においては、ステートメントテストよりも少なくなるため、大規模なプログラムにおいても有効です。
パステスト
ホワイトボックステストにおけるパステストは、ソフトウェアの全体的な機能を確認するために使用されるテスト手法です。この手法では、プログラムの全体的なフローをテストするために、プログラム内の異なるパスを実行していきます。
具体的には、プログラム内の各制御構造(if文、forループ、whileループなど)の各ブランチを実行することで、すべてのパスを網羅することを目指します。これにより、すべての可能性をカバーし、プログラムが予期しない方法で動作することを防止することができます。
パステストは、他のテスト手法(ステートメントテスト、デシジョンテスト、条件テスト)と組み合わせて使用されることがあります。これにより、より包括的なテストを実行することができます。
パステストは、複雑なプログラムに対しては非常に時間がかかる場合があるため、プログラムのサイズや複雑さを考慮して使用する必要があります。また、すべてのパスを網羅することは不可能な場合があるため、優先順位を設定して、最も重要なパスをテストすることが重要です。
状態遷移テスト
ホワイトボックステストにおける状態遷移テストとは、ソフトウェアが複数の状態を持ち、それらの状態間を移行する場合に、正しい状態遷移が行われるかを確認するためのテスト手法です。
状態遷移テストでは、ソフトウェアが入力されたデータに基づいて状態を変更し、適切な出力を生成するかどうかを確認します。このテスト手法は、制御フローや制御構造に着目する従来のテスト手法とは異なり、ソフトウェアが複数の状態を持ち、状態間を移行する場合に注目します。
具体的には、状態遷移図を作成し、各状態から他の状態への遷移を表します。この図を使用して、すべての可能な状態遷移を網羅するテストケースを作成します。このようにして、ソフトウェアがすべての状態遷移に対して適切に動作することを確認することができます。
状態遷移テストは、ソフトウェアの信頼性を高めるために重要な役割を果たします。特に、入力に基づく複雑な状態遷移がある場合には、このテスト手法を使用して、ソフトウェアが正しく動作することを確認することが重要です。ただし、状態遷移テストは、テストケースの数が多くなる場合があるため、適切な優先順位を設定することが必要です。
ループテスト
ホワイトボックステストにおけるループテストは、プログラム内の繰り返し処理を対象としたテスト手法です。ループ処理は、プログラム内で最も複雑でエラーが発生しやすい部分の1つです。そのため、繰り返し処理を十分にテストすることは、ソフトウェアの品質を保証するために非常に重要です。
ループテストでは、以下のテストケースが考慮されます。
- ループの最小実行回数のテスト
ループ処理が最小実行回数で正しく動作するかを確認します。通常は、ループが0回で実行された場合と、1回で実行された場合の2つのテストケースが含まれます。 - ループの最大実行回数のテスト
ループ処理が最大実行回数で正しく動作するかを確認します。最大実行回数に達する前に、ループが正常に終了するかどうかもテストされます。 - ループの境界条件のテスト
ループ処理の境界条件(例:条件の上限または下限)で正しく動作するかどうかを確認します。 - .ループ内の条件文のテスト
ループ内の条件文が正しく評価されるかどうかを確認します。ループ内で発生する可能性のある条件判断のすべての場合をカバーする必要があります。 - .ループ内の変数の変化をテストする
ループ内で使用される変数の変化をテストします。変数の初期値、増分、および最終値が正しいかどうかを確認します。 - .ネストされたループのテスト
ネストされたループが正しく動作するかどうかを確認します。ネストされたループがある場合は、ネストされたループに対して同様のテストケースを作成する必要があります。
ループテストは、ループ処理の完全性を保証することができます。しかし、ループ内で変数を使用する場合、ループ変数が更新されずに無限ループに陥る可能性があるため、注意が必要です。
これらの手法を組み合わせることで、より高品質なコードを開発することができます。ただし、完全なテストカバレッジを実現するには時間と労力が必要であるため、開発プロジェクトの目的や状況に応じて、テストカバレッジを調整したり、アウトソーシングしたりする必要性が考えられます。
まとめ
本記事では、システムやアプリケーションの内部構造を網羅的に確認するテストであるホワイトボックステストの概要や手法、4つの網羅基準についてご紹介しました。完全なシステムやアプリケーションを開発するためには、高い網羅率が求められます。網羅率が高ければ、より多くの不具合を抽出しやすくなります。ただし、その分テストにおける工数も膨大になります。
そのため、自前で膨大なテストを実施するチームや環境を構築するのが困難だけど、高品質を追求したい場合は、専門家にアウトソーシングするという選択肢を検討してみてください。CMC Japanは、最新の技術でテストケースを作成し、分析することにより、テストプロセス全体を円滑に進めることをサポートいたします。
CMC Japanは、経験豊富なソフトウェア開発およびテスト会社として、またISTQBのプラチナパートナーとして、自動化ツールとあらゆるテスト手法を適切に組み合わせることにより、優れたユーザー体験と機能の完全性を保証いたします。お気軽にお問い合わせください。