金曜日の小さな変更
ある通販会社で、金曜日の夕方に1行だけコードが変わりました。月曜日の朝、数百人のお客さまに、間違った金額の請求書が届きました。
変更はとても小さく、誰も確かめませんでした。3行のテストがあれば、公開の前に気づけたはずです。
このレッスンのゴール
メモ
関数が正しく動くかを確かめるテストを書くことができます。
キーワード
| ことば | いみ | れい |
|---|---|---|
| テスト | コードが正しく動くかを確かめるコードです。 | test_exactly_hundred |
| assert | 正しくないときに、プログラムを止める命令です。 | assert total == 1500 |
| 期待する値 | 関数が返すべき値です。 | |
| 実際の値 | 関数が本当に返した値です。 | |
| 境界の値 | ルールが切り替わる、ちょうどの値です。 | 100個 |
学生が入力するセルは、このプレビューでは空白です。
テストは期待と実際を比べる
テストのすることは、いつも同じです。決まった値で関数を呼び、返ってきた値を、返るべき値と比べます。
比べるには assert を使います。比べた結果が正しければ、何も起きずに先へ進みます。正しくなければ、AssertionError でプログラムが止まります。
実行: ポイントのテスト
def points_for(amount):
# コンビニのポイント: 100円ごとに1ポイントです。
return amount // 100
expected = 5
actual = points_for(560)
print("期待する値:", expected, "実際の値:", actual)
assert actual == expected
print("テストに合格しました")
バグは境界にかくれる
ネットスーパーの送料は、5000円で切り替わります。5000円以上なら無料、それ未満なら500円です。
3000円と8000円を確かめるのは良いことです。でも、それだけでは足りません。よくあるバグは、ちょうど境界にあります。>= を > と書くような間違いです。
だから、良いテストは必ず切り替わる値そのものを確かめます。
例: どの値を確かめるか
| 注文の金額 | 期待する送料 | 確かめる理由 |
|---|---|---|
| 3000円 | 500円 | よくある注文 |
| 4999円 | 500円 | 境界のすぐ下 |
| 5000円 | 0円 | ちょうど境界 |
| 8000円 | 0円 | 大きな注文 |
学生が入力するセルは、このプレビューでは空白です。
練習: 境界を確かめる
def shipping_fee(total):
# ネットスーパー: 5000円以上の注文は送料無料、それ未満は送料500円です。
# 誰かが >= を > と書いてしまいました。
if total > 5000:
return 0
return 500
assert shipping_fee(3000) == 500
print("3000円の注文: 合格")
assert shipping_fee(8000) == 0
print("8000円の注文: 合格")
# ちょうど5000円の注文を確かめる assert を、この下に1行足してください。
# 送料はいくらのはずですか。実行して、何が起きるかを見てください。
よくある誤解
注意
「テストが全部通れば、コードにバグはない」と考える人は多いです。テストが示すのは、確かめた値で正しく動くことだけです。境界を誰も確かめていなければ、バグは残ります。まだ確かめていない値はどれか、いつも考えましょう。
テストは test_ で始まる関数
仕事のプロジェクトでは、テストを一つずつ関数にします。名前は test_ で始めます。
pytest のような道具が、その関数を全部見つけて実行し、失敗したものを教えてくれます。
名前には、何を確かめるかを書きます。test_exactly_hundred なら、失敗したときに見る場所がすぐわかります。