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

رفع وابستگی بین تست‌های پایتون؛ ساخت fixture تازه برای هر سناریو

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

بعضی تابع‌ها طبق قرارداد ورودی رو تغییر می‌دن و این لزوماً باگ نیست. در تست چنین تابعی، هر سناریوی مستقل باید داده شروع خودش رو داشته باشه. اگر همان فهرست تغییرکرده رو در تست بعدی استفاده کنیم ولی انتظار حالت تازه رو داشته باشیم، حتی پیاده‌سازی درست هم رد می‌شه. این بار ممکنه باگ داخل تست باشه، نه تابع محصول.

در مثال، هر سناریوی افزودن عضو با یک فهرست خالی تازه شروع می‌شه. فعالیت تابعی داره که هم 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 شوند.

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

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

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

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

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

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

def correct(values, item):
    values.append(item)
    return values

def drops_previous(values, item):
    values[:] = [item]
    return values

def no_return(values, item):
    values.append(item)

CANDIDATES = {"correct": correct, "drops_previous": drops_previous, "no_return": no_return}

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

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