[テスト] サンプル仕様からテストパターンを考える
はじめに
約 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",
}
対策としては、「データを定数化し、メンバー内で認識を併せて定数を使い回す」
おわりに
今回はサンプルの仕様についてテストパターンを考えてみましたが、
サンプルの仕様に関連する機能がある場合は、条件が増えるためさらにテストパターンが増えます。
テストは、一見簡単そうな工程と思われますが、とても責任がかかる大事な工程です。
YouTube のご案内
ポモドーロタイマー(25 分勉強+ 5 分休憩)を活用した作業・勉強配信を行っています。
集中したいときや、誰かと一緒に頑張りたいときに、ぜひご活用ください。
ご興味のある方は、ぜひお気軽に遊びに来てください!
「Zenn から来ました!!」とコメントを貰えると泣いて喜びます 🤣
Discussion