یک تست معمولاً فقط یک بخش از قرارداد رو میسنجه. برای تابع شمارش، حالت خالی، چند عضو مناسب و عضوهای نامناسب هرکدوم اطلاعات متفاوتی میدن. هدف زیادکردن تعداد assertها بدون دلیل نیست؛ هر تست باید احتمال یک باگ مشخص رو کم کنه. دو ورودی خیلی شبیه ممکنه عملاً همان رفتار رو دوباره بررسی کنن.
مثال شمارش رشتههای بلند رو در حالت معمول و خالی میسنجه. فعالیت شمارش زوجها به چند ورودی مکمل نیاز داره، چون نسخههای خراب مختلفی آماده شده. خطای رایج تعریف انتظار بهصورت candidate(values) است؛ اون وقت تست هیچ معیار مستقلی نداره. عدد مورد انتظار رو با شمردن دستی عضوها تعیین کن. صفر و منفی زوج هم باید در شمارش سهم داشته باشن. تست تو تابع candidate رو میگیره، پس نباید به اسم نسخه درست وابسته باشه. wrapper هر بار یکی از نسخهها رو انتخاب میکنه و یک بولی درباره موفقیت مجموعه assertهای تو برمیگردونه؛ False اینجا یعنی نسخه توسط تست رد شده.
✍️ مثال حلشده:
def test_long_count(candidate):
assert candidate([]) == 0
assert candidate(["a", "book", "web"]) == 2
def long_count(values):
return sum(len(item) >= 3 for item in values)
test_long_count(long_count)
حالا نوبت توئه: برای تابع شمارش زوجها test_candidate(candidate) بنویس. []=>0، [1,2,4]=>2، [-2,0,3]=>2 و [1,3]=>0 را بررسی کن. run_tests("correct") باید True و empty_bug، first_only و positive_only همگی False باشند. ورودی فقط فهرست عدد صحیح است؛ هر assert باید انتظار مستقل عددی داشته باشد.
فعالیت شما
برای تابع شمارش زوجها test_candidate(candidate) بنویس. []=>0، [1,2,4]=>2، [-2,0,3]=>2 و [1,3]=>0 را بررسی کن. run_tests("correct") باید True و empty_bug، first_only و positive_only همگی False باشند. ورودی فقط فهرست عدد صحیح است؛ هر assert باید انتظار مستقل عددی داشته باشد.