ホワイトボックステストとは?
2020-08-28

ホワイトボックステストとは?

ソフトウェア開発におけるテスト技法に「ホワイトボックステスト」があります。ホワイトボックステストとはどういうものなのか、また、ホワイトボックステストの品質を評価する「カバレッジ(網羅率)」や、対照的なテスト技法である「ブラックボックステスト」についてもあわせてご紹介していきます。

ソフトウェアの品質を確かめ、性能を向上させていくソフトウェアテストには、さまざまな技法があります。その中でも、ソフトウェアの内部構造に着目するテストとして有名なのが「ホワイトボックステスト」です。

この記事では、ホワイトボックステストとはどういうものなのか、また、ホワイトボックステストの品質を評価する「カバレッジ(網羅率)」や、対照的なテスト技法である「ブラックボックステスト」についてもあわせてご紹介していきます。

ホワイトボックステストとは?

「ホワイトボックステスト」は、ソフトウェア内部のプログラムが、設計書や仕様書通りの正しい構造で組み立てられ、意図した通りに動作しているかを確認するテスト技法で、主に、単体テストに用いられます。

テストを行うには、プログラムの構造を理解している必要があるため、ソフトウェアの開発者が担当するのが一般的です。

カバレッジ(網羅率)とは

ホワイトボックステストで求められるのは、内部構造を網羅するようなテストケースを作成し、実行すること。そこで、作成したテストケースによって、プログラムをどのくらい実行できたか、つまり、どのくらい網羅したテストを実施できたかというテスト品質の指標として「カバレッジ(網羅率)」を計測します。

プログラムの単体テストでは、ソースコードの命令文や判定条件の実行をテストしますが、この、ソースコードがテストされた割合のことを特に「コードカバレッジ」と呼び、コードカバレッジには、命令文や判定条件をどのくらい網羅するかによって、いくつかの基準があります。

より厳しいカバレッジ基準で100%を目指せば、多くの不具合を発見できますが、その分、必要な工数も増えていくため、プログラムがソフトウェアやその先の製品に与える影響度合いによって、適切なカバレッジ基準を選び、カバレッジを100%にするようにテストを実施することが重要です。

ここから、代表的なコードカバレッジをいくつかご紹介していきます。

 

ステートメントカバレッジ(命令網羅/C0)

最もベーシックなコードカバレッジが、「ステートメントカバレッジ」です。日本語で「命令網羅」と呼ばれるように、ソースコードの実行可能な命令文が、テストでどのくらい実行されたかを評価します。

ステートメントカバレッジでは、条件分岐があった場合、真のパスを通って命令が1回実行されるとその時点でカバレッジが100%となるため、コードの網羅性が低く、弱いカバレッジ基準と言えます。

 

ブランチカバレッジ(条件網羅/C1)

「ブランチカバレッジ」は、日本語で「条件網羅」と呼ばれるように、ソースコードの各条件分岐の真偽が、テストでどのくらい出現したかを評価します。

ブランチカバレッジでは、真偽の両方をテストすることができるため、ステートメントカバレッジよりも強いカバレッジ基準となり、ブランチカバレッジが100%の場合、必然的に、ステートメントカバレッジも100%となります。

ただし、ANDやORを含む複合条件の組み合わせは考慮されないため、条件分岐で真偽が各1回以上出現するとその時点でカバレッジが100%となり、全ての条件の組み合わせを網羅できるわけではありません。

 

MC/DC

「MC/DC」は、「Modified Condition/Decision Coverage」の略で、国際技術標準「DO-178B(RTCA)」の中で、航空機搭載ソフトウェアのテストで適用する評価基準として開発されたものです。網羅性が高いため、航空機や自動車に搭載するソフトウェアなど、高い安全性が求められる場合に、MC/DCを用います。

MC/DCでカバレッジを100%とするには、以下の3つの条件を満たす必要があります。

  1. プログラムの判定に含まれる全条件は、可能な値を少なくとも一回はテストする。
  2. プログラムの全判定は、可能な値を少なくとも1回はテストする。
  3. プログラムの全判定は、判定の出力に独立して影響することを示す。

ものすごく簡単に説明すると、判定に影響を与える条件を全て網羅したテストケースを作成し、実行するということです。

例えば、AとBという2つの条件を網羅するテストケースは、全部で4通りあります。命令文が、「AandBが真の時、Cを実行する」の場合、Aが真であれば、Bが真偽のどちらかによって、判定の出力が変化しますが、Aが偽であれば、Bの真偽がどちらでも、判定は偽になります。つまり、Aが偽のテストケースは1つで良いため、このソースコードにおけるMC/DCのカバレッジを100%にするためのテストケースは、3通りということです。

ちなみに、AandBではなく、AorBの場合は、Aが真であれば、Bが真偽のどちらでも、判定は真になり、Aが偽であれば、Bの真偽によって、判定の出力が変化するので、テストケースは異なりますが、この場合でも、MC/DCのカバレッジを100%にするためのテストケースは、3通りということになります。

