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

تست استثنای مورد انتظار پایتون؛ رد نوع اشتباه خطا

آزمون چند تابع و اجرای مجموعه تست پایتون · 0٪

وجود هر خطایی به‌معنی اجرای درست قرارداد نیست. اگر یک تابع قول داده برای مخرج صفر 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 نام نسخه را نگه دار.

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

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

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

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

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

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

def correct(numerator, denominator):
    if denominator == 0:
        raise ValueError("zero denominator")
    return numerator / denominator

def silent_zero(numerator, denominator):
    return 0 if denominator == 0 else numerator / denominator

def wrong_exception(numerator, denominator):
    return numerator / denominator

CANDIDATES = {"correct": correct, "silent_zero": silent_zero, "wrong_exception": wrong_exception}

def test_candidate(candidate):
    # نتیجه عادی و نوع خطای صفر
    pass

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