
【ソフトウェアテスト】CFD法
CFD法はCause Flow Diagram(原因流れ図)を略したもので、原因の集合と結果をそれぞれの関係のつながりにフォーカスして図式化し、そこからデシジョンテーブルを想定してテストケースを作成する技法です。
システム設計において、正常な動作の仕様を基本として異常系の仕様もエラー動作実装のため明確に定義されているべきですが、テスト実施の際には、仕様想定上の正常系・異常系動作確認はもとより、考え得る限りの準正常系テストケース網羅も必要です。
そうしたケースの考慮が足りていないと、リリース後にユーザーが想定外の操作を実行して重篤な不具合につながったり、あるいは仕様の穴を付いた不正処理などを実行されたりして、プロジェクトやサービスに損失が発生したりします。
原因・結果・各関係を図示して明確に関係を洗い出すことで、実装段階では考慮が漏れているような挙動についても抜けや漏れをカバーするようにテストすることができます。
また、エラーに関するもののみではなく、同値分割が可能な原因が複数関連して複数の結果が想定されるというシステムで、その関係性を図にして流れを見ることで、テストケース作成がグラフィカルに把握しやすくなります。
インターネットでクレジットカードを利用して決済処理を実行する際に、完了までには以下の様な結果パターンが想定されます。
・カード情報入力エラー(入力したカード利用情報に問題がある)
・決済処理不能エラー(登録しているカード情報の照会時にエラーが発生)
・通信不良による接続タイムアウトエラー(決済実行から完了までの通信時間が規定の時間内に処理されないことによるエラー)
・決済完了
上記4パターンの結果を返すまでの原因は、細部まで書き出すと煩雑になります。
・複数の入力フォームに入力した情報のどこがエラーになったか
・カード情報照会時にどのような理由でエラーになったか
・どのページからどのページに遷移するときにエラーになったか
・何秒以上の通信待機時間を過ぎたら通信エラーで処理するか
等
これらを一つの枠に収めてそれぞれを線でつなぐことで関係性を整理できるのが、このCFD法の利点だと思います。
1. システム要件の一例

非接触型カードリーダーによる自動販売機での決済処理システムでの、決済時の処理仕様について定義します。
1-1. NFC決済処理の仕様
2.商品選択後に使用する電子マネー選択ボタンを押すと、接触待機状態に入る
3.商品選択後の決済サービス選択状態でおつり返却ボタンを押すと商品選択をキャンセルする
4.接触待機状態で正常に処理が実行されると残高から商品購入分の金額を差し引いて電子マネー選択前状態に戻る
5.取り扱い対象の電子マネーは以下の種類
◆おサイフケータイ
・携帯キャリア[a][b]社のキャリア決済の電子マネー
・交通系IC[c][d]
・E社の電子マネーチャージ式カード[e]
・F社の電子マネーチャージ式カード[f]
◆NFC対応カード
・E社の電子マネーチャージ式カード[e]
・F社の電子マネーチャージ式カード[f]
・G銀行のデビットカード[g]
・H銀行のデビットカード[h]
◆エラー処理パターンは以下の通り
・接触エラー(各決済方法利用時に、選択した決済方法で2秒以上通信接続を試行して通信できなかった場合)
・残高エラー(各決済方法利用時に所持金額が購入予定商品金額に満たなかった場合)
2. 原因流れ図

上記の仕様をCFD法の原因流れ図に配置していきます。
原因の1つめは購入選択処理についてです。
購入商品選択フローとして商品を選択した後は接触待機状態に移行するため、以下のようになります。
・[購入商品を選択]を正常系、
・商品購入を実行できないパターンとして[商品売り切れ]を異常系
原因の2つめは決済サービス選択です。
仮の名称で記載していますが、上記仕様ではa~hの全8パターンの決済サービスが想定されているので、以下のようになります。
・それぞれの決済サービス各パターンを正常系
・決済待機状態から次のフローに移行しないパターンとして[おつりボタン]を異常系
原因3つめは接触確認フローとして、通信エラーであろうと選択したサービスと違う決済方法を認証させようとした場合であろうと以下のようになります。
・接触が確認できた場合が正常系
・一定時間内に接触が確認できなかった場合を異常系
原因4つめは残高確認フローとして以下のようになります。
・接触確認したうえで残高にも問題がなければ購入可能となる動作を正常系
・残高不足で購入不能だった場合を異常系
上記各原因に対して、以下のようにそれぞれの原因と結果をつなぐパスを設けます。
・全て正常だった場合の結果を[購入完了]
・各原因から異常系として処理された遷移を[購入不可]
2-1. 原因流れ図

原因流れ図の構成として、
・有効同値は四角い囲みの中でさらに四角い枠で囲まれているもの
・無効同値は補集合として四角の中で囲みの付いていない領域
として記載しており、有効同値・無効同値それぞれその後の遷移先を、以下のように各原因と矢印でつないでいます。
・白い丸の結果欄は正常系として想定されている動作結果
・黒い丸の結果欄は異常系として想定されている動作結果
また前述のとおり、作成した原因流れ図からデシジョンテーブルを作成することでチェックリスト形式として落とし込むことができるので、上記の原因流れ図からデシジョンテーブルを作成したものが以下です。
◆原因流れ図から作成したデシジョンテーブル

3. ズームアウト
有効同値内で細かく項目が分かれているものを別のテストケースとしてテストし、本来の原因流れ図には上記の先行テストケースでの同値を一つにまとめて簡潔にする[ズームアウト]を行うことで、テストの粒度を落とさずケースを簡略化する方法があります。
今回のケースでは、決済サービス選択フロー内に各決済方法を全て記載していますが、これは有効な決済方法の確認として別のテストケースに分割することで簡略化を行います。
・決済サービス選択のみ切り分けたテストケース

各決済方法を選択して商品を購入可能か否かにフォーカスして、別の原因流れ図に切り離しました。
8パターンの決済サービス以外では購入不可として、デシジョンテーブルも別途作成します。
・決済サービス選択のみ切り分けたデシジョンテーブル

3-1. 原因流れ図の再作成
◆ズームアウト後の原因流れ図

有効同値と無効同値がそれぞれ1つになり、以下の流れが整理されました。
・全ての有効同値を経由した場合のみが購入可能
・それ以外の場合は購入不可になる
上記の原因流れ図からデシジョンテーブルを作成します。
◆ズームアウト後のデシジョンテーブル

ズームアウト前に12項目あったデシジョンテーブルを5項目まで簡略化できました。
4. 追記
あまりに複雑なシステム要件の場合は、一度に原因流れ図へ落とし込んでしまうと余計に複雑な図になってしまって逆に分かりにくくなる懸念があります。
そうした場合はまず別々のテストケースとして細分化したうえで原因流れ図に落とし込み、そこからズームアウト・ズームインでさらに整理するといった感じで段階を踏んで整理統合を進めると、大小さまざまな要件に対応して当該テスト技法が活用できるのではないかと思います。
今回用意した要件も、いったん原因流れ図に落とし込んでみると決済サービス選択の枠のみが大きいというのが視覚的に明らかだったので、ズームアウト対象をしぼりこみやすかった印象があります。