自分で試験する
まん中は必ず通る
生成されたコードを試すとき、多くの人は「ふつうの入力」を入れます。300円と200円を足して500円になった、よし動いた、という確かめ方です。
これはほとんど意味がありません。AI が返すコードは、ふつうの入力ではまず通ります。そこが通ることを確かめても、新しい情報は増えません。
壊れるのはいつも端です。
端を4方向から叩く
端の探し方には型があります。おこづかい帳なら次の4つです。
プレーンテキスト
空 レコードが1件も無いとき
1件 最小の個数のとき
0 金額が0円のとき、月の残高がちょうど0のとき
極端 金額が負のとき、桁がとても大きいとき「1か月の平均支出を出して」と頼んだコードを考えます。ふつうの月なら正しく出ます。では支出が1件も無い月はどうでしょうか。件数で割る実装なら、ゼロ除算で落ちます。
Python
def average(records):
return sum(r["amount"] for r in records) / len(records)空リストを渡した瞬間に ZeroDivisionError です。ふつうの入力では絶対に見つかりません。
境界は「含む・含まない」で割れる
もう1つの典型が、しきい値のまわりです。「1000円以上の支出を高額として抽出して」と頼んだとします。
プレーンテキスト
999円 入らない
1000円 入る? 入らない?
1001円 入るちょうど1000円がどちらになるかは、>= と > のどちらで書かれたかで変わります。指示のときに決めていなければ、AI が勝手に決めています。だから試すべきはちょうど1000円です。999と1001は、どちらの実装でも同じ結果になるので、試しても割れません。
境界値は、実装が割れる1点を狙って入れる。これが試験のコツです。
試す順番
手を動かす順序は次のとおりです。
プレーンテキスト
1 仕様で「こうなるはず」を先に紙に書く
2 そのとおりの値を入れて動かす
3 違ったら、コードではなく仕様のほうを先に疑う3が大事です。自分の期待が間違っていることもあります。先に期待を書いてから動かすと、あとから結果に合わせて期待を作り変えてしまう事故を防げます。
演習
kakeibo.py の average_amount は、1件以上あれば正しく動きます。空リストで落ちます。また、平均の端数の扱いが決まっていません。落ちない形にして、端数の扱いも決めてください。
完成条件
- 触ってよいのは kakeibo.py だけです
- 空リストのときは 0 を返します
- 平均は小数を切り捨てて整数で返します