ソフトウェアテストとは何か
ソフトウェアテストとは、プログラムが正しく動くかを、実際に動かして確かめる作業です。バグが見つかれば、利用者の手に届く前に直せます。
ネット通販で、支払いの画面がときどき止まったとします。注文は消え、客は店を離れます。公開前に見つけていれば、直す手間はずっと小さかったはずです。
このレッスンのゴール
メモ
どの種類のテストが、どの種類の欠陥を見つけるか、説明することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 欠陥 | プログラムの中にある間違い。バグとも呼ぶ | |
| 故障 | 欠陥のせいで、動きが期待と違ってしまうこと | |
| テストケース | 入力と、期待する結果の組 | 120円を3個で、360円 |
| 単体テスト | 関数1つのような、小さな部品だけを確かめるテスト | |
| 結合テスト | 部品どうしのつながりを確かめるテスト | |
| システムテスト | 完成した全体を、利用者の目で確かめるテスト |
学生が入力するセルは、このプレビューでは空白です。
欠陥は原因で、故障は結果
プログラムの中の間違いが欠陥です。その欠陥のせいで、動きが期待と違ってしまうのが故障です。
欠陥があっても、その行が動かなければ、故障は起きません。だから、見えない欠陥が残ります。
テストは、わざと動かして故障を見つけ、そこから欠陥をたどる作業です。
例: 1つの欠陥と見える故障
| 場面 | 欠陥(コードの間違い) | 故障(利用者が見るもの) |
|---|---|---|
| 割引の計算 | 引くところで足している | 割引のはずが値段が上がる |
| 運賃の判定 | 12歳未満を12歳以下と書いた | 12歳が子ども運賃になる |
| ログの集計 | ERROR を error と書いた | エラーの数がいつも0になる |
学生が入力するセルは、このプレビューでは空白です。
ログの故障の記録を見る
grep ERROR /var/log/test.log | head -n 2ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ログの ERROR 行は故障の印
/var/log/test.log は、ラボのマシンが残す動きの記録です。上のコマンドは ERROR を含む行を2行だけ出します。
出力は、日時のあとに ERROR payment service did not answer と続く2行です。支払いのサービスが答えなかった、という意味です。日時は人によって違います。
答えだけが違う故障
python3 -c "print(0.1 + 0.2 == 0.3)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
止まってしまう故障
python3 -c "print(10 / 0)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「テストで故障が出なかったから、バグはない」と考える人が多くいます。実際は、その入力で欠陥の行が動かなかっただけかもしれません。テストは、欠陥があることは示せますが、ないことは示せません。
段階ごとに見つかる欠陥が違う
テストは、確かめる範囲で3つの段階に分かれます。
単体テストは、関数1つを確かめます。速くて、原因も絞れます。結合テストは、部品どうしの受け渡しを確かめます。
システムテストは、利用者と同じ操作で全体を確かめます。遅いですが、全体の流れの欠陥が見つかります。
例: 3つの段階を比べる
| 段階 | 確かめる範囲 | 見つかる欠陥の例 | 速さ |
|---|---|---|---|
| 単体 | 関数1つ | 計算や条件の間違い | 速い |
| 結合 | 部品どうしのつながり | 渡す値の形のずれ | ふつう |
| システム | 完成した全体 | 注文から支払いまでの流れの崩れ | 遅い |
学生が入力するセルは、このプレビューでは空白です。
バグは遅く見つけるほど高くつく
同じ欠陥でも、見つかる時期で直す費用は大きく変わります。
書いた直後なら、書いた本人がすぐ直せます。公開後は、調査、修正、再テスト、お詫びの連絡まで必要です。
下の表の数字は、考え方を見せるための仮のものです。
例: 見つかる時期と費用
| 見つかる時期 | 直す人 | 費用の目安 |
|---|---|---|
| 書いた直後 | 書いた本人 | 約1,000円 |
| 結合テストのとき | 担当者2人 | 約1万円 |
| 公開前のシステムテスト | 担当者4人 | 約5万円 |
| 公開後に利用者から | 担当者と窓口 | 約30万円 |
学生が入力するセルは、このプレビューでは空白です。
5件のバグの費用を出す
# 見つかる時期ごとの費用(円)。説明用の仮の数字です。
cost = {"書いた直後": 1000, "結合テスト": 10000, "公開後": 300000}
bugs = 5
for stage in cost:
print(stage, bugs * cost[stage])
# bugs を 20 に変えて、もう一度実行しましょう。