データフローテストとは?その目的やプロセス、ポイントを徹底解説!

ソフトウェアテストには様々な技法が存在しますが、その中でもプログラムの内部構造に基づいてテストを行うホワイトボックステストの一つに「データフローテスト」があります。

プログラムの実行される順序(制御フロー)を追うだけでなく、プログラム内でデータがどのように扱われるかに焦点を当てることで、制御フローテストだけでは見つけにくい特定の問題を発見するために有効な手法です。

ここでは、データフローテストの目的やプロセス、ポイントについて徹底解説します。

▼テストの種類について詳しい内容はこちら▼

データフローテストとは?

データフローテストは、プログラムの実行経路(制御フロー)だけでなく、プログラム内部で扱われる変数などの「データ」が、生成されてから消滅するまでの流れ(データフロー)に着目するホワイトボックステスト技法です。

具体的には、変数などのデータがプログラム中で「定義」され、その値が「使用」され、そして不要になって「消滅」する、という一連のライフサイクルを追跡します。

「定義」とは、変数に値が代入されたり、初期化されたり、あるいは関数への入力として渡されたりする箇所を指します。

「使用」とは、その変数の値が計算式や条件分岐で参照されたり、関数の引数として渡されたり、出力として使われたりする箇所です。

「消滅」は、変数がスコープ外に出たり、明示的に解放されたりする箇所と考えられます。

データフローテストでは、特にこの「定義」された箇所と「使用」される箇所の組み合わせ(これを「DUペア:Define-Use Pair」と呼びます)をプログラムのソースコードから識別します。

そして、特定されたDUペアを経由するようなプログラムの実行経路(テストパス)を設計し、その経路を通過させるようなテストデータを作成してテストケースとします。

分岐網羅(C1カバレッジ)などの制御フローテストは、プログラムの命令や分岐の網羅性に焦点を当てますが、データフローテストはそれらを補完し、データの整合性や妥当性という観点からプログラムの振る舞いをより深く検証するためのアプローチと言えます。

データフローテストの目的

データフローテストを実施する主な目的は、プログラムの制御フローだけを検証していては発見が難しい、データに関連する特定の種類の不具合、すなわち「データフローアノマリー(異常)」を効果的に検出することにあります。

制御フローテスト(例えば分岐網羅)は、プログラムの各分岐が少なくとも一回は実行されることを保証しますが、その際に使われるデータの値が適切であるか、あるいはそのデータが予期せぬ状態になっていないかまでは十分に検証できません。

データフローテストは、この制御フローテストの弱点を補完する役割を果たします。

発見できる不具合の例

具体的にデータフローテストによって発見が期待できる不具合の例としては、以下のようなものが挙げられます。

・変数が値を持つ前に(定義される前に)参照されてしまう「未定義参照」

・変数に値がセットされた(定義された)にも関わらず、一度も参照される(使用される)ことなく、再度新しい値がセットされてしまう「定義の無駄」

・変数が定義された後、一度も使用されないままプログラムの実行が終了してしまう、あるいはスコープ外に出てしまう「未使用の定義」

・変数が初期化される前に、その値を参照してしまう「初期化漏れ」

データフローテストを通じて、このようなデータ処理に関する潜在的な欠陥を体系的に洗い出し、修正することで、ソフトウェア全体の品質と信頼性をより高いレベルに引き上げることが、このテスト技法の重要な目的です。

データフローテストのプロセス

データフローテストを効果的に実施するためには、体系立てられたプロセスに従って進めることが重要です。

データフローグラフの作成

まず、テスト対象プログラムを分析し、「データフローグラフ」を作成します。

これはプログラムの処理の流れを示す制御フローグラフに、各処理ブロック(ノード)での変数の定義と使用情報を追記したもので、データの流れを視覚化します。

このグラフを作成することで、どの変数がどこで定義され、どこで使われ、どのように影響を与え合っているかを明確に把握できます。

DUペアをすべて洗い出す

次に、このグラフから、あるノードで定義された変数が後続のどのノードで使用されているかの組み合わせ、「DUペア(Define-Use Pair)」をすべて洗い出します。

これがテストで確認すべきデータの流れの基本単位です。

例えば、「変数XがA地点で定義され、B地点で使用される」という関係性をリストアップしていきます。

テスト基準の設定

続いて、どの程度の網羅性を目指すかという「テスト基準」を設定します。

データフローテストにはいくつかの網羅基準があり、代表的な基準には「all-defs(全ての定義箇所から到達可能な使用箇所を少なくとも1つは通る)」や「all-uses(全てのDUペアを最低1回は通る)」、「all-du-paths(全てのDUペアを経由する単純なパスを網羅する)」などがあります。

プロジェクトのリスクの高さやテストにかけられる工数などを考慮し、適切な基準を選びます。

