見出し画像

第207回: 「ソフトウェアテストしようぜ」23 GIHOZ(10. 境界値分析 前編)

◀前の記事へ 次の記事へ▶


≡ はじめに

前回は、状態遷移テストの後編ということで、GIHOZの状態遷移テストツールに対する状態遷移テストをつくる話について書きました。前回で最も大切な箇所は、「モデルを網羅するという考え方」です。

外部仕様のテストの網羅性を直接測定することは難しいので、モデルをつくって単純な外部仕様にして、そのモデルを網羅するテストを作成し、実行することで、「外部仕様に対して、そのモデルの側面での網羅性」で品質を判断しようということです。

前回より

状態遷移図の描き方についても前回書きましたが、実際に業務で描いてみるのが一番です。そして、「なんか上手く描けないなあ」と思ったときに、前回の記事を読み返してヒントを得て先に進む。そんな方法が一番です。

状態遷移図に正解なんてありません

前回、「加瀬さんの問題」を引用しましたが、答えを考えてみましたでしょうか? 問題文は以下です。

■ 加瀬さんの問題

メール送信(以下)のシーケンス図から「idle」「新着確認」「受付中」という状態がみつけられる。さて、メールサーバの状態はこれだけだろうか。

シーケンス図を使ったステートチャートの作成」より

考えていなかった人は1分くらいで良いので、考えてから次の行に移ることをおすすめします。

答えは、「これ以外にもある」ですが、どうしてそうなるのかが大切です。

前々回と前回に、「シーケンス図は、1枚のシーケンス図で1つの動作の流れ(シナリオ)を表現している」と書きました。

上記シーケンス図は、「メールソフトからのメール送信」のシーケンスしかモデル化していません。したがって、例えば、「メールソフトへのメール送信(メールソフト側から見たらメール受信)」のときのシーケンス図を描けば、メールサーバの別の状態(「(メールサーバからメールソフトへの)送信中」など)が見つかります。

シーケンス図と状態遷移図のどちらを使うか、使い分けが大事です。また、図を描くと仕様の矛盾点や検討不足が見つかりますので、プログラム開発のときやテスト設計をするときには文章だけではなく図を書くことをお勧めします。

さて、今回は、GIHOZの次のツールである「境界値分析」について書きます。GIHOZツールへの適用は次回となります。



≡ 境界値分析とは

境界値分析をしたことが1度もないというテスターはいないと思います。最強のテスト技法です。

私が、最初に社外のコミュニティ(ソフトウェアテストの勉強会)に参加したのは、二十数年前のことです。
発表者がみんな、「同値分割」や「境界値」といった言葉を普通に使っていて、「それなに? 私知らない」って思ったのがソフトウェアテストの専門用語との出会いです。

当時の私は、用語は知らなかったけれど、テストのときに最大値、最小値のテストはしていたので、「あれにこんな名前がついていたのか~」と感心したことを思い出します。
また、同時に『テストについて知らないことがたくさんありそうだから、勉強したほうがいいのかもな』と思いました。
でも、それから5年くらいは『基本から学ぶソフトウェアテスト』しか読んでいない日々が続きました。そんな日々が終わったのは、JSTQBの試験開始でした。FLのシラバスは、私にとって最高の教材でした。(いまも)

ということで、皆さんご存じのことと思いますが、足並みをそろえる意味で境界値分析について、JSTQB用語集の定義を引用しつつ、それを噛み砕いて説明します。

境界値分析(boundary value analysis)
ブラックボックステスト設計技法の1つ。境界値に基づいてテストケースを設計する。

JSTQB用語集より

境界値(boundary value)
順序付けられた値を持つ同値パーティションにおける最大値もしくは最小値。

JSTQB用語集より

同値パーティション(equivalence partition)
コンポーネントまたはシステム内の変数のある範囲であり、この範囲のすべての値は、仕様に基づいて同じであるとして扱う。
Synonyms: 同値クラス(equivalence class)

JSTQB用語集より

上記の通り、「境界値分析」という用語の意味を知りたいときには「境界値」と「同値パーティション」の意味も調べないといけません。(ちょっとでも知識に不安を感じたら面倒だけど、調べる方がいいですよー)

