وجود هر خطایی بهمعنی اجرای درست قرارداد نیست. اگر یک تابع قول داده برای مخرج صفر ValueError بده، ZeroDivisionError هم باید در تست رد بشه؛ چون نوع استثنا بخشی از رابط تابع است. آزمون باید هم مسیر عادی رو بسنجه و هم ورودیای که نوع خطای مشخصی ازش انتظار داریم.
مثال برای جستوجوی عضو غایب، فقط LookupError مورد انتظار رو میپذیره. توی فعالیت یک نسخه هیچ خطایی نمیده و نسخه دیگر تقسیم خام انجام میده. خطای رایج except Exception:pass است؛ اون تست هر دو نوع استثنا رو یکسان موفق میدونه و تشخیص قرارداد رو از دست میده. داخل تست فقط ValueError رو بگیر و اگر هیچ استثنایی نیومد، با else شکست رو اعلام کن. wrapper بیرونی عمداً هر شکست تست رو به False تبدیل میکنه تا نتیجه JSONپذیر باشه؛ اون wrapper به معنی مجازبودن استثنای دلخواه در خود قرارداد نیست. نسخه درست باید بدون شکست از مجموعه تست تو عبور کنه.
✍️ مثال حلشده:
def test_missing(candidate):
try:
candidate("missing")
except LookupError:
pass
else:
raise AssertionError("missing item accepted")
حالا نوبت توئه: test_candidate(candidate) را برای تقسیم تکمیل کن: (8,2)=>4 و (5,2)=>2.5 و برای (8,0) حتماً ValueError انتظار داشته باش. run_tests("correct") باید True و silent_zero و wrong_exception باید False شوند. فقط ValueError را در تست بگیر؛ ZeroDivisionError یا نبودن استثنا نباید موفقیت حساب شود. wrapper نام نسخه را نگه دار.
فعالیت شما
test_candidate(candidate) را برای تقسیم تکمیل کن: (8,2)=>4 و (5,2)=>2.5 و برای (8,0) حتماً ValueError انتظار داشته باش. run_tests("correct") باید True و silent_zero و wrong_exception باید False شوند. فقط ValueError را در تست بگیر؛ ZeroDivisionError یا نبودن استثنا نباید موفقیت حساب شود. wrapper نام نسخه را نگه دار.