[テスト] サンプル仕様からテストパターンを考える
はじめに
約 2 年間 QA エンジニアとして活動しておりました。
社内メンバーにテストに関する初歩の知識を共有したく執筆します。
考えた方がいいテスト観点を並べるだけでは、理解が難しいと考えたため
サンプルの仕様を例にしてテストパターンを考えたいと思います。
仕様
年齢と性別を入力欄に値を入力すると
DB から料金の値を返してくれる機能があるとします。

詳細の仕様は下記の通りです
| 利用する人 | 料金 |
|---|---|
0~6歳未満の子供 |
0円 |
6~18歳未満の女の子
|
450円 |
6~18歳未満の男の子
|
500円 |
18歳以上の女性
|
1000円 |
18歳以上の男性
|
1200円 |
例えば、10歳の男の子なら料金は500円になります。
データでイメージするならIutput.jsonが人のデータです。
料金のデータをOutput.jsonで表現します。
{
"age" : 10,
"gender" : "mele"
}
{
"price" : 500
}
いきなり、テストのパターンを考えるのは難しいので、スコープを小さくして考えます。
Q. 【正常系】年齢に関して何パターンを想定したら良いのか
1. まずは、仕様から読み取れるテストパターンを算出する
年齢に関する仕様を表形式にまとめると下記の通りになります。
0 <= age < 6, 6 <= age < 18, age <= 18の3 パターンはテストパターンが必要そうですね。
| 項目 | 内容 |
|---|---|
| 子供 | 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でも型が違う場合でも正しく動作するのか?
{
- "age" : 6,
+ "age" : "6",
"gender" : "famele"
}
2. 数値型じゃなくて浮動小数点数型の場合
ほぼ同じ値を示す6でも型が違う場合でも正しく動作するのか?
{
- "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 にならないのか?
{
- "age" : 6,
+ "agee" : 6,
"gender" : "famele"
}
Q. 【異常系】余分な Key が追加されているパターンも想定していますか
プログラムの処理内で"name"という余分な Key があった場合でも期待通りのOutput.jsonが返ってくるか?
{
"age" : 6,
"gender" : "famele",
+ "name" : "taro",
}
Q. 【異常系】必要な Key が不足しているパターンも想定していますか
"age"という Key が見つからなく Error にならないのか?
{
- "age" : 6,
"gender" : "famele",
}
Q. 【異常系】もし DB に返る値がないパターンも想定していますか
DB に必ずしもデータがあるとは限りません。
対象のデータがない場合も Error を発生させず、システムを止めない対策が必要です。
例えば、「DB から取得した値が 0 件かどうか確認する処理」を追加するのも対策の 1 つです。
Q. 【異常系】もし DB にアクセスする途中で通信 Error が発生するパターンも想定していますか
DB にもデータがあり、検索の条件のデータも正しくても DB にアクセスが何かしらの理由でアクセス出来ない場合があります。
その場合にも対策が必要です。
例えば、「アクセス出来なかったら、代わりにデータを表示させる。」「少し時間を空けてもう一度 DB にアクセスする」などがあります。
Q. 【異常系】genderの値が異なるパターンも想定していますか
プログラムの処理内で"その他"と同等の処理が行われますが、想定が異なります。
maleとmanは、どちらも男で同じ意味を持ちます。
つまり、担当するプログラマーが仕様を間違うと Error の原因になる
{
"age" : 6,
- "gender" : "male",
+ "gender" : "man",
}
対策としては、「データを定数化し、メンバー内で認識を併せて定数を使い回す」
おわりに
今回はサンプルの仕様についてテストパターンを考えてみましたが、
サンプルの仕様に関連する機能がある場合は、条件が増えるためさらにテストパターンが増えます。
テストは、一見簡単そうな工程と思われますが、とても責任がかかる大事な工程です。
Discussion