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

ソフトウェアの品質、テストなどについて学んだことを記録するブログです。旧ブログからゆっくり移行中です。http://blog.livedoor.jp/prjmng/

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

 CFD法補習会のログ第2回。「その1」はコチラです。

www.kzsuzuki.com

 会の最初のトピックであった、「仕様からどのようにCFDを描くか」という問題について書きます。

集合が重なりあうとき

 まずは簡単な演習として、次の例題を、みんなでCFDにしてみました。
例題1
  1. 5歳までは幼児料金
  2. 6歳で小学生でない人は幼児料金
  3. 6歳で小学生は子供料金

わたしの答え

 7歳以上のことはおいておくとして、仕様からわかるのは、「小学生なら有無を言わさず子供料金」「小学生でなければ、6歳以上か5歳以下かを判定せい」となりそうだということ。よって、次のようなCFDを描きました。

5-1_8e027d55

 よく見たら小学生でなければ6歳だろうと5歳以下だろうと幼児料金。なので、最初の原因ノードだけあればよさそうです。
 逆に、年齢から先に判定するのであれば、以下のCFDになります。

5-2_65e407a1

 とにかく、年齢の話と小学生か否かの話をごちゃまぜにした同値図を描くのがイヤで、同値図を分けています。が、2つ答えが出ている時点で、もう間違い。

秋山さんの答え

 CFDを描く際の原則は、「まず仕様に従って描く」ことなのだそうです。どっちを先に評価するのかわからないのだから、勝手に同値図を分けてはいけない。わからないところがあるなら、実装している人に聞いて判断するというのが正しい使い方になります。
 ということを前提に描かれた、秋山さんのCFDは以下。

5-3_33e553a2

 ここでは7歳以上や年齢不詳の人も含めて同値分割されています。同値図の中の上の3つの箱は、「0~6歳」と「小学生か否か」の和集合が完全同値分割されていますね。

集合の境界があいまいなとき

 続いて、次の例題は以下。
例題2
ユーザは、24時間表現(「13:17」など)で時間を入力する。
12時以前が入力されたら「午前」。12時以降が入力されたら「午後」を表示する。
 もちろん、ツッコミどころのある問題であることは明白。
 わたしの答えは以下です。完全同値分割をしています。

5-4_dcb0a29f

 12:00は「12時以前」と「12時以後」の両方の条件を満たすので、「午前午後」としておきました。
 これは「午後午前」かも知れないし、いずれにせよ、設計者に仕様を確認する必要があります。12:00が怪しいのであれば、0:00や24:00も怪しいですね。同値分割した各箱の中から具体的なテストケースを作る際にはやはり、境界値を狙っていくのが妥当でしょう。

仕様に素直に、という描き方

 実際の設計ドキュメントを見て、CFDの練習をしてみました。
 ネタは、ログインに関する以下のような仕様です*1
以下の場合、ログイン成功とする。それ以外の場合はログイン失敗として、エラーメッセージを出力する。
(1)IDとパスワードの組み合わせが正しい
(2)当該IDが有効期限内である
(3)当該IDが使用禁止になっていない
 条件が3つあります。この順番に評価すると考えると、同値図は3つになります。
 一方、このドキュメントより少し実装寄りに書かれた、次の工程のドキュメントを読むと、こんな感じのことが書かれていました。
(1)ID(PK)=入力されたID
(2)パスワード=入力されたパスワード
(3)有効期限≧本日
(4)使用禁止フラグ=OFF
という条件でデータベースを検索し、ヒットしたらログイン成功。
 こうなると、3つの同値図という描き方は間違っていて、(1)∧(2)∧(3)∧(4)か、それ以外という、1つの同値図になります。同値図が1つなら、もはやCFDで描く必要すらないでしょう。
 このように、実装でどういう判定をしていくのかを意識しないと、無意味なテストケースを量産しかねないということですね。

*1:以下、ものすごく簡略化しているので「仕様がおかしい」などの嘲笑はわたしのいないところでお願いします。