岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

ユーザ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に従いました。