境界値テストで実際の不具合を見つける
目標
料金関数の正常な実装と、8種類の欠陥のある実装に対して、同じpytestのテストを実行します。
なぜ重要なのか
正常なリクエストが1回成功したからといって、境界値や障害からの復旧が保証されるわけではありません。このラボでは、各関数の契約を小さく実装またはテストしたうえで、実際の実行につなげます。コードが存在するかどうかやレポートの文言だけを見るのではなく、結果・例外・保存状態を検査します。前のステップのコードを維持したまま、次のステップへ進んでください。
ステップ
/root/work/test-boundaries-lab/test_service.pyで、price(0)がちょうど0であることをassertするpytestのテストを作成してください。関数を呼び出すだけ、あるいは結果がintかどうかを検査するだけでは不十分です。最初の準備は次のコマンドで行います。
mkdir -p /root/work/test-boundaries-lab
cp /opt/fixtures/practice_depth/test-boundaries-lab/* /root/work/test-boundaries-lab/
cd /root/work/test-boundaries-lab
/root/work/test-boundaries-lab/test_service.pyで、price(1)の金額が350であることをテストしてください。既存の0個のテストも維持します。/root/work/test-boundaries-lab/test_service.pyで、price(9)が3150であることをテストしてください。9個から誤って割引する実装を検出する必要があります。/root/work/test-boundaries-lab/test_service.pyで、price(10)が3000であることをテストしてください。10個では割引しないという、>条件のエラーを検出します。/root/work/test-boundaries-lab/test_service.pyで、price(11)が3300であることをテストしてください。割引区間全体を固定の3000ウォンで返す実装を検出します。/root/work/test-boundaries-lab/test_service.pyで、price(100)は30000であり、price(101)はValueErrorになることを、pytest.raisesで確認してください。/root/work/test-boundaries-lab/test_service.pyで、price(-1)がValueErrorになることをテストしてください。負の料金を返すことを正常な処理とは見なしません。/root/work/test-boundaries-lab/test_service.pyで、True、False、1.0、'1'、NoneがすべてTypeErrorになることを、パラメータ化したテストとして追加してください。特に、boolをintとして受け入れてしまう欠陥を検出する必要があります。
参考
- パッケージはイメージにインストールされています。インターネット接続やpip installは必要ありません。
- 準備のコピーは最初の1回だけ行ってください。もう一度コピーすると、作業ファイルが初期化されます。
/root/work/test-boundaries-lab/service.pyは、最初の準備でコピーしたローカル実行用の提供コードです。修正したり、例のコードで上書きしたりせず、test_service.pyだけを作成してください。- テストは
from service import ...で提供関数を読み込んでください。採点は、別の一時ディレクトリにテストだけをコピーし、正常な実装と欠陥のある実装で実行します。ステップごとに、実際のテスト実行中にその欠陥を検出する必要があり、正常なコードでは、実行したテストがすべて成功しなければなりません。収集エラー・インポートエラー・強制終了は検出として認められません。外部ファイルやネットワークに頼らないでください。 - 各ステップの採点は45秒以内に実行されます。無限ループや実際の待機を作らないでください。
空の注文への最低料金の請求を防ぐ
/root/work/test-boundaries-lab/test_service.pyで、price(0)がちょうど0であることをassertするpytestのテストを作成してください。関数を呼び出すだけ、あるいは結果がintかどうかを検査するだけでは不十分です。最初の準備は次のコマンドで行います。
mkdir -p /root/work/test-boundaries-lab
cp /opt/fixtures/practice_depth/test-boundaries-lab/* /root/work/test-boundaries-lab/
cd /root/work/test-boundaries-lab
空の注文にも350ウォンを請求する欠陥を思い浮かべてください。
採点はbash /opt/lab/checks/test-boundaries-lab/01-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
最小の有効数量を確認する
/root/work/test-boundaries-lab/test_service.pyで、price(1)の金額が350であることをテストしてください。既存の0個のテストも維持します。
価格が正の数であるという検査では、400ウォンを請求するバグがすり抜けます。
採点はbash /opt/lab/checks/test-boundaries-lab/02-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
割引直前の境界を押さえる
/root/work/test-boundaries-lab/test_service.pyで、price(9)が3150であることをテストしてください。9個から誤って割引する実装を検出する必要があります。
割引開始の直前の値は、ありふれた中間値とは違う役割を果たします。
採点はbash /opt/lab/checks/test-boundaries-lab/03-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
割引の開始点を含める
/root/work/test-boundaries-lab/test_service.pyで、price(10)が3000であることをテストしてください。10個では割引しないという、>条件のエラーを検出します。
境界で真になるべき条件かどうか、方針の表をもう一度読んでみてください。
採点はbash /opt/lab/checks/test-boundaries-lab/04-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
割引後の金額を定数と取り違えない
/root/work/test-boundaries-lab/test_service.pyで、price(11)が3300であることをテストしてください。割引区間全体を固定の3000ウォンで返す実装を検出します。
境界の1点だけを検査すると、割引区間の傾きが間違っていても気づけません。
採点はbash /opt/lab/checks/test-boundaries-lab/05-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
上限の内側と外側を一緒に検証する
/root/work/test-boundaries-lab/test_service.pyで、price(100)は30000であり、price(101)はValueErrorになることを、pytest.raisesで確認してください。
もっとも大きい有効な値と、そのすぐ次の無効な値を、1組として扱います。
採点はbash /opt/lab/checks/test-boundaries-lab/06-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
負の入力を成功扱いにしない
/root/work/test-boundaries-lab/test_service.pyで、price(-1)がValueErrorになることをテストしてください。負の料金を返すことを正常な処理とは見なしません。
try/exceptで何もしないと、例外が起きなくてもテストが通ってしまうことがあります。pytest.raisesを使ってください。
採点はbash /opt/lab/checks/test-boundaries-lab/07-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。
boolと数字の形をした文字列を拒否する
/root/work/test-boundaries-lab/test_service.pyで、True、False、1.0、'1'、NoneがすべてTypeErrorになることを、パラメータ化したテストとして追加してください。特に、boolをintとして受け入れてしまう欠陥を検出する必要があります。
type(x)とisinstance(x, int)の違いが表れる入力を含めます。テストは、実装のソースではなく、公開関数を呼び出す必要があります。
採点はbash /opt/lab/checks/test-boundaries-lab/08-contract.shで直接再現できます。ファイルを保存してから、もう一度実行してください。