3秒でわかる
作ったものが仕様どおりに動くかを確かめる活動全般。単体・結合・E2Eと範囲の違う層を組み合わせ、壊れた箇所を早く安く見つけるために行います。
30秒図解
もう少し詳しく
どういうものか
ソフトウェアテストは、実装が意図どおりに動くかを確かめる活動の総称です。対象の範囲によって層に分かれます。
| 層 | 対象 | 特徴 |
|---|---|---|
| 単体テスト | 関数やクラス 1 つ | 速い。原因の場所がすぐ分かる |
| 結合テスト | 複数モジュールや DB との接続 | 組み合わせの不整合を捕まえる |
| E2E テスト | ブラウザ操作を含む一連の流れ | 利用者に近いが遅く壊れやすい |
数の比率は、下の層ほど多く上の層ほど少ないのが定石で、この形をテストピラミッドと呼びます。
なぜ必要か
バグは、見つかるのが遅いほど直す費用が上がります。書いた直後なら数分、本番で見つかれば調査、修正、再デプロイ、影響を受けた利用者への対応まで発生します。テストは、この発見時期を前倒しする投資です。
もう 1 つの効き目が、変更を怖がらなくなることです。テストが無いコードは、動いているという理由だけで誰も触れなくなり、少しずつ古びていきます。
具体例
import pytest
from billing import calc_fee
def test_通常の手数料は3パーセント():
assert calc_fee(1000) == 30
def test_1円未満は切り上げる():
assert calc_fee(101) == 4 # 3.03 -> 4
def test_0円なら0円():
assert calc_fee(0) == 0
def test_負の金額は例外():
with pytest.raises(ValueError):
calc_fee(-1)境界となる値(0、1 円未満の端数、負の値)を並べている点が要点です。テスト名を日本語にすると、失敗したときの一覧がそのまま仕様の説明になります。
つまずきやすいところ
似た用語との違い
| 用語 | 意味 |
|---|---|
| デバッグ | 見つかった不具合の原因を追って直す作業 |
| テスト | 不具合があるかどうかを確かめる作業 |
| 回帰テスト | 直した箇所以外が壊れていないかの再確認 |
覚え方
テストは「見つける」、デバッグは「直す」。まず落ちるテストで問題を固定してから直すと、直った証拠がその場で手に入ります。