ちょうど1mの棚
ある市役所では、粗大ごみの手数料を、品物の一番長い辺で決めています。50cm以下は300円、100cm以下は600円、それより長いと1,000円です。
申し込みサイトの計算は、AIが書いたコードでした。担当者は、30cmと150cmで試して、問題なしとしました。
ところが、ちょうど100cmの棚を申し込んだ市民に、1,000円と表示されました。
このレッスンのゴール
メモ
自分で考えたケースで、AIのコードをテストできる。
今日のキーワード
| ことば | いみ | れい |
|---|---|---|
| テストケース | 入力と、期待する結果の組です。 | |
| 期待する結果 | 要件から決めた、正しい答えです。 | |
| 通常のケース | ふだんよく来る入力です。 | 30cm |
| 境界のケース | ルールが切り替わる、ちょうどの値です。 | 100cm |
| 異常なケース | めったにないが、起こりうる入力です。 | 0cm、マイナス |
学生が入力するセルは、このプレビューでは空白です。
期待する結果は要件から決める
テストケースは、入力と期待する結果の組です。
期待する結果は、コードを実行する前に、要件から決めます。先に実行してから決めると、出てきた答えをそのまま正しいと思ってしまいます。
市役所の要件は「100cm以下は600円」です。だから、100cmの期待する結果は600円です。
やってみよう: 手数料のテスト
# 粗大ごみの手数料: 50cm以下は300円、100cm以下は600円、それより長いと1000円。
# AIが書いた関数です。
def fee(length):
if length <= 50:
return 300
if length < 100:
return 600
return 1000
# テストケース: [長さ(cm), 期待する手数料(円), 説明]
cases = [
[30, 300, "通常: 小さな椅子"],
[150, 1000, "通常: 大きな本棚"],
[100, 600, "境界: ちょうど100cmの棚"],
]
for case in cases:
result = fee(case[0])
if result == case[1]:
print("合格", case[2])
else:
print("失敗", case[2], "期待:", case[1], "結果:", result)
# 3つとも合格になるように、関数を1か所だけ直しましょう。
ケースは3種類から選ぶ
通常のケースは、毎日のように来る入力です。境界のケースは、ルールが切り替わるちょうどの値です。50cmや100cmがそうです。
異常なケースは、めったにないが起こりうる入力です。0cm、マイナスの長さ、空の入力などです。
AIは、通常のケースはよく当てます。まちがいは、境界と異常に隠れています。
手数料のテストケース
| 長さ | 種類 | 期待する結果 |
|---|---|---|
| 30cm | 通常 | 300円 |
| 150cm | 通常 | 1,000円 |
| 50cm | 境界 | 300円 |
| 51cm | 境界 | 600円 |
| 100cm | 境界 | 600円 |
| 0cm | 異常 | 要件にない: 担当者に聞く |
学生が入力するセルは、このプレビューでは空白です。
やってみよう: ケースを足す
# 要件: 市役所の窓口は、8時30分から17時15分まで受け付けます。
# 時刻は「時」と「分」の2つの整数で渡します。
def is_open(hour, minute):
now = hour * 60 + minute
return now >= 8 * 60 + 30 and now <= 17 * 60 + 15
# ケースを足しましょう。通常、境界、異常を1つ以上ずつ書きます。
# [時, 分, 期待する結果(True か False)]
cases = [
[10, 0, True],
]
for case in cases:
print(case[0], "時", case[1], "分 期待:", case[2], "結果:", is_open(case[0], case[1]))
よくある誤解
注意
多くの人は、コードを書いたAIにテストも書かせれば十分だと考えます。AIが要件を読みちがえていたら、テストも同じまちがいをします。期待する結果は、自分で要件から決めましょう。