حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش دیباگ و تست‌نویسی در پایتون؛ رفع خطا با تمرین

رفع تست ورودی نامعتبر پایتون؛ انتظار ValueError برای تخفیف خارج بازه

تست حالت‌های مرزی و ورودی نامعتبر در پایتون · 0٪

برای تست استثنای مورد انتظار، باید هم نوع شکست و هم نبودن شکست رو بررسی کنیم. اگر فقط 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 را شکست مورد انتظار بدان.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def correct(percent):
    if percent < 0 or percent > 100:
        raise ValueError("discount outside range")
    return percent

def accepts_negative(percent):
    if percent > 100:
        raise ValueError("discount outside range")
    return percent

def accepts_large(percent):
    if percent < 0:
        raise ValueError("discount outside range")
    return percent

CANDIDATES = {"correct": correct, "accepts_negative": accepts_negative, "accepts_large": accepts_large}

def test_candidate(candidate):
    assert candidate(0) == 0
    assert candidate(100) == 100

def run_tests(candidate_name):
    candidate = CANDIDATES[candidate_name]
    try:
        test_candidate(candidate)
        return True
    except Exception:
        return False