#どんな人に向けた記事なのか
▶︎プログラミング初学者 (勉強はじめてから3-6ヶ月くらいまで)
▶︎そもそもテストって何?って調べ始めたばかりの人
▶︎「同値分割」「境界値分析」ってざっくり何か知りたい人
#背景
テストについて調べていると、「同値分割」や「境界値分析」といった言葉がよく出てくるが、パッと見いまいち何かよくわからなかったため、自分なりにまとめてみようと思ったのがきっかけ。
#「同値分割」「境界値分析」とは?(一般的な説明)
下記、IT用語辞典より
○同値分割・・・ソフトウェアテストで適切なテストケースを作成する手法の一つ。出力が同じになるような入力をそれぞれグループにまとめ、グループの中から代表を選んでテストを行なう方式。
○境界値分析・・・ソフトウェアテストで適切なテストケースを作成する手法の1つ。出力が同じになるような入力をそれぞれグループにまとめ、グループが隣接する境界やその前後の値を入力としてテストを行なう方式。
「なるほど!」とはならず、この説明では正直私みたいな初学者にはよくわかりませでした笑
という事で自分の言葉で噛み砕いていきます。
#「同値分割」とは?
そもそもテストを書く目的の1つに、「コードに欠陥があるかどうかの確認」があります。仕様通りにちゃんと動くか、計算式が誤っていないかとか。それをチェックするためにテストコードを書きます。
例えば、プログラムの振る舞いとして、「10歳」と入力したら「未成年」と出て欲しいのに、「成年」と出力されちゃったら、困りますからね。
すごくシンプルな例で考えていきます。現在(2021年)の日本に置いて、「年齢20歳以上は成年、20歳未満は未成年」と定義されています(2022年から民法改正が施行される話は置いといて)
では、「テストケースを考える」という視点に戻します。
0歳から19歳までだったら「未成年」、20歳以降であれば「成年」という出力になることを確認したい場合、一番間違いないのは、「0歳」を使ったときのテストケース、「1歳」を使ったときのテストケース、・・・・から100歳まで(さらにそれ以上)の全てのテストケースを1つずつ記述すれば、間違いなくバグが出ていないか確認できるわけですが、そんな面倒くさいことできませんし、非現実的ですよね。
そこで**「同値分割」**というやり方(手法)を活用します。
「同値分割」とは、ざっくりした言い方にはなりますが、
「同じ結果になるグループ・範囲に分けて、その中からどれか適当に選んだ1つのデータをテストケースに使う」
ということです。
先の例で当てはめると、結果が「未成年」と出力されるのは「0歳から19歳」までのグループ、「成年」と出力される「20歳〜以降」の2つのグループに分けられます。「0歳から19歳」のグループからは適当(代表値)に「10歳」の値、「20歳〜以降」のグループからは適当(代表値)に「75歳」の値を使ってテストコードを書くだけとなります。
「同値分割」というやり方を使わなった時は、100個以上のテストコードを書かなくてはいけなかったのに、「同値分割」を使ったらテストコードは2つで良くなりました。
このことから、「同値分割」は、テストケースを合理的に減らすメリットがある言えます。
ただ、ちょっと気になるのが、グループに分けるのはわかったけど、その中から「適当に」値を決めるのはなんかしっくりきません。
そこで**合理的に値を決める手法(考え方)が「境界値分析」**となります。
#「境界値分析」とは?
「境界値分析」とは先ほどの同値分割で分けたグループ同士の境界の値をテストケースとして使います。
理由は、境界では問題(バグ)が起きやすいから
先ほどの例で行けば、「20歳」が境界値となりますが、もし仕様として
本来「20歳未満の値であれば未成年」と出力されるべきところを、誤って「20歳以下 の値で未成年」というコードを書いていた場合、20歳という値を入力したら「未成年」と誤った出力されることになります。これは不等号の向きの誤りや、=をつけ忘れていたりといったよくありそうな話です(私です)
だから、同値分割した後は、問題が起きそうな境界値を使ってテストデータを作ろうね、って話です。
#終わりに
上記の説明では、同値分割の際に「有効同値クラス」「無効同値クラス」に分類する過程が書いてなかったり、同値分割や境界値分析の活用時に出てくる問題、といったものには触れておりません。
自分もそうですが、初学者にとって、大まかな全体像を把握していないまま、細部について意識が行ってしまうと、結局自分は何を学んでるんだっけ?という迷子状態によくなります。ですから「テスト」という大まかな目的を記した上で「同値分割」「境界値分析」はどんな意味を持つか、という視点で記事を書きました。