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

پیش‌بینی تست صفر و منفی در پایتون؛ تفاوت قدرمطلق و محدودسازی

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

صفر و عددهای منفی رو نباید یک گروه مبهم به اسم «ورودی کوچک» بدونیم. ممکنه قرارداد برای هرکدوم رفتار مستقلی بخواد. مثلاً محدودکردن مقدار به حداقل صفر یعنی منفی‌ها صفر بشن، نه اینکه قدرمطلق بگیریم. abs برای فاصله از صفر مناسبه، اما برای حذف مقدار منفی از شمارش یا موجودی الزاماً قرارداد درست نیست.

مثال تعداد قابل نمایش رو با max(0,value) می‌سازه. در سؤال یک پیاده‌سازی abs داریم و باید ببینی کدام ورودی، باگش رو آشکار می‌کنه. خطای رایج انتخاب صفره چون «مرزی» به نظر میاد؛ اگر دو نسخه در صفر برابرن، اون تست این باگ خاص رو تشخیص نمی‌ده. تست مؤثر باید در نقطه‌ای باشه که رفتار مورد انتظار و رفتار خراب جدا می‌شن. ورودی مثبت هم برای هر دو نسخه یکسانه، پس برای این سؤال قدرت تشخیص نداره. قبل از جواب، خروجی قرارداد و خروجی کد خراب رو برای هر گزینه کنار هم حساب کن.

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

def clamp_zero(value):
    return max(0, value)

assert clamp_zero(-4) == 0
assert clamp_zero(0) == 0
assert clamp_zero(3) == 3

حالا نوبت توئه: قرارداد می‌گوید عدد منفی به 0 تبدیل شود و صفر/مثبت بدون تغییر بماند، اما تابع خراب abs(value) برمی‌گرداند. کدام تست این باگ را واقعاً آشکار می‌کند؟ انتظار را از قرارداد محدودسازی بگیر، نه از تعریف قدرمطلق.

فعالیت شما

قرارداد می‌گوید عدد منفی به 0 تبدیل شود و صفر/مثبت بدون تغییر بماند، اما تابع خراب abs(value) برمی‌گرداند. کدام تست این باگ را واقعاً آشکار می‌کند؟ انتظار را از قرارداد محدودسازی بگیر، نه از تعریف قدرمطلق.

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

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

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

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

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

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

def broken_clamp(value):
    return abs(value)

گزینه‌های پیش‌بینی خروجی

  1. assert broken_clamp(0) == 0
  2. assert broken_clamp(-3) == 0
  3. assert broken_clamp(3) == 3