クラシフィケーションツリー技法ってなに?
はじめに
今回はテスト技法の一つ『クラシフィケーションツリー技法』についてまとめてみようと思います。
クラシフィケーションツリー技法とは
このテスト技法は以下のような特徴を持ちます。
- テスト対象の想定される振る舞いは複数の考慮要素の組み合わせにより導出される
- 考慮要素の値は同値分割により分岐的にまとめることが出来る
- 考慮要素は論理的に繋がりがあり飛躍がなくMECEである
テスト対象の想定される振る舞いを網羅する際、
そのテストケースの導出時の論理的な切り口として同値分割の手法を用いることで、
テストを網羅的で効率的に実施することが出来る技法です。
同じブラックボックステスト技法にドメイン分析テストというものがありますが、
こちらは変数ごとの境界値とその近傍での振る舞いを効率良く検証するための技法であり、境界値分析を拡張させたような存在ですが、
クラシフィケーションツリー技法は同値分割法を拡張させたような存在であり、
テスト条件が複雑な際の組み合わせテストに論理的な切り口を見出して同値的に分岐をさせることで効率的に検証をするためのテスト技法になります。
ドメイン分析テストについては僭越ながらこちらをご参考ください。
クラシフィケーションツリー技法の構成要素
このテスト技法は、
- トップノード
- クラシフィケーション
- クラス
これらにより構成されます。
トップノードとは木構造における最上位部分にあたるもののことです。
クラシフィケーションとはトップノードを構成する変数ないしはパラメータのことであり、先述の考慮要素のことを指します。
クラスとは個々のクラシフィケーションにおいて同値的に分割された値、すなわち同値パーティションのことを指します。
また木構造が大きくなった際にて、複数のクラシフィケーションを包含するかのような概念であるコンポジションと呼ばれるものもありますが、これもクラシフィケーションと呼ぶこともあります。
クラシフィケーションツリーのサンプル図
用語だけですとイメージしづらいかと思いますので、以下にサンプルを示します。

上図はログイン機能を要するアプリケーションに関するブラックボックステストケースを網羅的にするためのクラシフィケーションツリー図になります。
クラシフィケーションの論理的な分け方
上記クラシフィケーションは単にテスト対象を区分すればいい訳ではありません。
これらは論理的に繋がりがあり、飛躍がなく、MECEであることでテストの網羅性に寄与します。
そのため、クラシフィケーションは以下のような法則に基づき論理的に分けられます。
- 一貫性の原則
- 相互排除の原則
- 一致の原則
- 漸進の原則
上記原則についても図を用いて説明いたします。
一貫性の原則
この原則は、
「区分分割の原理(切り口)は一つであるべき」
つまり、
「クラシフィケーションの切り出し方が同じ(観点が揃っている)」
という理屈に基づくテスト設計原則になります。
このような原則についてはアンチパターンを示した方がわかりやすいかと思われますので、以下にアンチパターンを示します。
アンチパターン

こちらは『テスト』について区分分割しておりますが観点が揃っていませんね。
本来ならばテストレベルの軸で揃っていないといけないはずですがそうではなく、
テストレベルの切り口ではないクラシフィケーションである
「パフォーマンステスト」があります。
本来ならここは「受け入れテスト」が入るべきであり、
そうであればこの原則を満たしていることになります。
相互排除の原則
この原則は、
「区分子は互いに排他的である」
つまり、
「クラシフィケーションは互いに重なりがあってはならない」
ということを求める原則になります。
これもアンチパターンを見てみましょう。
アンチパターン

