クラシフィケーションツリー法の自由さを活用する
アドベントカレンダー
本記事はソフトウェアテストの小ネタ Advent Calendar 2018 24日目の記事になります。
前日は とろさんの記事でした。沼ダイブ、自分ももっと頑張りたいです。
ご挨拶
ご無沙汰しております。 クリスマス前日、皆様はいかがお過ごしでしょうか?
どうも、こたつで猫を抱えながら細々と記事を書いているhalspring(@halspring_qa)です。 昨日中古で買ったモンハンワールドに時間を溶かされています。
12月はWebQA、AI4SE、wacateと盛り沢山でした。 去年のこの時期、暗い顔しながら卒論を書いていたとは思えません、今はとても楽しいです。
語りたいこと
今回、クラシフィケーションツリー法について書いてみたいと思います。
はじめにお断りとして、高々テスト歴半年程度で書いておりますので、技法や用語、考え方等に誤りがある可能性がございます。 どうか温かい目で見て頂ければと思います。ご指摘等もお待ちしております。
クラシフィケーションツリー法に関して前知識を準備しておきたい方は井芹さんのこちらの資料をどうぞ。
それでは、クリスマスツリーの代わりにクラシフィケーションツリーを眺めながら一緒に愉快なクリスマスイブを過ごしましょう。
クラシフィケーションツリー法
クラシフィケーションツリー法はテスト対象が持つ要素を木構造でモデリングするテスト設計技法です。 今回はクラシフィケーションツリー法を用いてテストケースを作っていく際に、クラシフィケーションツリー法の利点をどう活かすかを書いていきます。
文章のいいところは、何度クラシフィケーションツリーと言っても噛むことがないところですね。つい必要以上に何度でも繰り返しちゃいます。
直交表との違い
テストケースを作成するフェーズになると、直交表と同じでは?と感じることがあるかと思います。 直交表では、主に2因子間の水準組み合わせを網羅するように使われています。ちなみに3因子間の網羅でも使えるそうです。
さて、この直交表のメリットは、組み合わせテストにおけるテストケース数の削減と各水準の組み合わせが均一に表れるところにあります。
この記事で語りたいクラシフィケーションツリー法のメリットは、後者の各水準の組み合わせ均一に表れるという縛りがないことにあります。 (wacate 2018冬にて中村さんが口頭でおっしゃっていて「ハッ!」となりました。ありがとうございます。解釈が間違っていたら申し訳ないです...)
クラシフィケーションツリー法のメリット
それでは、「各水準の組み合わせ均一に表れるという縛りがない」とはどういうことか説明したいと思います。
まず前提として、組み合わせを考える際にすべての水準の重要度や使用頻度が等しいことは稀であると思っています。(この前提が共感できなければ、おそらくこの記事で伝えたい内容は入ってこないかと思います...)
相互に作用する組み合わせと、仕様上独立している組み合わせを同様の比重でテストするだけで十分か?という観点で実施をします。
(もちろん業務であれば、要件としてどれくらい網羅するかの基準はあるかと思いますので、状況に応じて考えて頂ければと思います。)
実際に例を見ながら説明していきたいと思います。
テストケース作成の例
問題
テスト界隈ではそこそこメジャーらしい"ラーメン"をテーマに問題を作ります。
「あなたはラーメン屋めぐりにハマっています。あなたは検証が大好きなので、訪れるラーメン屋を見切るまで通い続けます。 しかし、次に訪れるラーメン屋は麺の太さや硬さ、スープの種類を好きに選べるタイプのお店です。 しかし、早く次のラーメン屋検証にも進みたいため、なるべく早く見切る必要があります。毎食食べるとして、何日で見切ったと言えるでしょうか?」
といった問題です。
ラーメン屋の詳細は以下の通りとします。
スープは味噌・醤油・塩の3種類
麺の種類は細麺・太麺・ちぢれ麺の3種類で、
バリカタ・かため・ふつう・やわらかめの4種類から硬さを選べます。
トッピングは著者の独断と偏見および簡略化のため海苔のみとします。
ツリーを書く
問題を元にツリーを書きだすとこんな感じになります。(気持ち程度に名称を加えてます。Surface買ったのでペンを使ってみたかっただけです。)
ツリーの形が異なる方もいるかもしれませんが、今回は説明のためこのツリーを使います。 因子と水準が洗い出せたら格子を書きます。
テストケースの作り方
ツリーが書けたら基準を決めます。
ここでクラシフィケーションツリー法の本領発揮です。
まずこれらの水準で、相互に作用するものがあるかどうか考えてみます。
例えば、「海苔の有無」と「麺の硬さ」はそれぞれに影響があるでしょうか?
自分はないと思います。
よって「この2つはペアワイズにする必要はない」と判断します。
では、相互に作用するものはなにか。そうです、麺の「種類」と「硬さ」です。
「相互に作用し、かつ重要度が高いためこの部分はしっかり網羅したい」のでペアワイズで考えます。
こんな感じです。
では、ここに先ほど触れた海苔を考えてみます。
海苔の有無は麺に影響を与えないものの、一度は食べてみないと見切ったとは言えませんね。
よって、1ワイズで網羅します。
海苔に関する網羅率はひとまずこれで十分ですね。
最後にスープや残りの海苔の有無について考えていきます。
クラシフィケーションツリー法では人の意思を介入させることができます。
水準が等しく表れる必要はありません。
よって一度の検証で余計な要素はなるべく減らしたいので、海苔はできるだけ「無」にしたいと考えます。 しかし、「海苔はスープとの相性もあるのでは?」と考えたりします。
そう感じたのであれば、そこはペアワイズを考えればいいわけです。 既に12ケースが作成されるのは必然なので その中で網羅し、必要な分書けたら残りを「無」にします。
このような具合に、テスト対象の特徴や要件に合わせて網羅基準や水準の選定基準を考えます。
- この店の主力商品はなにか?
- 自分が絶対に 食べる/食べない 組み合わせはあるか?
- もう1回 海苔を入れて試してみたくなった
などなど。
例えば今回は自分のための検証なので「ちぢれ麺は味噌以外で食べることはほとんどない」といった潜在的な情報があったりします。
このように「ユーザーはほとんどが20代~40代なので、60代以降よりも重点的に見る」や「金額表示に関わる部分なので重視する」といった基準を自分達で考えることができます。
この潜在的な情報はプロダクトによって様々で、
- 使用頻度にばらつきがあるところ
- 開発が苦戦していたところ
- ロジックが複雑なところ
- 法的に問題を起こせないところ
- 会社として守らなければいけないところ
など様々な判断軸があると思いますので、自分たちのプロダクトに合わせてテストケースを作成して下さい。
ちなみに「スープと麺の組み合わせを網羅しないとは何事だ!!」という意見は、もちろん誤りではありません。 それもまた潜在的な要件であり、今回 自分が必要としていた要件ではなかっただけのことです。
必要ならその条件を足せばいいわけですし、不要なら考えなくて良い、自由に基準を決められる利点を最大限活用してみてください。
終わりに
改めて用語や考え方に誤りや及ばない点があるかと思いますが、大目に見てくだされば幸いです。
クラシフィケーションツリー法について書かれた情報が少ないので、もう少し身近に感じてもらえればと思います。
それでは皆さん、良いクラシフィケーションツリーライフをお過ごしください。
メリークラシフィクリスマス