بعضی تابعها طبق قرارداد ورودی رو تغییر میدن و این لزوماً باگ نیست. در تست چنین تابعی، هر سناریوی مستقل باید داده شروع خودش رو داشته باشه. اگر همان فهرست تغییرکرده رو در تست بعدی استفاده کنیم ولی انتظار حالت تازه رو داشته باشیم، حتی پیادهسازی درست هم رد میشه. این بار ممکنه باگ داخل تست باشه، نه تابع محصول.
در مثال، هر سناریوی افزودن عضو با یک فهرست خالی تازه شروع میشه. فعالیت تابعی داره که هم append میکنه و هم همان فهرست رو برمیگردونه. خطای رایج پاککردن اثر تست اول با تغییر تصادفی انتظار دومه؛ اگر دو سناریو مستقلن، بهتره fixture مستقل داشته باشن. کد اولیه دو انتظار رو با یک ظرف مشترک ترکیب کرده و باید اصلاح بشه. تست درست همچنان باید نسخههایی که عضو قبلی رو حذف میکنن یا return ندارن رد کنه. جداکردن دادهها نباید به حذف assertها و ضعیفکردن پوشش منجر بشه؛ فقط نقطه شروع هر سناریو رو روشن کن.
✍️ مثال حلشده:
def test_append(candidate):
a = []
assert candidate(a, "الف") == ["الف"]
b = []
assert candidate(b, "ب") == ["ب"]
حالا نوبت توئه: test_candidate(candidate) را اصلاح کن تا هر سناریو fixture تازه داشته باشد: افزودن 2 به [1]=>[1,2]، افزودن 3 به یک [1] تازه=>[1,3] و افزودن 4 به [] تازه=>[4]. تغییر ورودی در قرارداد candidate مجاز و عمدی است. run_tests("correct") باید True و drops_previous و no_return باید False شوند.
فعالیت شما
test_candidate(candidate) را اصلاح کن تا هر سناریو fixture تازه داشته باشد: افزودن 2 به [1]=>[1,2]، افزودن 3 به یک [1] تازه=>[1,3] و افزودن 4 به [] تازه=>[4]. تغییر ورودی در قرارداد candidate مجاز و عمدی است. run_tests("correct") باید True و drops_previous و no_return باید False شوند.