TT Lab
はじめる
学ぶ 学習パス コース

テストツール実戦

境界値テストで実際の不具合を見つける

TT Labで続きを見る

目標

料金関数の正常な実装と、8種類の欠陥のある実装に対して、同じpytestのテストを実行します。

なぜ重要なのか

正常なリクエストが1回成功したからといって、境界値や障害からの復旧が保証されるわけではありません。このラボでは、各関数の契約を小さく実装またはテストしたうえで、実際の実行につなげます。コードが存在するかどうかやレポートの文言だけを見るのではなく、結果・例外・保存状態を検査します。前のステップのコードを維持したまま、次のステップへ進んでください。

ステップ

  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
  1. /root/work/test-boundaries-lab/test_service.pyで、price(1)の金額が350であることをテストしてください。既存の0個のテストも維持します。
  2. /root/work/test-boundaries-lab/test_service.pyで、price(9)が3150であることをテストしてください。9個から誤って割引する実装を検出する必要があります。
  3. /root/work/test-boundaries-lab/test_service.pyで、price(10)が3000であることをテストしてください。10個では割引しないという、>条件のエラーを検出します。
  4. /root/work/test-boundaries-lab/test_service.pyで、price(11)が3300であることをテストしてください。割引区間全体を固定の3000ウォンで返す実装を検出します。
  5. /root/work/test-boundaries-lab/test_service.pyで、price(100)は30000であり、price(101)はValueErrorになることを、pytest.raisesで確認してください。
  6. /root/work/test-boundaries-lab/test_service.pyで、price(-1)がValueErrorになることをテストしてください。負の料金を返すことを正常な処理とは見なしません。
  7. /root/work/test-boundaries-lab/test_service.pyで、True、False、1.0、'1'、NoneがすべてTypeErrorになることを、パラメータ化したテストとして追加してください。特に、boolをintとして受け入れてしまう欠陥を検出する必要があります。

参考

空の注文への最低料金の請求を防ぐ

/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で直接再現できます。ファイルを保存してから、もう一度実行してください。