ホワイトボックステストとは?内部構造を理解した上でコードの品質を検証するテスト手法

システム開発・テクノロジー
ホワイトボックステストとは?ざっくりと3行で
  • ソフトウェアの内部構造(コード・アルゴリズム・制御フロー)を把握した上で、コードのパスやブランチが正しく動作するかを検証するテスト手法のこと。「グラスボックステスト」「構造ベーステスト」とも呼ばれる
  • 内部コードを見て「どのパスを通っているか・どの条件分岐をテストしていないか」を確認できるためコードカバレッジ(テストがコードのどの割合を実行したか)の測定と向上に不可欠なテスト手法
  • 対になる概念がブラックボックステスト(仕様書ベースで内部構造を見ないテスト)で、単体テスト・コードレビュー・静的解析と組み合わせることでソフトウェアの品質を多角的に検証できる

【深掘り】これだけ知ってればOK!

ホワイトボックステストの代表的な技法を整理しよう。命令網羅(C0カバレッジ):全ての命令(ステートメント)を少なくとも1回実行するテスト。分岐網羅(C1カバレッジ):全てのif/else・条件分岐のTrue/Falseを少なくとも1回実行するテスト。条件網羅(C2カバレッジ):複合条件の全ての真偽の組み合わせをテストする。パス網羅:全ての実行パスをテストする(組み合わせ爆発のため実用的ではない場合が多い)。

コードカバレッジの測定ツールを理解しよう。JavaScript/TypeScript:Jest(–coverage オプション)・Istanbul/NYC。Python:pytest-cov・coverage.py。Java:JaCoCo・Cobertura。Go:go test -cover。これらのツールはどのコード行・ブランチが実行されたかをHTML・XML・テキスト形式のレポートで可視化する。CIに組み込んでカバレッジが基準値以下になったらビルドを失敗させる設定が一般的だ。

ホワイトボックステストとブラックボックステストの使い分けを整理しよう。ホワイトボックステスト:単体テスト・コードの内部ロジック・エッジケースの網羅に向く。開発者が実施することが多い。ブラックボックステスト:システムテスト・受け入れテスト・仕様に対する動作検証に向く。QAエンジニアや非エンジニアが実施することもある。高品質なソフトウェアの開発では両者を組み合わせる。

コードカバレッジの数値の解釈に注意しよう。「カバレッジ100%=バグがない」ではない。全てのコードが実行されているからといってロジックが正しいとは限らない。例えば`return a + b`のテストでa=1, b=2を渡してreturn 3を確認しても、a=0やb=負数のエッジケースは別途検討が必要だ。カバレッジは「テストが足りていないコードを見つける」ツールであり「十分なテストをした証拠」ではない。

ホワイトボックステストの実践として「突然変異テスト(Mutation Testing)」という高度な手法もある。コードに意図的に小さな変更(突然変異)を加えてテストが失敗するかを確認する手法だ。テストが失敗しない(突然変異が生き残る)場合はテストの品質が低いことを示す。PythonではMutmut・JavaではPITが代表的なツールだ。

よくある誤解

ホワイトボックステストはブラックボックステストより優れていると思っている

どちらが優れているということはなく、それぞれ異なる目的と強みがある。ホワイトボックスはコードの内部ロジック検証に、ブラックボックスは仕様通りに動くかの検証に向く。両者を組み合わせることで多角的な品質保証が実現できる。

コードカバレッジ100%を達成すれば品質は十分だと思っている

コードカバレッジは「テストが実行しているコードの割合」を示すが「テストの内容が適切かどうか」は示さない。assertionがなく常にパスするテストでもカバレッジは上がる。カバレッジの数値と合わせてテストの内容の品質も確認することが重要だ。

会話での使われ方

ITKAGYO運営者デプロイ太郎のアイコン画像

このモジュール、分岐カバレッジが60%しかないです。else側の処理がテストされていません。テストケースを追加してください。

コードレビューでホワイトボックステストのカバレッジ不足を指摘している場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

CIにJestのカバレッジチェックを組み込みました。C1カバレッジが80%未満だとビルドが失敗するように設定しています。

エンジニアがCI/CDにホワイトボックステストのカバレッジ基準を組み込んだ設定を報告している場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

このifの条件、booleanが3つ組み合わさっているので条件網羅だと8通りのテストが必要です。まず分岐網羅から始めましょう。

テスト設計者が複合条件のテスト戦略を説明している場面。

【まとめ】3つのポイント

  • コードの内部構造を理解した上でパス・ブランチを網羅するテスト手法:どのコードパスが実行されているかを確認できるホワイトボックステストはコードカバレッジの測定と向上・単体テストの品質確保に不可欠だ
  • C0(命令)・C1(分岐)・C2(条件)のカバレッジ指標でテストの充実度を測る:命令網羅→分岐網羅→条件網羅と段階的にカバレッジ基準を上げることでテストが検出できるバグの種類と量が増えていく
  • ブラックボックステストと組み合わせてコードと仕様の両面から品質を担保:ホワイトボックスでコードの内部ロジックを検証しブラックボックスで仕様通りの動作を確認するという両者の組み合わせが高品質なソフトウェア開発の標準的なアプローチだ

よくある質問

Q
C0・C1・C2カバレッジの違いを教えてください。
A

C0(命令網羅)は全てのコード行を少なくとも1回実行するカバレッジです。C1(分岐網羅)は全てのif/elseの両方の分岐を実行するカバレッジです。C2(条件網羅)は複合条件の全ての真偽の組み合わせをテストするカバレッジです。

Q
Jestでコードカバレッジを測定するにはどうすればいいですか?
A

package.jsonのscriptsに`”test:coverage”: “jest –coverage”`を追加して実行します。`coverageThreshold`オプションで最低カバレッジ基準を設定することでCI時に基準を下回るとビルドを失敗させられます。

Q
コードカバレッジの目標値はどのくらいが適切ですか?
A

業界の一般的な目安としてC1カバレッジ80%以上が推奨されることが多いです。ただし100%を義務化するとテストの品質より数値を達成するためのテストが増えるリスクがあります。重要なビジネスロジックに集中して高いカバレッジを目指すことが現実的です。

Q
ホワイトボックステストは誰が実施すべきですか?
A

コードの内部構造を理解している開発者(自己テスト)や専門のテストエンジニアが実施します。コードレビューと組み合わせてペアで実施することもあります。

【出典】参考URL

https://jestjs.io/docs/configuration#collectcoverage-boolean :JestのコードカバレッジオプションのドキュメントWeb
https://coverage.readthedocs.io/en/latest/ :Pythonのcoverage.pyの公式ドキュメント
https://jstqb.jp/syllabus.html :JSTQB「ソフトウェアテスト標準用語集」

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!
タイトルとURLをコピーしました