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

اصلاح تست ضعیف پایتون؛ آزمونی که واقعاً باگ بیشینه را می‌گیرد

تست‌نویسی پایتون با assert و آزمون‌های مؤثر · 0٪

تستی که همیشه موفق می‌شه الزاماً تست خوبی نیست. باید بپرسیم آیا یک پیاده‌سازی معقول ولی غلط می‌تونه ازش عبور کنه؟ برای تابع بیشینه، فهرست مثبت و صعودی به‌تنهایی خیلی ضعیفه: نسخه‌ای که فقط آخرین عضو رو برمی‌گردونه هم موفق می‌شه. داده‌ای انتخاب کن که جواب درست رو از رفتار خراب جدا کنه.

مثال برای کمینه، کوچک‌ترین عضو رو وسط فهرست می‌ذاره تا خواندن صرف عضو اول کافی نباشه. فعالیت تو دو باگ شناخته‌شده داره: شروع بیشینه از صفر و برگرداندن آخرین عضو. خطای رایج تغییر جواب مورد انتظار برای سبزشدن تسته؛ انتظار باید از قرارداد مستقل بیاد. تست‌های موجود رو تقویت کن تا نسخه درست قبول و هر دو نسخه خراب رد بشن. ورودی‌ها همیشه فهرست غیرخالی عدد صحیح هستن، پس لازم نیست برای فهرست خالی رفتار تازه‌ای تعریف کنی. wrapper فقط نام نسخه رو به candidate وصل می‌کنه؛ تصمیم تشخیص باگ داخل assertهای تو اتفاق می‌افته.

✍️ مثال حل‌شده:

def test_minimum(candidate):
    assert candidate([8, 2, 6]) == 2

test_minimum(min)

حالا نوبت توئه: test_candidate(candidate) را برای بیشینه فهرست غیرخالی اصلاح کن. حداقل [2,8,3]=>8، [-7,-2,-5]=>-2 و [4]=>4 را assert کن. run_tests("correct") باید True و نسخه‌های starts_at_zero و last_only باید False شوند. wrapper و نسخه‌های آماده را نگه دار؛ آزمون باید خود candidate را اجرا کند.

فعالیت شما

test_candidate(candidate) را برای بیشینه فهرست غیرخالی اصلاح کن. حداقل [2,8,3]=>8، [-7,-2,-5]=>-2 و [4]=>4 را assert کن. run_tests("correct") باید True و نسخه‌های starts_at_zero و last_only باید False شوند. wrapper و نسخه‌های آماده را نگه دار؛ آزمون باید خود candidate را اجرا کند.

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

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

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

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

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

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

def correct(values):
    return max(values)

def starts_at_zero(values):
    return max([0] + values)

def last_only(values):
    return values[-1]

CANDIDATES = {"correct": correct, "starts_at_zero": starts_at_zero, "last_only": last_only}

def test_candidate(candidate):
    assert candidate([1, 2, 3]) == 3

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