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

ソフトウェアの品質、テストなどについて学んだことを記録するブログです。

『ソフトウェアテスト技法 練習帳』を解きながら、自分の考え方も整理していく。

SAKURAKO - Piano Lesson. [Explored]

 『ソフトウェアテスト技法 練習帳』を、じわじわ解いています。

JaSST'19 Tohokuにて好評を博した練習帳をベースに、問題を増やし内容にさらに磨きをかけて刊行します。

ということで、そもそも参加者特典のレベルを超えた「冊子」が、書籍となったのが本書です。
 同値分割、境界値分析、デシジョンテーブル、状態遷移テスト、組み合わせテストという代表的なテスト技法に、「総合問題」が付くという構成です。

 わたしの進捗は悪く、未だに「同値分割法と境界値分析」を終えられていませんが、ごくシンプルな問題からじわじわと複雑さを上げて体を慣らしていくスタイルは、独学にも、勉強会にも向く作りだと思います。テスト技法によるテストケースの絞り込みは必ずしも唯一の正解が存在するわけではありませんが、本書では「解答例」として、なぜそのテストケースが選定されたかを丁寧に説明してくれるのも、お気に入りの点です。

同値分割・境界値分析の問題を解いてみて

 というところで、「1.12 配達便の料金体系」を解いていて疑問に思った点について、著者のネモさんと秋山さんに補足していただきましたので、整理しておきたいと思います。

問題の内容

 問題1.12の正確な内容は同書をあたっていただきたいと思いますが、ざっくり以下の通りです。

  • 荷物の「三辺の合計」(以下「大きさ」)と「重量」(以下「重さ」)から、以下のように「荷物サイズ」が決まる。
荷物サイズ 大きさ 重さ
60サイズ 60cm以下 2㎏以下
80サイズ 80cm以下 5㎏以下
100サイズ 100cm以下 10㎏
  • 大きさが100cmを超える または 重さ10kgを越える 場合はエラー。
  • 荷物サイズは、大きさ または 重さ の対応する荷物サイズの大きい方に決まる。
    • たとえば大きさ50cm、重さ4kg だと、80サイズとなる。
  • 大きさも重さも、0の入力を許容する。
  • 大きさは4桁以上の整数、重さは3桁以上の整数の入力を許容しない。

選択するべき値

 ここで、2つのパラメタ「大きさ」「重さ」それぞれの数直線を描くのが定石かもしれませんが、軽く一時間は溶けてしまいそうので描かず・・・。
 それぞれのパラメタで選ぶべき値を列挙してみます。わたしは、境界値のみを選んでいます。

  • 大きさ 0, 60, 61, 80, 81, 100, 101, 999
  • 重さ 0, 2, 3, 5, 6, 10, 11, 99

 「解答例」では、以下の値が選ばれています。

  • 大きさ 0, 30, 60, 61, 70, 80, 81, 90, 100, 101, 110, N/A
  • 重さ 0, 1, 2, 3, 4, 5, 6, 8, 10, 11, 15, N/A

 主な違いは、以下です。

  1. 「解答例」では、2つのパラメタについて、境界値だけでなく代表値も選んでいる。たとえば60サイズの大きさとして、「30cm」など。*1
  2. 「解答例」では、無効クラスの値として、「101」「110」「N/A」を選んでいる。

 2つ目については理由を以下のように述べています。

「3辺合計」の無効同値は最大の入力値が999になりますが、今回は有効同値に近い101と代表値である110をテストデータとして扱います。

 この点は理由が述べられておれず、天下りな印象を受けます。
 また「N/A」については「上限の境界値はなし」としており、ちょっと矛盾を感じる点です。

導出されるテストケース

 さて「解答例」では、大きさ・重さの値の各11個をフルで組み合わせた121パターンをテストケースとして挙げています。
 パラメタは2つ、出力のパターンも4つ(60、80、100、エラー)しかないのに、121パターンというのは多すぎるように感じるのではないでしょうか。

 先ほどのパラメタの組み合わせを、マトリクスで表現してみましょう。セルに埋まっているのは、「荷物サイズ」です。4つのエリアに色分けできることがわかりますね。
 色を少し濃くしているのが、2次元「面」になった各エリアの境界です。

f:id:kz_suzuki:20200308182647p:plain
「大きさ」「重さ」と、「荷物サイズ」の関係

 たとえば緑色のエリア(荷物サイズ=80)の境界で、「特に重要なセル」はどこでしょう。
 まず目につくのは、大きさ80、重さ5のセル (80, 5) でしょう。大きさや重さがこれよりプラスになると、隣のエリア(荷物サイズ=100)に入ってしまう、まさに境界ギリギリです。
 このセルより上のセル5つは、大きさがプラスになると隣のエリアに入りますが、重さがプラスになっても同じエリア内に留まります。(80, 5) のセルに比べて優先度は低いでしょう。

 この(80, 50)のエリアから境界をまたいだ (81, 5) と (80, 6) の2つのセルも大事です。この3つでワンセットですね。(81, 6) も何となく特別感がありますが、「境界値のさらに隣」というところです。

 他のエリアも同じように考えると、

  • 青の上限ギリ (60, 2) とその隣接セル (61, 2) (60, 3)
  • 緑の上限ギリ (80, 5) とその隣接セル (81, 5) (80, 6)
  • 黄の上限ギリ (100, 10) とその隣接セル (101, 10) (100, 11)
  • 赤の上限ギリ (999, 99)

 この9パターンに加えて、

  • 青の下限ギリ (0, 0)

 自分なら、この合計11パターンをまず高優先度にするかなと思います。*2

と書いてきたものの、

 著者の方の意図は以下の通り。

 これだとかなり多いことはもちろんご承知のうえで、「今手持ちの技法で何ができるか」ということなのですね。
 この後の章でデシジョンテーブルが出てきますので、「互いに関係する複数のパラメタの扱い」について知ることができるはずです。楽しみですね!
 わたしも今年度の間には行けるかな~。

補足 (2019/3/28)

 わたしのふんわりとした値選択とは異なる、ドメイン分析の正統なロジックに基づいたテストケース導出について、秋山さんがツイートされていましたので、補記しておきます。

 わたしは以下の部分は「有効同値クラス」と考えたこともあり、差分があるようです。

「3辺合計」が100cmを超える、または「重量」が10㎏を超える場合は「荷物サイズ」にエラーと表示し、

*1:『練習帳』のこの章ではすべて、境界値に加えて代表値をテストケース候補に入れています。わたしは全部はやらないかな・・・。

*2:入力できないこと、の確認はここでは省略