テストパスの選定

そして、選択したテスト基準を満たすように、データフローグラフ上の具体的な実行経路である「テストパス」を選定します。

例えば、all-uses基準であれば、全てのDUペアをカバーできるようなテストパスの組み合わせを見つけ出します。

テストケースの作成とテスト実行

最後に、選定した各テストパスを実際に通過させるための入力データや事前条件などを具体的に定めた「テストケース」を作成します。

そしてこの一連のプロセスを経て設計されたテストを実行し、期待通りの結果となるか、またデータフローアノマリー(未定義参照、未使用定義など)が検出されないかを確認することで、データ観点でのプログラム品質を検証します。

データフローテスト成功のためのポイント

データフローテストはデータ関連の不具合検出に有効な技法ですが、その効果を最大限に引き出し、効率的に実施するためにはいくつかのポイントがあります。

優先順位、テスト範囲を決める

まず、全てのデータフローを網羅しようとすると、特に大規模なプログラムではテストケース数が膨大になり、現実的な工数内に収まらない可能性があります。

そのため、テスト対象を重要度の高い変数や、処理が複雑でリスクが高いと判断される箇所に絞り込む、あるいは比較的緩やかなテスト基準から適用を始めるなど、優先順位付けとテスト範囲の検討が重要になります。

例えば、外部からの入力データや、重要な計算処理、状態遷移に関わる変数などに注目すると効果的です。

静的解析ツールやテストツールを活用する

データフローグラフの作成やDUペア(定義と使用のペア)の特定、テストパスの候補抽出といった一連の分析作業は、手作業で行うと時間と手間がかかり、ミスも発生しやすくなります。

そのため、これらの作業を支援してくれる静的解析ツールや、データフローテストに対応したテストツールの活用を検討すると、効率と精度を大幅に向上させることができます。

ただし、ツールはあくまで補助的な手段であり、ツールの出力結果を鵜呑みにせず、その妥当性を理解した上で最終的なテスト設計や判断はテストエンジニア自身が行う必要があります。

制御フローテストを並行する

また、データフローテストは、命令網羅や分岐網羅といった制御フローテストを置き換える万能薬ではありません。

それぞれが検出を得意とする不具合の種類が異なるため、データフローテストは制御フローテストを補完する位置づけにあると理解することが重要です。

プロジェクトの特性や品質目標に応じて、両方の観点をバランス良く取り入れることで、より多角的な品質検証が可能となります。

テストに関する学習やトレーニングをおこなう

データフローの分析やテストパスの設計は、制御フローに比べて複雑になりがちです。そのため、技法に対する十分な理解を深めるための学習やトレーニングとともに、可能であれば設計内容について経験豊富なエンジニアによるレビューを受けることも、テスト設計の品質を高め、潜在的な見落としを防ぐ上で有効な手段と言えるでしょう。

まとめ

今回はデータフローテストについて、その基本的な概念、実施する目的、具体的なプロセス、そして成功させるためのポイントを解説しました。

データフローテストは、プログラム内のデータの流れ(定義と使用の関係)に着目することで、制御フローテストだけでは見つけにくいデータ関連の不具合(データフローアノマリー)を検出するのに有効な手法です。

未定義参照や未使用定義といった潜在的な問題を明らかにすることが主な目的であり、そのためにはデータフローグラフの作成からDUペア特定、テスト基準の選択、テストパス選定、テストケース作成という体系的なプロセスを踏むことが重要となります。

また、データフローテストを成功させるためには、現実的な工数で最大の効果を得るためのテスト範囲の適切な絞り込み、分析作業を効率化するためのツールの効果的な活用、他のテスト技法(特に制御フローテスト)とのバランスの取れた組み合わせ、そして技法自体への深い理解がポイントとなります。

データフローテストを理解し、プロジェクトの特性に合わせて適切に活用することで、ソフトウェアの品質と信頼性をさらに高めることができるでしょう!

QA業務効率化ならPractiTest

テスト管理の効率化についてお悩みではありませんか?そんなときはテスト資産の一元管理をすることで工数を20%削減できる総合テスト管理ツール「PractiTest」がおすすめです!

PractiTest(プラクティテスト)に関する
お問い合わせ

トライアルアカウントお申し込みや、製品デモの依頼、
機能についての問い合わせなどお気軽にお問い合わせください。

この記事の監修

Dr.T。テストエンジニア。
PractiTestエバンジェリスト。
大学卒業後、外車純正Navi開発のテストエンジニアとしてキャリアをスタート。DTVチューナ開発会社、第三者検証会社等、数々のプロダクトの検証業務に従事。
2017年株式会社モンテカンポへ入社し、マネージメント業務の傍ら、自らもテストエンジニアとしテストコンサルやPractiTestの導入サポートなどを担当している。

記事制作:川上サトシ