トップノードには「日」という概念を置いているので、
クラシフィケーションはそれに則って「平日」か「休日」か程度に分類すべきでしょうが、
「祝日」と「日曜日」という概念も混じっています。
この2つは「休日」に含まれるものなので冗長になっています。
仮に「休日」の中でも「祝日」と「日曜日」とで振る舞いが異なるのであれば
「休日」の下に分岐を入れるべきであり、
それに基づいて「平日」も含めてクラスを作成するべきでしょう。
また、もし仮に「日曜日」にfeatureしてクラシフィケーションを作るのであれば、
先述の一貫性の原則に則って、
「月曜日」、「火曜日」、「水曜日」、「木曜日」、「金曜日」、「土曜日」をクラシフィケーションとして切るべきなのでしょう。
一致の原則
この原則は、
「区分子は全ての場合を網羅する」
つまり、
「クラシフィケーションに抜け漏れがあってはならない」
ということを求める原則になります。
これもアンチパターンを見てみましょう。
アンチパターン

トップノードには「四季」とあるのでそれに準じてクラシフィケーションには各季節が来るのが妥当でしょうが、「秋」が抜けていますね。
このように抜け漏れがあるかを確認しMECEになっているようにしないといけません。
漸進の原則
この原則は、
「区分は順序通りに上位概念から下位概念に進むべきであり飛躍してはならない」
つまり、
「クラシフィケーションの導出においてはそこに論理の飛躍があってはならない」
ということを求める原則になります。
ここはすっとは入りにくいかも知れませんね。
これもアンチパターンを見てみましょう。
アンチパターン

上図はプリンターを用いたプリント時のテストに関する例です。
「用紙」から「拡縮」までは論理的な繋がりがありますが、「9300K」にはそれがありません。
「9300K」とは印刷時の色の設定(やや青みがかかった白色のこと)であり、それ自体が論理的に繋がっている訳ではありません。
少し整理してみると、

このように「9300K」とは印刷時の色設定(プロファイル設定)に紐づく色温度のことであり、
かつそれは「グラフィックス」に紐づくものです。
論理的にはかなり下部の方に位置する具象的なものであることがわかるかと思われます。
本来先述のクラシフィケーションの位置には「グラフィックス」が来るべきだったでしょう。
クラシフィケーションツリー技法には上記4つの原則があるので、使用時にはこの4つの原則を意識して「仲間はずれなクラシフィケーション」がいないか確認しながら設計してみましょう。
具体例と使い方
ここまでは座学的なものだったので、実際に以下の例を用いて使ってみましょう💪
例題:
とあるクレジットカードサービスがある。
このクレジットカードで決済をするとポイントが付与される仕様になっている。
ただしポイント付与においては「会員ランク」「決済金額」「ポイント増額対象店舗」といった3つの要素が関わってくるものとする。
・「会員ランク」はノーマル、シルバー、ゴールドに分けられる
・「決済金額」は100円未満、100円以上1000円未満、1000円以上10000円未満、10000円以上に分けられる
・「ポイント増額対象店舗」は「キャンペーン対象店舗」「キャンペーン対象外店舗」に分けられる
この条件にある時、テストベースを効率的にテストするためのクラシフィケーションツリーを書け。
上記例題に基づいて実際に書いてみましょう。
今回はクレジット決済におけるポイント付与率の組み合わせテストなので「ポイント付与率」がトップノードに当たるものと思われます。
この時、ポイント付与率が上記3項目の組み合わせにより変動することが示されているので、
- 「会員ランク」
- 「決済金額」
- 「ポイント増額対象店舗」
この3つがクラシフィケーションに該当するものと考えられます。
そして、
・「会員ランク」はノーマル、シルバー、ゴールドに分けられる
・「決済金額」は100円未満、100円以上1000円未満、1000円以上10000円未満、10000円以上に分けられる
・「ポイント増額対象店舗」は「キャンペーン対象店舗」「キャンペーン対象外店舗」に分けられる
このように示されていることから、上記はクラシフィケーションにおけるクラスであると捉えられます。
このように考えると以下のように図式化することができます。

テストケース数としては「3✖️4✖️2=24ケース」あることが明示されましたね。
あとはこれを用いて組み合わせテーブルを書いてみたりディシジョンテーブルテストに応用してみたりなどができるので、複雑なテストを要する際は整理のためにも書いてみると良いかも知れませんね👍
参考
Discussion