ユーザID妥当性チェックのテストケースを考える
前回の記事にて、妥当なユーザIDとパスワードを決めました。そこで、さっそくバリデーション処理をBDDで実装しようとしたのですが、適切なシナリオがなかなか決まりません。
たとえば、ユーザID。許可する文字種は英数字および「-」「.」「_」です。妥当な文字数は2〜24文字。この仕様で妥当となるユーザIDは、計算するのも嫌なぐらいありえます。したがって、これらをすべてテストするわけにはいきません。どこまでテストすればよいのでしょうか。
また、妥当でないユーザIDのテストケースも必要です。たとえば「~」が含まれるユーザIDは「妥当でない」と判断されなければなりません。そのような文字は山ほどある(ひらがな・カタカナ・漢字・記号など)ので、これらもすべてテストするわけにはいきません。
テストケース作りの指針
そこで、何か指針はないかと探したところ、下記のPDFが見つかりました。
日本ユニシス社の大塚氏・荻野氏によって書かれた記事です。
「3. ブラックボックス技法によるテスト設計例」において、ログイン名とパスワードの許容判定プログラムが取り上げられています。この内容に沿って考えてみましょう。
文字種は「同値クラス分割」で
まず、文字種については「同値クラス分割」*1とよばれる手法が使えます。文字種を英大文字・英小文字・数字・記号といったグループに分け、各グループの1文字(ないし数文字)を代表値として用いる手法です。私のユーザIDの例でいえば、英大文字・英小文字・数字・「-」・「.」・「_」の6グループに分割するのがよいかと思っています。
PDF記載の例では、ログインIDに使える文字を「英小文字・英大文字・数字」としています。これら3グループから数文字ずつピックアップし、テストケースを作るわけです。
このとき、下記のように、組み合わせを考慮すべきと書かれています。
- 英小文字のみの場合(例:abc)
- 英大文字のみの場合(例:ABC)
- 数字のみの場合(例:123)
- 英小文字と英大文字が含まれる場合(例:abcABC)
- 英小文字と数字が含まれる場合(例:abc123)
- 英大文字と数字が含まれる場合(例:ABC123)
- すべて含まれる場合(例:abcABC123)
ここが私には少し疑問です。「すべて含まれる場合」のみテストすれば充分ではないか、と。私の考えている仕様では6グループに分かれるため、組み合わせの数が58ケースに膨れ上がってしまいます(私の計算が確かならば)。
非妥当文字の扱いについては「カバレッジ次第」とPDFでは書かれています。「文字種による条件分岐があるならばテストケースに追加せよ」ということですが、内部的には正規表現でマッチングすることになるでしょうから、例えば「~」1文字だけをテストケースに含めれば充分ではないかと思っています。
ここまでをふまえると、文字種のテストケースはこうなります。
- 「abAB01-._」が妥当と判定されること
- 「abAB01-._~」が妥当でないと判定されること
文字数は「境界値分析」で
つづいて文字数です。PDFでは「境界値分析」という手法を使っています。プログラマには経験的におなじみの手法かもしれません。「2〜24文字を許可する」仕様ならば、「1文字」「2文字」「24文字」「25文字」のテストケースを作るというものです。
おもしろいのは、「3文字」「23文字」のテストケース追加が奨励されていることです。テストが通らなかった場合に、バグの原因の当たりがつけやすくなるとの理由からですが、個人的にはわざわざ加えるほどでもないかと思っています。
まとめると、文字数のテストケースはこうなります。
- 「1」が妥当でないと判定されること
- 「12」が妥当と判定されること
- 「123456789012345678901234」が妥当と判定されること
- 「1234567890123456789012345」が妥当でないと判定されること
テストケースを組み合わせる
さらに、文字種と文字数のテストケースを組み合わせることができます。最長チェックと全文字種チェックです。組み合わせるべきかどうかは時と場合によると思いますが、今回はテストケースを減らすことを優先し、組み合わせることにしましょう。こうなります。
- 「abAB01-._~」が妥当でないと判定されること
- 「1」が妥当でないと判定されること
- 「12」が妥当と判定されること
- 「abcdefgABCDEFG1234567-._」が妥当と判定されること
- 「1234567890123456789012345」が妥当でないと判定されること
というわけで、ユーザIDのバリデーションテストケースは5つになりました。パスワードのテストケースも同様になるはずです。
まとめ
恥ずかしながら、これまでテストケースはなんとなく決めていたのですが、「同値クラス分割」と「境界値分析」の手法を覚えたので、少し自信がつきました。ただし、これで充分だとは思いませんので、今後も考え続けます。
*1:一般的には「同値分割」とよぶようですが、ここではPDFに従いました。