برای تست استثنای مورد انتظار، باید هم نوع شکست و هم نبودن شکست رو بررسی کنیم. اگر فقط try/except بنویسیم و بعد هیچ انتظاری نداشته باشیم، تابعی که اصلاً خطا نمیده هم ممکنه از تست عبور کنه. بخش else بعد از try زمانی اجرا میشه که استثنا رخ نداده؛ اینجا جای خوبی برای اعلام شکست آزمونه.
مثال ورودی سن منفی رو نامعتبر میدونه و اگر پذیرفته بشه AssertionError میسازه. فعالیت هم دو ورودی بیرون بازه تخفیف داره. خطای رایج گرفتن هر Exception است؛ در اون صورت یک TypeError یا باگ نامرتبط هم بهعنوان موفقیت تست ثبت میشه. این درس فقط ValueError رو انتظار داره. نسخه درست باید مرزهای صفر و صد رو بپذیره و ورودیهای منفی یک و صدویک رو رد کنه. تست اولیه فقط مرزهای مجاز رو بررسی کرده، پس نبودن اعتبارسنجی رو تشخیص نمیده. آن را با بررسی دو سمت نامعتبر کامل کن و wrapper آماده رو تغییر نده.
✍️ مثال حلشده:
def test_age(candidate):
try:
candidate(-1)
except ValueError:
pass
else:
raise AssertionError("negative age accepted")
حالا نوبت توئه: test_candidate(candidate) را اصلاح کن: candidate(0)==0 و candidate(100)==100 باشد و برای هرکدام از -1 و 101 حتماً ValueError رخ دهد. نبودن استثنا باید تست را با AssertionError رد کند. run_tests("correct") باید True و accepts_negative و accepts_large باید False شوند. ورودیها عدد صحیحاند؛ فقط ValueError را شکست مورد انتظار بدان.
فعالیت شما
test_candidate(candidate) را اصلاح کن: candidate(0)==0 و candidate(100)==100 باشد و برای هرکدام از -1 و 101 حتماً ValueError رخ دهد. نبودن استثنا باید تست را با AssertionError رد کند. run_tests("correct") باید True و accepts_negative و accepts_large باید False شوند. ورودیها عدد صحیحاند؛ فقط ValueError را شکست مورد انتظار بدان.