なんとなくお分かりいただけたでしょうか?

ブラックボックステストとは?

「ブラックボックステスト」は、ホワイトボックステストとは対照的で、ソフトウェアの内部構造を把握せずに、入力値と出力結果を確認するテスト技法です。設計書や仕様書の通りにシステムが動くのかではなく、ソフトウェアに対して求められている要件を満たしているかを確認します。

ブラックボックステストは、単体テスト、連結テスト、統合テスト、運用テストと全てのテスト工程で実施が可能ですが、主に、運用テストで用いられ、プログラムの構造や動作は確認しないので、ソフトウェアの開発者ではない、第三者が担当することができます。

ここからは、ブラックボックステストで使われるテスト手法の中でも、代表的なものをいくつかピックアップしてご紹介していきます。

 

同値分割

「同値分割」は、予想される出力結果をグループ分けし、そのグループ内の代表値を入力して、正しい出力結果になるかを確認するテスト手法です。代表値のテスト結果が、そのままグループ内の全ての値に反映されるという考えがベースになっていて、より少ないテストケースで、より広い対象範囲を網羅することができる、効率的なテストと言えます。

ソフトウェアが正常に動作する値を「有効同値クラス」、エラーになる値を「無効同値クラス」と言い、有効同値クラスが1つの場合、その前後に無効同値クラスが存在するため、有効同値クラスの代表値を1つ、前後の無効同値クラスから代表値を1つずつ選んで入力し、テストを行います。

 

境界値分析

「境界値分析」は、同値分割で作成した同値クラスの境界にあたる値を入力して、正しい出力結果になるかを確認するテスト手法です。有効同値クラスの最大値と最小値が「境界値」となり、境界値と、境界値の1つ下の値、境界値の1つ上の値でテストを行います。

境界は、ソースコードの中で、等号や不等号の記号で表しますが、ソフトウェア開発者が、設計書や仕様書の内容を誤解していたり、記述を誤っていたりとミスが発生しがちな箇所。そのため、境界値分析は、バグや不具合を発見する効果的なテストと言えるのです。

 

デジションテーブル

「デジションテーブル」は、入力する値などの条件の組み合わせによって、どのような出力結果になるのかをまとめた表のことです。

デジションテーブルにまとめたテストケースを実行することで、重複や抜け漏れのない、網羅性が高く効率的なテストを行うことが可能です。ただし、全ての条件の組み合わせと出力結果を洗い出すため、条件と動作の数次第では、テストケースが膨大になってしまうというデメリットもあります。

 

グレーボックステストとは?

ホワイトボックステストとブラックボックステストのほかにもう1つ、「グレーボックステスト」もあります。

グレーボックステストは、ソフトウェアの内部構造に着目しつつも、あくまで、入力値に対する出力結果をテストするという、ホワイトボックステストとブラックボックステストの中間にあたるテスト技法です。

プログラムの構造や動きを把握していれば、より適切な狙いを持ったテストケースを作成し、テストを行うことができるという考え方に基づいています。

単体テストはソフトウェアによる自動化がおすすめ

話が少し戻りますが、主に、単体テストで用いられるホワイトボックステストは、カバレッジ基準に応じて、必要なテストケースを全て実行することが求められるため、人が手作業でテストを行うと、膨大な工数がかかります。

また、数が多くなるほど、テストケースの抜け漏れといったミスや、最終的に求められるカバレッジ基準と網羅率を満たせなかったということも発生しがちです。

そのため、もし、まだ単体テストを手動で行っているのなら、世の中の流れに乗って、ソフトウェアによる自動化を行うのがおすすめです。

組込ソフトウェア用テストプラットフォームであるVectorCAST(ベクターキャスト)は、ソフトウェア開発のライフサイクル全体にわたってテスト作業を自動化する製品ファミリーです。
VectorCASTは世界中の企業に選ばれている単体テスト自動化ツールで、自動車・航空・医療など、極めて高いソフトウェア品質を要求される分野においても数十年に渡ってソフトウェア開発を支えてきた実績が豊富にあります。

VectorCAST詳細

関連トピック

ソフトウェア開発のライフサイクルを通してテスト作業を自動化

VectorCASTはC言語、C++に対応した組込の単体テストを自動化するための単体テストツールです。

詳細はこちら
導入事例|VectorCAST(日本精機株式会社)

フルグラフィッククラスター制御の単体テストにVectorCASTを採用

詳細はこちら
ホワイトペーパー|組込ソフトウェア開発を効率化する変更ベーステスト

VectorCASTのホワイトペーパー「組込ソフトウェア開発を効率化する変更ベーステスト」をダウンロードいただけます。

詳細はこちら
ホワイトペーパー|医療機器のテスト

世界的な医療機器/医療用品メーカーのお客様との間で先日完了したサービス案件について詳しく説明します。

詳細はこちら
ホワイトペーパー|バグの修正および防止コストの定量化

このホワイトペーパーでは、テストの効率向上に使用できる手法を取り上げます。

詳細はこちら