第207回: 「ソフトウェアテストしようぜ」23 GIHOZ(10. 境界値分析 前編)
◀前の記事へ 次の記事へ▶
≡ はじめに
前回は、状態遷移テストの後編ということで、GIHOZの状態遷移テストツールに対する状態遷移テストをつくる話について書きました。前回で最も大切な箇所は、「モデルを網羅するという考え方」です。
状態遷移図の描き方についても前回書きましたが、実際に業務で描いてみるのが一番です。そして、「なんか上手く描けないなあ」と思ったときに、前回の記事を読み返してヒントを得て先に進む。そんな方法が一番です。
前回、「加瀬さんの問題」を引用しましたが、答えを考えてみましたでしょうか? 問題文は以下です。
考えていなかった人は1分くらいで良いので、考えてから次の行に移ることをおすすめします。
答えは、「これ以外にもある」ですが、どうしてそうなるのかが大切です。
前々回と前回に、「シーケンス図は、1枚のシーケンス図で1つの動作の流れ(シナリオ)を表現している」と書きました。
上記シーケンス図は、「メールソフトからのメール送信」のシーケンスしかモデル化していません。したがって、例えば、「メールソフトへのメール送信(メールソフト側から見たらメール受信)」のときのシーケンス図を描けば、メールサーバの別の状態(「(メールサーバからメールソフトへの)送信中」など)が見つかります。
さて、今回は、GIHOZの次のツールである「境界値分析」について書きます。GIHOZツールへの適用は次回となります。
≡ 境界値分析とは
境界値分析をしたことが1度もないというテスターはいないと思います。最強のテスト技法です。
ということで、皆さんご存じのことと思いますが、足並みをそろえる意味で境界値分析について、JSTQB用語集の定義を引用しつつ、それを噛み砕いて説明します。
上記の通り、「境界値分析」という用語の意味を知りたいときには「境界値」と「同値パーティション」の意味も調べないといけません。(ちょっとでも知識に不安を感じたら面倒だけど、調べる方がいいですよー)
ということで、「境界値分析」と「境界値」と「同値パーティション」の用語説明ををつなげて、かつ、要点のみにしてみます。
続いて上記を4つのタスクに分解してみます。
それでは、上記1~4について説明します。
1. 変数を同値パーティションに分割する
たぶん、このタスクが一番難しいと思います。(あとは機械的にできるから)
ところが、テスト対象の変数選びをあまり真剣にしている姿を見たことがありません。
「画面ごとに入力エリアを探し、それをテスト対象の変数とする」組織が多いです。
もちろん、「画面ごとに入力エリアを探し、それをテスト対象の変数とする」方法は効率的ですし、抜けもれも発生しにくく分かりやすく効果が高い方法です。でも、それだけでよいのでしょうか?
前回、「状態は変数の値の組合せ」ということを学びました。状態遷移図を描いたら、せっかくなので、全ての状態に対して「その状態を定義している変数」を書き出し、その変数についても境界値分析をしましょう。
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に聞いてみましょう。
これで安心して開発者に「このシステムのパスワードの最大文字数は何文字ですか?」と問い合わせることができますね。
4. 「最小値の1つ前、最小値、最大値、最大値の1つ後」のテストをつくる
こちらも単純作業となります。パスワードの境界値が「8文字」と「128文字」であれば、「7文字」、「8文字」、「128文字」、「129文字」のテストを実施するということです。
変数が小数を受け付けるときは、ちょっと困ります。最小値が3で最大値が50としたときに、「最小値の1つ前」の値は、「2」ではないですよね。「2.9」でしょうか? それとも「2.99999」でしょうか?
プログラムの変数の型が浮動小数点型のときにはその考慮も必要でしょうし、「小数点以下1桁を四捨五入する」という仕様であれば、2.5と3は同じ扱いになります。
仕様が不明なときには、テクニカルレビューのときに、他の参加者と境界値の考え方について合意を取るとよいでしょう。テクニカルレビューを実施しないのなら開発者に聞いてみましょう。
≡ おわりに
今回は、「境界値分析」の前編として、境界値分析手法について詳しく書きました。
いつも使う技法だからこそ、120%使いこなしたいものです。
次回は、GIHOZの境界値分析ツールに対して境界値分析をします。
◀前の記事へ 次の記事へ▶
この記事が気に入ったらサポートをしてみませんか?