テストを書かせる
手で試すのは1回しか効かない
前の回で、境界値を自分で叩きました。あれは強力ですが弱点があります。次にコードを変えたとき、もう一度全部やり直さないといけません。
人間は3回目でやらなくなります。だから機械にやらせます。それが自動テストです。
自動テストは、期待する値をコードとして書き残したものです。おこづかい帳の合計なら、次のような形になります。
Python
def test_total():
assert total_amount([{"amount": 300}, {"amount": 200}]) == 500
def test_total_empty():
assert total_amount([]) == 0一度書けば、以後は実行するだけで全部の確認が終わります。
テストを頼むときに書くこと
「テストを書いて」だけで頼むと、AI はふつうの入力のテストを3つ書いて終わりにしがちです。まん中しか通らないテストは、無いのとあまり変わりません。
頼むときは、どの場合を確かめてほしいのかを列挙します。
プレーンテキスト
悪い total_amount のテストを書いて
良い total_amount のテストを書いてください。
次の場合をそれぞれ確かめてください。
ふつうの2件、空リスト、amount が無いレコードが混ざる場合、
金額が負の場合。前の回で自分が叩いた境界値が、そのまま列挙する項目になります。手で試した内容をテストに移すと考えてください。
テスト自体も生成物である
ここが落とし穴です。AI が書いたテストが全部通ったとき、意味は2つに割れます。
プレーンテキスト
可能性A コードが正しい
可能性B コードの現在の挙動に合わせてテストが書かれたB は実際に起こります。実装を読んで、その実装が返す値をそのまま期待値にしたテストです。これは何も検証していません。バグごと固定しているだけです。
見分け方は簡単です。期待値を自分で読んで、仕様と合っているかを確かめます。先ほどの例なら、空リストのとき 0 を期待しているか、それとも None を期待しているか。仕様として自分が決めた値と違うなら、直すのはテストではなくコードです。
落ちるところから始める
テストを信用する一番速い方法は、一度落としてみることです。
プレーンテキスト
1 テストを書かせる
2 実行して全部通ることを見る
3 コードをわざと1行壊す
4 テストが落ちることを確かめる
5 戻す3で壊しても全部通るなら、そのテストは何も見ていません。この確認は10秒で終わります。
演習
kakeibo.py の count_over は、しきい値以上の支出の件数を数える関数です。いまは境界の扱いが間違っていて、ちょうどしきい値と同じ金額を数えません。境界を含む形に直させてください。しきい値ちょうどをどう扱うかを、必ず指示に書いてください。
完成条件
- 触ってよいのは kakeibo.py だけです
- しきい値と同じ金額は数えます
- count_over 関数の戻り値で採点します