国語辞典は、単語を引いたら「だいたいの意味はそこに書いてある」のですが、ISOやJISなど規格書の用語集は、上記のように、「各用語の説明は専門用語を使ってシンプルに記述するとともに、使った専門用語は全部記述する」という体裁になっています。
慣れるまでは面倒に感じますが面倒くさがらず調べるしかありません。(たまに、用語の定義が三角とびのようにループしているときがあるので、困るんですけどね)

ということで、「境界値分析」と「境界値」と「同値パーティション」の用語説明ををつなげて、かつ、要点のみにしてみます。

境界値分析(boundary value analysis)
変数の値に対して、「仕様に基づいて同じであるとして扱う範囲」のことを同値パーティションと呼ぶ。
境界値分析は、同値パーティションの要素が順序付けられた値から成り立つとき、その最大値もしくは最小値に基づいてテストケースを設計する方法。

続いて上記を4つのタスクに分解してみます。

境界値分析のタスク
1. 変数を同値パーティションに分割する
2. 同値パーティションの要素が順序を持つか確認する
 (順序を持たなければ境界値分析は行えないのでここで終わり)
3. 順序を持つときは、その最小値と最大値を確認する
4. 「最小値の1つ前、最小値、最大値、最大値の1つ後」のテストをつくる

※ 「1つ前」、「1つ後」と書いているのは、要素が整数とは限らないためです。最小値、最大値にもっとも近い同値パーティション外の値を選びます。

それでは、上記1~4について説明します。


1. 変数を同値パーティションに分割する

たぶん、このタスクが一番難しいと思います。(あとは機械的にできるから)

ところが、テスト対象の変数選びをあまり真剣にしている姿を見たことがありません。

「画面ごとに入力エリアを探し、それをテスト対象の変数とする」組織が多いです。

もちろん、「画面ごとに入力エリアを探し、それをテスト対象の変数とする」方法は効率的ですし、抜けもれも発生しにくく分かりやすく効果が高い方法です。でも、それだけでよいのでしょうか?

前回、「状態は変数の値の組合せ」ということを学びました。状態遷移図を描いたら、せっかくなので、全ての状態に対して「その状態を定義している変数」を書き出し、その変数についても境界値分析をしましょう。

同じ変数が複数の状態に出現しますが、状態=同値パーティションです。
例えば、自動販売機の「(投入金額が足りているため)購入可」と、「(投入金額が不足しているため)購入不可」の2つの状態は「投入金額」という変数の同値パーティションを表しています。
 投入金額≧商品価格: 購入可
 投入金額<商品価格: 購入不可
このように考えることで、状態遷移図から、投入金額という変数と、その変数の2つの同値パーティションがみつかります。

