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

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

今度はCFD法に手を出してみる - その2

 4月4日(土)は、第4回「ソフトウェアテスト技法ドリル」勉強会@虎ノ門。今回の勉強会も、2時間半の中で気付きがたくさんありました。主催してくださった加瀬さん、オブザーバーの秋山さん・鈴木さん、発表者・参加者のみなさんに、感謝です。

atnd.org

 コチラは、Togetterのまとめ。

togetter.com 以下は、加瀬さんによるブログ記事。

softest.cocolog-nifty.com

 さて、この勉強会の宿題を「その1」で解いてみました。

www.kzsuzuki.com 勉強会にてCFDと宿題の解説をしてくださった太田さんの解説資料がコチラに事前にアップされており、その解答と比較してみて、本質的には同じ解答だ、よっしゃああ!というのがその1の結論。

 が、勉強会での議論を通して、それが間違っていたことが判明。やはりわたしの場合、独学・座学で進めるレベルじゃないようです。

宿題の答え合わせ(不正解)

 わたしの最初の解答はコレ。「図A」と呼びます*1

2-1_3ce88fcb

 太田さんの説明資料のCFD(を勝手に書きなおしたもの)がコレ。「図B」と呼びます。

2-2_675a4a95

 この図Aと図Bでは、同値図(流れ線で結ばれるノードのこと)の個数が違いますが、OR条件を並列で表現するか直列で表現するかだけの違いだろうと考えていました。また、『ドリル』の自販機問題でも、Suica・Pasmo・Edyが図Aのように1つの同値図の中に描かれていたことから、OR条件は図Aっぽく書いた方が見通しがよいとも思っていたくらいです。
 が、図Aには問題点があるのでした。
 それは、「所属する国会議員5人以上」と「国政選挙で2%以上の得票」は排他的な命題ではないということ。勉強会では「5人以上か否か」「国政選挙で2%以上か否か」が「直交する」条件だと表現されていました。
 図Aの「議員・選挙の要件」の中で箱が重なっていないと、それは暗黙のうちに「2つの箱は排他である」ことを意味してしまう。自販機問題では、Suica・Pasmo・Edy、そして「それ以外」は、「どのカードか」という1つの条件に対するMECEな命題なので、図Aっぽい書き方でよいのですね。
 言い換えると、名前の通り、同値図の箱の中は同値分割になっていなければならないということ。これはベン図で表現することも可能です。ベン図で箱と箱が重なった箇所からも、流れ線を引く必要があります。

同値図の順番

 CFDの難しい点は、実装された処理の流れに即して描かないと、必要なテストケースが漏れるリスクがあるということです。
 まずは、「中身を知らない場合は、『多くの人がこういう判断をするであろう』という流れや、仕様の書き方などで決める」とのこと。ただ、性能や処理効率にこだわるプログラマーだと、仕様書から読み取れる処理の順番通りに作らないことも考えられる。太田さんのお話では、最初の仕様書、次の詳細設計書、実際のプログラミングで処理の流れが異なっていたことがあったと・・・きっとテストチームがCFDを作ると、また違うものになるかも知れない、ということでした。
 実装をどこまで把握したうえでCFDを描くのか、あるいは割り切るのかが、ポイントの1つですね。

有効結果と無効結果

 CFDには「有効」「無効」という概念があると習いました。まだきちんと理解できていませんが、暫定的には次のように解釈しています。
 たとえば、Webサイトのログイン処理において、
  • 有効結果:ログインOKになり、ユーザ用の画面に遷移するなどの処理が続く。
  • 無効結果:ログインNGになり、処理は終わる。
 このように、次につながっていくようなものを有効結果、次につながらず、処理が終わったり、エラーになったりするようなものを無効結果、だと考えています。今は((秋山さんと加瀬さんにアドバイスいただきました。ありがとうございます。秋山さんのtweetによると、「無効系の結果に至るパスについては、組み合わせを考えずに1本だけテストすると割り切って考える」(こともできる)にとのことです。(2011/4/5追記)))。
 CFDでは、各同値図の、有効結果につながる箱の組み合わせを手厚くするかわりに、無効結果につながる箱への組み合わせはざっくり落としていくとのこと。なので、ある結果を有効結果と見なすか無効結果と見なすかの判断で迷ったときには、とりあえず有効に倒しておくのがいいと習いました。
 また、有効系のハコであっても、下のように流れ線を束ねることで、同値クラスをまとめることができるようです。PictMasterのパイプのような意味になるのかな。

2-3_6df3406f

 この例では、「SuicaとPasmoとEdyはまあよく流通しているけど、キタカぁ~?」ってことで差別的に扱っています。これによって、KitacaはSuicaたちより多くテストされることでしょう。

勉強会の感想

 CFDは見た目がわかりやすいことから、処理順さえわかっていれば簡単に描ける、シンプルな技法だと思っていました。が、今回の勉強会を通じて、有効系・無効系の概念とテストケースへの影響、同値図の中の同値分割の考え方など、深い深い闇の世界が広がっていることがよくわかりました。参加者のみなさんの勉強会後tweetを見ても、理解のレベルが違っている・・。
 勉強会に参加するたび、自分の浅さを痛感しますが、その惨めな気分を維持するため、今後も勉強会に参加し、かつブログに恥をさらしていこうと思っております・・・。
 
 その3はコチラ。

www.kzsuzuki.com

*1:前回のエントリでは、結果の表現の仕方がルールに従っていなかったので、ここで修正しています。