🧪

【テスト】サンプル仕様からテストパターンを考える

2023/08/06に公開

はじめに

約2年間QAエンジニアとして活動しておりました。
社内メンバーにテストに関する初歩の知識を共有したく執筆します。

考えた方がいいテスト観点を並べるだけでは、理解が難しいと考えたため
サンプルの仕様を例にしてテストパターンを考えたいと思います。

仕様

年齢性別を入力欄に値を入力すると
DBから料金の値を返してくれる機能があるとします。
test-image

詳細の仕様は下記の通りです

利用する人 料金
0~6歳未満の子供 0
6~18歳未満の女の子 450
6~18歳未満の男の子 500
18歳以上の女性 1000
18歳以上の男性 1200

例えば、10歳の男の子なら料金は500円になります。

データでイメージするならIutput.jsonが人のデータです。
料金のデータをOutput.jsonで表現します。

Iutput.json
{
    "age" : 10,
    "gender" : "mele"
}
Output.json
{
    "price" : 500
}

いきなり、テストのパターンを考えるのは難しいので、スコープを小さくして考えます。

Q. 【正常系】年齢に関して何パターンを想定したら良いのか?

1. まずは、仕様から読み取れるテストパターンを算出する

年齢に関する仕様を表形式にまとめると下記の通りになります。
0 <= age < 6, 6 <= age < 18, age <= 183パターンはテストパターンが必要そうですね。

項目 内容
子供 0 <= age < 6
学生 6 <= age < 18
成人 age <= 18

しかし、これだけではテストパターンは不十分です。
境界値分析同値分割法の観点でテストパターンを追加できるか確認しましょう

「境界値分析」とは?

境界値分析とはブラックボックステスト技法の一つであり、境界となる値(同値クラスの端) とその前後の値に対してテストする技法です。

「同値分割法」とは?

同値分割法は、ブラックボックステスト技法の一つであり、入力値により同じ処理をするグループに分割し、グループ内で代表的な入力値を選択しテストする技法です。

2. 境界値分析(境界となる値)を考慮したら?

  • 0 <= age < 6に対して「0,6」が考えられる
  • 6 <= age < 18に対して「6,18」が考えられる
  • age <= 18に対して「18」が考えられる

3. 境界値分析(境界値の前後の値)を考慮したら?

  • 0 <= age < 6に対して「-1,1,5,7」が考えられる
  • 6 <= age < 18に対して「5,7,17,19」が考えられる
  • age <= 18に対して「17,19」が考えられる

4. 境界値分析を考慮結果まとめると。。。

年齢に対する「-1,0,1,5,6,7,17,18,19」の9パターンが想定出来ます。

5. 同値分割法を考慮したら?

※代表的な入力値は、入力範囲内であれば大丈夫です.
入力範囲の中央の値を考えると考えやすい

  • 0 <= age < 6に対して「-3,3,9」が考えられる
  • 6 <= age < 18に対して「3,9,21」が考えられる
  • age <= 18に対して「9,21」が考えられる

5. 境界値分析と同値分割法を考慮結果まとめると。。。

年齢に対する「-3,-1,0,1,3,5,6,7,9,17,18,19,21」の13パターンが想定出来ます。

Q. 【正常系】性別に関して何パターンを想定したら良いのか?

1. まずは、仕様から読み取れるテストパターンを算出する

男性, 女性2パターンはテストパターンが必要そうですね。

しかし、これだけではテストパターンは不十分です。
同様に境界値分析同値分割法の観点でテストパターンを追加できるか確認しましょう

2. 境界値分析と同値分割法を考慮したら?

男性, 女性以外の選択肢としてその他が想定出来ます.
性別に対する男性,女性,その他3パターンが想定出来ます。

3. 境界値分析と同値分割法を考慮結果まとめると。。。

性別に対する男性,女性,その他3パターンが想定出来ます。

Q. 正常系で想定されるテストパターンとは?

つまり、年齢に対するの13パターンと性別に対して3パターン39パターンが想定出来ます。

