[テスト] サンプル仕様からテストパターンを考える
はじめに
約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にアクセスする」などがあります。
gender
の値が異なるパターンも想定していますか?
Q. 【異常系】プログラムの処理内で"その他"
と同等の処理が行われますが、想定が異なります。
male
とman
は、どちらも男
で同じ意味を持ちます。
つまり、担当するプログラマーが仕様を間違うとErrorの原因になる
{
"age" : 6,
- "gender" : "male",
+ "gender" : "man",
}
対策としては、「データを定数化し、メンバー内で認識を併せて定数を使い回す」
おわりに
今回はサンプルの仕様についてテストパターンを考えてみましたが、
サンプルの仕様に関連する機能がある場合は、条件が増えるためさらにテストパターンが増えます。
テストは、一見簡単そうな工程と思われますが、とても責任がかかる大事な工程です。
Discussion