🧪

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

に公開

はじめに

約 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",
}

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

おわりに

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

YouTube のご案内

ポモドーロタイマー(25 分勉強+ 5 分休憩)を活用した作業・勉強配信を行っています。
集中したいときや、誰かと一緒に頑張りたいときに、ぜひご活用ください。

ご興味のある方は、ぜひお気軽に遊びに来てください!
「Zenn から来ました!!」とコメントを貰えると泣いて喜びます 🤣

GitHubで編集を提案

Discussion