※ 「コイン投入口」から「投入金額」(投入したコインの総額)という変数を思いつくでしょう。しかし、「10円、50円、100円、500円」といった値を持った「コイン種類」という変数にしてしまうかもしれません。(それも重要な変数ですが、状態を表す変数との違いを理解しましょう。


2. 同値パーティションの要素が順序を持つか確認する

例えば、食べ物を、肉、魚、野菜、果物、穀物の5つに分類したとします。(海藻はどこに入るんだ?とか言わないでくださいね)

それぞれを同値パーティションと呼びます。(重なりなく分割しているから)

肉の同値パーティションの要素が「牛肉、豚肉、鶏肉、馬肉、桜肉、マトン」だったとします。この要素には順番がありません。

グラム当たりの単価や年間消費量など、各要素が持っている属性には、数値化できるものがあり、その属性を使って順番を考えることはできます。
しかし、その場合、着目した属性によって並び順が変わるはずです。決して、要素そのものが順序を持っているということではありません。

“食べ物”の“肉”のような同値パーティションは、要素が順序を持っていないのですから、端っこ(すなわち境界値)を持ちません。境界値を持たないので、境界値分析はできません。

「当たり前のことを長々となんだよー」と思った人がいると思います。ところが実際のテストでは境界値を持つか持たないかは、割と重要なポイントとなります

例えば、郵便番号について考えてみます。

「郵便番号は、はじめの2桁で都道府県を特定できる」という人がいます。確かに東京都の郵便番号は10-20で始まります。北海道は00と04-09で始まります。

ところが、福岡県は、80-83が基本といいつつ「8115と817」は⻑崎県ですし、「839142」は大分県です。

他にも、「4980000」、「6180000」、「8710000」は、府県が異なる2つの市町村に紐づけられているそうです。

郵便番号のような順序を持っていそうで例外がある変数に対して境界値分析を使ってテストケースを減らすことは大変危険です。なぜなら、プログラムコードで

if ((10≦郵便番号) && (郵便番号≦20)){都道府県=東京都}

とコーディングしていることが期待できないからです。範囲ではなく、一つ一つ書いているかもしれません。

if (郵便番号 == 1940040){都道府県=東京都}
if (郵便番号 == 1940041){都道府県=東京都}
if (郵便番号 == 1940042){都道府県=東京都}
if (郵便番号 == 1940043){都道府県=東京都}
if (郵便番号 == 1940044){都道府県=東京都}

もちろん実際には、こんなふうにはせずにデータベースのフィールドとして郵便番号と対応させた都道府県名を持っているのでしょうが、その場合も境界値分析が使えないのは同じです。


3. 順序を持つときは、その最小値と最大値を確認する

こちらは単純作業となります。例えば、「六本木ヒルズの“けやき坂イルミネーション”は、2022年11月10日(木)~12月25日(日)です」といえば、境界値は、「2022年11月10日」と「2022年12月25日」です。単純に両端の値を境界値とすればよいです。

ただし、このように、仕様に変数が取りうる値が明記されていればよいのですが、例えば、「パスワードは8文字以上を受け付ける」と書いてあった場合、最小値は「8文字」とわかりますが、最大値は仕様からは分かりません。

そんなときには、“世の中の多くのパスワードの最大長は「128文字」だから「128文字」を最大値の境界値としてテストをしよう”という判断ができるように、テスト担当者には適切な顧客要求に対する知見、いわゆるドメイン知識が必要となります。

「世の中の多くのパスワードの最大文字数なんて知らないよ」という人がいらっしゃるかもしれません。そして、それが常識かどうか分からないと。
そんなときにはChatGTPに聞いてみましょう。

ChatGTPの回答

これで安心して開発者に「このシステムのパスワードの最大文字数は何文字ですか?」と問い合わせることができますね。

もちろん、ChatGTPに聞かずにガンガン問い合わせをして構いません。ただ、初級者のうちは“忙しい先輩にこんな質問をしていいのかな? ウザがられないかな??”と躊躇してしまうものです。
そんなときに『ChatGTPもシステムによって異なる』と言ってたと思うと、ちょっと気が楽になりませんか?


4. 「最小値の1つ前、最小値、最大値、最大値の1つ後」のテストをつくる

こちらも単純作業となります。パスワードの境界値が「8文字」と「128文字」であれば、「7文字」、「8文字」、「128文字」、「129文字」のテストを実施するということです。

変数が小数を受け付けるときは、ちょっと困ります。最小値が3で最大値が50としたときに、「最小値の1つ前」の値は、「2」ではないですよね。「2.9」でしょうか? それとも「2.99999」でしょうか?

プログラムの変数の型が浮動小数点型のときにはその考慮も必要でしょうし、「小数点以下1桁を四捨五入する」という仕様であれば、2.5と3は同じ扱いになります。

仕様が不明なときには、テクニカルレビューのときに、他の参加者と境界値の考え方について合意を取るとよいでしょう。テクニカルレビューを実施しないのなら開発者に聞いてみましょう。



≡  おわりに

今回は、「境界値分析」の前編として、境界値分析手法について詳しく書きました。

いつも使う技法だからこそ、120%使いこなしたいものです。

次回は、GIHOZの境界値分析ツールに対して境界値分析をします。

◀前の記事へ 次の記事へ▶


この記事が気に入ったらサポートをしてみませんか?