ホワイトボックステストはソフトウェアテスト、正確には内部のロジックと構造を確認するテストです。本記事でその手法について詳しく学んでください。
ホワイトボックステストは、製品の内部構造、設計、コードを検証し、入力と出力が正しく生成されるか、設計、アクセスのしやすさ、セキュリティ、使いやすさを向上させる手法です。テスターがコードを直接確認できるため、「オープンボックステスト」「クリアボックステスト」「コードベーステスト」「ストレートボックステスト」「ガラスボックステスト」とも呼ばれます。
ホワイトボックステストは、テストプロジェクトやソフトウェア開発におけるボックステストの一手法です。ボックステストにはホワイトボックステストと発見テストがあり、発見テストはエンドユーザーの視点に重点を置きます。一方、ホワイトボックステストは製品の内部構造を詳しく検証する内部テストです。
コードに基づくテストは、その透明な手法から「ホワイトボックス」と呼ばれます。この手法では、ソフトの外側を通り抜け、内部の機能まで詳しく確認できます。一方、「ブラックボックス」では内部が見えず、エンドユーザーの体験だけでテストが行われます。
この手法では、製品コードについて以下の点がテストされます:
ホワイトボックステストは、統合、単体、システムレベルで実施されます。主な目的は、アプリがどのように動作しているかを確認することです。また、複数の決められた関数と標準的な出力を照合し、期待通りに動作しない部分があればバグがあると判断します。
ホワイトボックステストは二つのシンプルな段階で行われます。Wallarmのエンジニアは、以下の方法でホワイトボックステストを実施します:
ホワイトボックステストで最も重要なのは、アプリのソースコードを把握することです。このテスト手法はアプリの内部構造に焦点を当てるため、テスターはソースコードに精通している必要があります。プログラミング言語の詳細な知識は、対象アプリを完全に理解する上で最善の方法です。また、最適な安全なコーディング手法についても理解が求められます。セキュリティはホワイトボックステストの重要な要素であり、テスターはセキュリティ上の問題を見つけ、システムを攻撃から守る対策を講じる必要があります。さらに、悪意のあるコードが混入する可能性にも備えなければなりません。
ホワイトボックステストの第二段階では、内部構造をテストし、各機能が正しく動作するか確認します。テスターはソースコードを検証するためのコードを作成し、開発サイクルの各段階で小規模なテストを実施します。これにより、全体の動作が確認されます。なお、詳細なコード知識が必要なため、通常はエンジニアが実施し、リソースが不足している場合はテストが行われないこともあります。
開発中の製品をテストせずに品質を確かめることは困難です。これらのテストは、製品が全ての要件を満たし、安全で完成度が高く、応答性があるかどうか検証するために行われ、エラーや不具合を未然に防ぐ目的があります。
ソフトウェアテストは、製品を様々な試験にかけることで、エラーや不整合、悪意ある挙動を発見するプロセスです。各テスト後、テスターは状況を分析し、その結果を報告書に記録します。報告書は、検出された不具合を修正し、システムの品質を保つために役立ちます。
近年、発見テスト、グレーボックステスト、ホワイトボックステストなど様々な手法が用いられています。各テスト手法は、エンジニアがバグのない、スムーズに動作するソフトを作るための多様なアプローチを提供します。それぞれの違いを詳しく見ていきます。
オープンソースツールを利用してセキュリティテストを試してみてください - GoTestWAF
ブラック、グレー、ホワイトボックステストの違いを明確にするため、それぞれのメリットとデメリットを詳しく見ていきます。
ブラックボックステスト(発見テストとも呼ばれる)の特徴は、テスターが製品の内部構造やソースコードを知らない点にあります。このテストでは、プログラミング言語の専門知識や詳細なコード情報は不要です。発見テストの目的はコード内部を詳しく見ることではなく、ユーザーインターフェースに触れ、様々な状況での表示とシステムの入出力が正しいか確認することにあります。そのため、発見テストは機能ベースのテストとも呼ばれます。
発見テストは、第三者のテストチームがエンドユーザーの視点で実施します。テスターは正しいまたは誤ったデータを入力し、結果を期待値と比較します。予期せぬ結果は記録され、エンジニアに改善依頼が送られます。この仕組みにより、開発初期段階でエラーや不具合を早期に発見できます。
発見テストは、単体、結合、システム、受け入れなど様々なレベルで実施可能です。単体テストではインターフェースの動作が規定に沿っているかを確認し、結合テストでは各部品間の連携を検証します。システムテストではシステム全体の信頼性と基本機能が試され、受け入れテストでは様々な状況下でのアプリの応答性が評価されます。
一般的な発見テスト手法として、以下の方法が挙げられます:
発見テストのメリットとデメリット
発見テストは、製品内部のあいまいさ、論理的不整合、曖昧な部分を見つけ出すのに有効です。テスターは内部部分に触れることなく機能を評価でき、その結果は客観的で、エンドユーザーとエンジニアの作業の違いを浮き彫りにします。
発見テストは追加のプログラミング知識を必要とせず迅速に実施できますが、大規模なプログラムのテストにはあまり効果的ではありません。
機能に注目する発見テストとは異なり、ホワイトボックステストは製品の内部構造を詳細に検証し、その設計意図を明らかにすることを目的とします。論理駆動テストとも呼ばれ、専門的な知識が求められるため、テスターは内部部品へのアクセスが必須です。
ホワイトボックステストは、製品の内部構造を検証し、部品間の連携や異常な動作を特定して修正するため、専門家が実施します。また、ソースコード解析やデバッグなど、先進的なツールも用いられます。
この手法の効果は主に単体テストで発揮されますが、結合テストやリグレッションテストなどにも利用されます。テスターは内部構造を検証し、コード上の欠陥や問題点を発見します。さらに、新たに実施されたコードテストを加える前に、エラーの発生を未然に防ぎます。
結合テストでは、各インターフェースやサブシステム間の連携を検証するのに役立ち、リグレッションテストは、単体や結合テストで作成したホワイトボックステストケースを再利用して確認します。
代表的なホワイトボックステスト手法は以下の通りです:
ブラックボックス手法と比較すると、ホワイトボックス手法は正確性に優れ、誤った設計や不要なコードを明らかにできます。このプロセスはテスターにソースコードの深い理解を要求し、異なるコードの追跡や将来の変更点も新たなテストで確認しやすくなります。
また、コーディング過程のボトルネックを明らかにし、開発チームに広範なテストカバレッジと有用なフィードバックを提供、コードの改善や修正を容易にします。ホワイトボックステストには高度な知識が必要なため、専門のエンジニアがシステム全体のテストを担当するのが望ましいです。
自動化されてはいるものの、ホワイトボックステストは複雑で時間を要します。エンジニアは正確なフローや経路を特定し、テストするために長時間を費やさなければなりません。優秀な技術者を起用すれば良い結果が得られますが、維持費は高くなります。また、テスト結果は使用するプログラミング言語に依存するため、ソフトのコードが変更されれば、従来の仮定が無効となり内部構造も変化します。
グレーボックステストは、ブラックボックスとホワイトボックステストの利点を組み合わせ、それぞれの欠点を補う手法です。両方のテスト手法のカバレッジを拡大し、ソフトの全層を効果的に検証します。グレーボックステストでは、インターフェースや機能のテストとともに、内部構造の確認も行います。
この手法は、複雑なシステムを対象とし、エンジニアやテスター、エンドユーザーがテストを実行できる発見手法を採用します。しかし、テストケースの設定には内部構造の一部情報、データ形式のドキュメント、設計情報、そして製品の実用的な詳細が必要です。作成されたテストケースは、設計上の脆弱性を検出し、改善することを目的としています。
グレーボックステストは、特に結合テストで有効です。ウェブアプリはソースコードや内部構造が見えにくいため、ホワイトボックス手法ではテストしづらいですが、この手法であれば対応可能です。また、ビジネス分野のテストにも適用できます。
代表的なグレーボックステスト手法は、次の通りです:
グレーボックステストは、ブラックボックスとホワイトボックステストの良い点を取り入れつつ、それぞれの欠点を補っています。仕様やインターフェース、構造を深く掘り下げずにテストが可能なため、重要な点を同時に確認できます。
しかし、グレーボックステストは効果的なプロジェクト管理が必要で、テスト中に同様のシナリオが重複しやすく、一部の領域がカバーされないため、アルゴリズムのテストには不向きです。
ホワイトボックステストには、以下の種類があります:
ミューテーションテスト: ソフトやコードの内部構造を詳しく検証し、システムが予期しない動作をする原因となる経路やエラーを特定する手法です。予期せぬクラッシュや異常状態に対処するのに有効です。
ユニットテスト: このテストでは、アプリの各部品が期待通りに動作するかを検証します。ソフトウェア開発中にエラーを迅速に発見するのに効果的です。
結合テスト: 各部品やユニットを組み合わせ、一体としてテストし、部品間の連携に起因するエラーを検出します。
ホワイトボックスペネトレーションテスト: 外部からの攻撃がシステムに影響を与えるかを検証するテストです。外部要因との連携や外部からのエラーが、システムに与える影響を確認します。
スタティックコード解析: コードの各行を詳細に解析し、エラーを検出する手法です。基本的なエラーは修正され、不適切な部分があれば全体の置換えも検討されます。
一般的なオープンソースのホワイトボックステストツールは以下の通りです:
ホワイトボックステストには主に三つの手法があります:
ステートメントカバレッジ
ステートメントカバレッジは、ホワイトボックステストにおける基本的なコードカバレッジ分析で、アプリのソースコード内で実行された文の数を評価します。
計算式は以下の通りです:
Statement coverage = (Number of statements executed/Total number of statements) * 100
ブランチカバレッジ
ブランチカバレッジは、制御構造の各部分が実行された数を計測するホワイトボックステストの手法です。
文、case宣言、その他の条件分岐が正しく実行されたか確認します。
例えば、if文では、真偽両方の分岐が実行されたかを確認できます。
計算式は以下の通りです:
Branch coverage = (Number of branches executed/Total number of branches) * 100
ファンクションカバレッジ
ファンクションカバレッジは、定義された関数が呼び出された数を評価する手法です。テスターは、複数の入力値を試し、関数が期待通りに動作するか確認します。
計算式は以下の通りです:
Function coverage = (Number of coverage executed/Total number of coverage) * 100
ソフトウェアテストにおいて、ホワイトボックステストは、対象システムの内部動作に完全アクセスできるユーザーの動作を模倣する有用な手法です。テスターはアプリの内部詳細全てにアクセスでき、多くの重要な条件を検出することが可能となります。
ホワイトボックステストは、コードの安全性、品質、信頼性を担保するために、開発チームが活用すべき数少ないテスト手法の一つです。場合によっては、未経験の外部ユーザーの視点を反映する発見テストなど、他の手法も併用されます。
White Box Testing - Github topics
最新情報を購読