こんにちは、はまたくです。
まだまだ駆け出しのテスト設計者なので、テスト業務の知見を深めるために日々奮闘しています。
今回は、ソフトウェアテスト技術者の資格であるJSTQB認定Foundation Level(以下JSTQB FL)を勉強した際に学んだ、テスト設計技法「同値分割法」について、実践で使ってみたときのお話をします。
「同値分割法は知ってるけど実際に使ったことが無い…」
「JSTQB FLを受けるけど同値分割法の使用についていまいちイメージが湧かない」
といった方々に、本記事が少しでも参考になれば幸いです。
▼関連記事:「境界値分析」をテスト設計に取り入れる
同値分割法の定義
JSTQB FLのシラバスでは同値分割法は以下のように定義されています。
同値分割法は、同等に処理されると想定したデータすべてを同じパーティション(これを同値クラスとも呼ぶ)に振り分ける技法である。有効な値と無効な値の両方に対して同値パーティションがある。
JSTQB FLシラバス
- 有効な値は、コンポーネントまたはシステムに受け入れられる値である。有効な値の同値パーティションを「有効同値パーティション」と呼ぶ。
- 無効な値は、コンポーネントまたはシステムに拒否される値である。無効な値の同値パーティションを「無効同値パーティション」と呼ぶ。
- 入力、出力、内部値、時間関連の値(例えば、イベントの前後)などのテスト対象に関連するあらゆるデータ要素、およびインターフェースのパラメーター(例えば、統合テスト時にテスト対象となる統合コンポーネント)に対するパーティションが識別できる。
- パーティションは、必要に応じてさらに細かく分割される場合がある。
- 各値は、必ず1つの同値パーティションだけに属する必要がある。
- 無効同値パーティションをテストケースで使用する場合、複数の故障が同時に起き、1つの故障のみが表面化した場合、他の故障を隠してしまい見逃す恐れがある。故障を隠してしまわないようにするため、他の無効同値パーティションとは組み合わせず単独でテストすべきである。
Foundation Level シラバス 日本語版 Version 2018V3.1.J03 (p.56)
うーん…
JSTQB FLを勉強しているときにも感じたけど、やっぱり使ってみないとイメージ湧かない…(僕だけ??)
とにかく、使ってみないとわからないなら使ってみるまで!
実際に僕が遭遇したケースを2つ紹介します。
いざ実践!
ケース1 ポイント付与機能付き会計システムの場合
最初に紹介するのは、特定種類の商品を購入した際にポイントが付与される会計システムです。仕様は以下の通りです。
-仕様① 種類「食品」の商品を購入した際に10ポイントを付与する
-仕様② 種類「飲料」の商品を購入した際に5ポイントを付与する
-仕様③ 種類「その他」の商品についてはポイントを付与しない
購入可能な商品は以下の通り
商品 | 種類 |
---|---|
食パン | 食品 |
おにぎり | 食品 |
緑茶 | 飲料 |
ほうじ茶 | 飲料 |
玄米茶 | 飲料 |
ウーロン茶 | 飲料 |
ビール | その他 |
カタログギフト | その他 |
それでは早速、同値分割を使ってテストする内容を整理していきましょう。
本システムでは「種類」によりポイント付与の有無が異なるため、クラス分けを行う際は「種類」でグルーピングします。
クラス分けを行った結果がこちら
同値クラス | 種類 | 商品 |
---|---|---|
同値クラス① | 食品 | 食パン、おにぎり |
同値クラス② | 飲料 | 緑茶、ほうじ茶、玄米茶、ウーロン茶 |
同値クラス③ | その他 | ビール、カタログギフト |
こちらの表から、各同値クラスの「商品」に記載されている値のうち代表値1つを選んでテストします。代表値は各同値クラスの中から任意の値を選んでかまいません。
テストデータの一例がこちら
テストデータ | テストデータを選んだ理由 |
---|---|
食パン | 種類「食品」の代表値 |
ほうじ茶 | 種類「飲料」の代表値 |
ビール | 種類「その他」の代表値 |
上記で整理したテストデータに対し、それぞれテストを行うので、全部で3ケースをテストすることになります。今回は例として少ない商品数を仕様に記載していますが、全ての商品をテストする場合と比較すると、テストケースが削減されていることがわかると思います。
このように同値分割を使い、テストしたい機能に関連する項目をグルーピングすることでテストケースが削減されることがわかりました。今回のケースでは数値ではない集合に対するクラス分けを行いましたが、次のケースでは数値がクラス分けの対象となるケースを紹介します。
ケース2 検索機能付きECサイトの場合
次のような仕様の検索機能を持つECサイトがありました。
-仕様① 検索にヒットしない場合は○○というメッセージを表示する
-仕様② 11件以上の検索ヒットがあれば「次へ」ボタンを表示する
-仕様③ 検索ヒット数が1001件以上の場合は△△というメッセージを表示する
このように、出力結果によってUIや動作結果が異なるシステムでは、同値分割法を使ってテストパターンを整理出来ます。
最初に、分割してみた結果は次のような内容です。
-同値クラス① … 検索ヒット数「0件」
-同値クラス② … 検索ヒット数「11件~1000件」
-同値クラス③ … 検索ヒット数「1001件以上」
これを数直線で表したものが以下です。
「0件超過(1件)」から「11件未満(10件)」の区間にクラスが設定されていないことに気づくかと思います。仕様に記載がなくても、ここは同値クラスとして扱わなければいけません。
追加した同値クラスがこちら
-同値クラス④ … 検索ヒット数「1件~10件」
仕様の記載をそのままクラス分けして同値クラス①~③の有効同値クラスがすぐ出てきましたが、同値クラス④のように仕様に明記されていない同値クラスが存在していました。こういった部分からテストに漏れが発生しないように注意する必要がありますね。
さて、ここまでクラス分けしてみて気になったのが、
(「次へ」ボタンがあるのなら「前へ」ボタンもあるのでは??)や、
(検索結果の最終ページを表示したら「次へ」ボタンは非表示となるのか?)
といった点です。
結論として、
-2ページ目以降を表示しているときは「前へ」ボタンを表示する
-最終ページを表示しているときは「次へ」ボタンを非表示にする仕様がありました。
なので、検索機能とは別ですが、ページのテストについてもパターン分けが出来ます。
それがこちら。
前提条件:検索結果が複数ページ(検索ヒット数が11件以上)
-同値クラスA … 最初のページ 「前へ」ボタンが非表示、「次へ」ボタンが表示
-同値クラスB … 途中のページ 「前へ」ボタンと「次へ」ボタンが表示
-同値クラスC … 最終ページ 「前へ」ボタンが表示、「次へ」ボタンが非表示
このように、同一システムに対しても入力(検索ヒット数)としての同値分割、出力結果(検索結果)としての同値分割と、別の視点で同値分割法が使えるよね、というお話でした。途中でも触れていますが、明記されていない仕様に対して気づかずにパターン分けをしてしまうとテストに漏れが発生するので注意が必要ですね(同値分割に限った話ではありませんが)。
さいごに
JSTQB FLで同値分割法を勉強したとき、なんとなく印象として「入力フォームのテスト」に使うイメージが強かった(同値分割の使い方を調べてみるとそういったものが沢山出てきた)んですが、実際にテスト設計をやってみると入力に対してだけでなく、出力結果に対しても使うことが出来ましたし、数値だけでなく、数値以外の集合に対してもクラス分けが出来ることがわかりました。
今回紹介した例以外にも同値分割は他のテスト技法と組み合わせたりして幅広いテスト設計に活用できますので、色んな使い方を勉強して実践で有効に使えるようにしていきましょう。
▼関連記事:「境界値分析」をテスト設計に取り入れる