ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

CFDの補習会でさらなる学びを得た(つもり) - その1

 第4回まで開催された「ソフトウェア技法ドリル勉強会」。
 5月22日には、第4回のテーマであったCFD(Cause Flow Diagram、原因流れ図)法の「補習会」が開催されました。

atnd.org

 いつものとおり、Niftyの加瀬正樹さんが開催まとめ、および会場を提供くださり、アドバイザーとして秋山浩一さんと鈴木三紀夫さんが参加くださいました。いつもありがとうございます。@nifty エンジニアサポートにも感謝!(宣伝)
 今回は「わからんところを、少人数で質問しまくる」というコンセプトで行われました。この得難い機会で得た(気でいる)ことを、これから全36回・3年間に渡って連載していきます。

CFD法の「バージョン」と表現形式

 「技法」というと、何かすでに完成されたものを思い浮かべがちですが、CFD法は未だに発展し続けています。秋山さんによると、(提唱者である松尾谷氏に)聞くたびに進化しているとのこと。補習会でも「CFDの2007年版」「2010年版」などといった表現が飛び交い、鈴木さんによると「松尾谷さんにいつ習ったかによって、考え方が違う」と・・・。
 『ドリル』drawCFDでは、これまでのエントリにあるような表現をしていますが、たとえばCFD法が発表された当初、1989年の論文では、下のような図が載っています。

4-1_9f8dd058

 四角が原因、丸四角が結果ですが、もう完全に違う。
 『ドリル』に
『ソフトウェアテスト技法ドリル』 P.78
原因を集合で表現することで明示的に補集合についてテストの視点が届く
とありますが、それは進化の過程で得た特徴だったのですね*1

同値図におけるVenn図

 2004年版においては、集合同士が重なるVenn図を使用を許していたようですが、現行安定バージョンでは使用していないとのこと。重なる部分を新しい集合として切り出して、重ならないようにします。
 たとえばAとBという集合があり、A∧Bが空集合でないのであれば、A∧BをCと定義しなおし、AとBの残った部分、A∧¬Bと¬A∧Bを、それぞれD・Eとして、さらに¬Aかつ¬BもFと呼ぶことにすれば、C・D・E・FはMECEになります。これを「完全同値分割」というようです。こうすれば、C・D・Eは、同値図の中で孤立した絵として描くことができますね。

結果の書き方

 実際の設計書からCFDを作ってみて考えたことの1つに、「原因だけでなく、結果も同値図を描いた方が見通しがよくなるのでは?」という疑問があります。
 イメージとしては、以下のようなもの。全然正しいCFDではないので、そのつもりでごらんください。久しぶりにExcelで書くと、drawCFDのありがたみが身に染みるぜ。

4-2_a26256a8

 丸四角が結果です。
 赤の矢印をたどると、ログインID・パスワードが正しく、IDはアドミン以外のもので、前回ログイン記録がある、という「原因」から、「ログインは成功」「表示画面は一般用」「前回ログイン時刻は表示」という3つの「結果」に流れています。
 つまり、「ログイン成功か否か」と、「どの画面に遷移するか」と、「前回ログイン時刻を表示するか否か」という、軸の違う「結果」を、別の島にまとめて表現しちゃいかんのかなってことです。これによって、原因だけでなく結果も同値分割することになり、設計漏れにも気付きやすいのかなと・・・。
 逆にそうしないとこの場合、「ログイン成功で一般用の画面でログイン時刻は表示」というようなわかりづらい結果ノードが、単純には2^3出てきてしまうことになります*2
 また、補習会の後半で話題になった状態変数の扱い(後述)については、プログラムの内部でもっている「状態」と、外部に見えるような「結果」を、それぞれ表現する必要があるとのことでした。
 といった背景から結果の書き方を伺ったところ、最新版では、結果ノードも同値図を使って描くことになっているそう。ぜひ、その最新版のCFDを見てみたいものです。
 ともあれ、上のように結果の書き方をアレンジしたとしても、決定表を導く手順が大きく変わるわけではないので、個人的にはこのやり方で少し実践してみたいと考えています。
 
 「その1」はコチラです。

www.kzsuzuki.com

*1:このCFDでは、△で囲むことでループが表現されている。最新版でも、CFD内でループを表現することはあるんだろうか。

*2:ただしこのケースでは、画面遷移先と前回ログイン時間表示はあまり関係がないと見なされるので、そもそも独立してテストすべきものかも知れません。が、まあ例ということで・・・。