年齢 女性 男性 その他
-3 0円 0円 Error
-1 0円 0円 Error
0 0円 0円 Error
1 0円 0円 Error
3 0円 0円 Error
5 0円 0円 Error
6 450円 500円 Error
7 450円 500円 Error
9 450円 500円 Error
17 450円 500円 Error
18 1000円 1200円 Error
19 1000円 1200円 Error
21 1000円 1200円 Error

Q. 【異常系】入力値の型が違うパターンも想定していますか?

1. 数値型じゃなくて文字列型の場合

同じ6でも型が違う場合でも正しく動作するのか?

Iutput.json
{
-    "age" : 6,
+    "age" : "6",
    "gender" : "famele"
}

2. 数値型じゃなくて浮動小数点数型の場合

ほぼ同じ値を示す6でも型が違う場合でも正しく動作するのか?

Iutput.json
{
-    "age" : 6,
+    "age" : 6.0,
    "gender" : "famele"
}

データ型の一覧

データ型 説明
整数(int型) 小数を含まない値を扱うためのデータ型。 0、 1、 100、 999、 -123
小数(float型、double型) 小数を含む値を扱うためのデータ型。 1.23、3.14、 -99.9
文字列(String型) 文字列を扱うためのデータ型。ダブルクオテーション(“)でくくります。 ”ABC”、“TOKYO”、“プログラミング”
論理型(boolean型) 「真」「偽」を扱うためのデータ型。 true, false
日付型(datetime型) 「日付」や「時間」を扱うためのデータ型。 true, false
null型 「値が存在しないこと」を扱うためのデータ型。 null

Q. 【異常系】Keyの値が間違っているパターンも想定していますか?

プログラムの処理内で"age"というKeyを探す処理があると思いますが、"age"というKeyが見つからなくErrorにならないのか?

Iutput.json
{
-    "age" : 6,
+    "agee" : 6,
    "gender" : "famele"
}

Q. 【異常系】余分なKeyが追加されているパターンも想定していますか?

プログラムの処理内で"name"という余分なKeyがあった場合でも期待通りのOutput.jsonが返ってくるか?

Iutput.json
{
    "age" : 6,
    "gender" : "famele",
+    "name" : "taro",
}

Q. 【異常系】必要なKeyが不足しているパターンも想定していますか?

"age"というKeyが見つからなくErrorにならないのか?

Iutput.json
{
-    "age" : 6,
    "gender" : "famele",
}

Q. 【異常系】もしDBに返る値がないパターンも想定していますか?

DBに必ずしもデータがあるとは限りません。
対象のデータがない場合もErrorを発生させず、システムを止めない対策が必要です。
例えば、「DBから取得した値が0件かどうか確認する処理」を追加するのも対策の1つです。

Q. 【異常系】もしDBにアクセスする途中で通信Errorが発生するパターンも想定していますか?

DBにもデータがあり、検索の条件のデータも正しくてもDBにアクセスが何かしらの理由でアクセス出来ない場合があります。
その場合にも対策が必要です。
例えば、「アクセス出来なかったら、代わりにデータを表示させる。」「少し時間を空けてもう一度DBにアクセスする」などがあります。

Q. 【異常系】genderの値が異なるパターンも想定していますか?

プログラムの処理内で"その他"と同等の処理が行われますが、想定が異なります。
malemanは、どちらもで同じ意味を持ちます。
つまり、担当するプログラマーが仕様を間違うとErrorの原因になる

Iutput.json
{
    "age" : 6,
-    "gender" : "male",
+    "gender" : "man",
}

対策としては、「データを定数化し、メンバー内で認識を併せて定数を使い回す」

おわりに

今回はサンプルの仕様についてテストパターンを考えてみましたが、
サンプルの仕様に関連する機能がある場合は、条件が増えるためさらにテストパターンが増えます。
テストは、一見簡単そうな工程と思われますが、とても責任がかかる大事な工程です。

GitHubで編集を提案

Discussion