突然ですが(実は、あることが書きたい前置きでこれを書いているわけなのですが)、単体テストとして行われる、ユニットテストの方法について、考えてみたいと思います。
ということで「JUnitによる、テストファースト開発入門」(ISBN 4-7973-2572-0)で、ユニットテスト方法のところをみてみる。
なぜ、この本を選んだか?というと、目の前にあったからというだけで、深い意味はない。
もっといい本があるかもしれないし、ないかもしれない。
独断と偏見で(というか、運と、惰性と成り行きで)選んだ。
上記の本の、91ページの図「テストの種類とエラーの種類」の図では、以下の4つが、テストの種類としてあがっている。
・制約値テスト
・限界値テスト
・例外処理テスト
・存在テスト
このうち、たぶん、例外処理テストは、なにかの間違いじゃないかな?実際、この図の説明文にあたる、P96では、「妥当性テスト」になっているし、ここに挙げる例としては、妥当性テストがただしいとおもう。
ということで、以下に、それら4つのテストと、その内容を説明する
・制約値テスト-システムの制約から来るもの
桁あふれのとき、どうなるか(エラーとして受け付けないか)とかなど
・限界値テスト-いわゆる、境界値テスト。仕様の制約からくるもの
・妥当性テスト-引数の組み合わせを考えたとき、その値は妥当か?などのテスト
決定表などを使い、各ケースについて求める。
・存在テスト-そもそも、引数が存在しなかったら(NULLで渡したら)どうなるかのテスト
で、これらのテストのそれぞれに対して、結果がどうなるかによって、正常系、異常系に分かれる。
正常系とは、正常に値が帰ってくるもの。
異常系というのは、そうではないもので、「エラー」と「例外」に分かれる
エラーは、エラー値が帰ってくる
例外は、例外処理され、例外が帰ってくるもの
エラーと例外の区別について、個人的な見解を述べると、一般論でいえば、エラーは、想定の範囲内であり、本システムで、警告など、対処すべきもの。
例外は、想定の範囲外のことが起きた場合と、想定の範囲内だが、本システムでエラーとして対処するには、不適切なもの(熱暴走が起こった等)に対処する。
ただし、想定の範囲内で、警告などで対処すべきケースでも、例外処理に落とし込む場合もあり(DBのデッドロック等)このエラーと例外の区別はあいまいになる。
そうすると、ユニットテストは、こんなかんじに分類できる(ここをうめるように、テスト項目を検討していく)
正常系 | 異常系(エラー) | 異常系(例外) | |
制約値テスト | |||
限界値テスト | |||
妥当性テスト | |||
存在テスト |
これを、各項目ごとに、行うことになる。
とすると、ウィリアムのいたずらが、前に示した単体テストのテストケースの作り方と、異なる。
なぜ異なるかということと、実は、この表をテキトーに書き換えると、ウィリアムのいたずらの示した表になる(具体的には、3次元、いや、4次元を2次元に圧縮して、あるものを付け加える。別に、次元を乗り越えるというSFな話ではない。ただ、「具体的には」といっておきながら、ひとつも具体的ではない)。
今日は、その前置きとして書いたのでは。。実は、「ない」。
もし、気が向いたら、その展開過程を書くかもしれないけど。
じゃあ、何のために、この話題を書いたのかについては、気が向いたときに、覚えていたら、説明するかもしんない。