آخرین گام، ساخت یک مجموعه تستیه که از قرارداد کامل فاکتور محافظت کنه. این بار فقط یک جواب نمونه کافی نیست؛ باید نسخه سالم رو قبول کنی و چند رفتار خراب متفاوت رو رد کنی. این روش کمک میکنه قدرت واقعی تستها رو ببینی: اگر نسخه دارای باگ از مجموعه عبور کنه، هنوز یک انتظار مهم ثبت نشده.
مثال، بررسی ورودی معتبر و نامعتبر رو در دو تابع جدا میذاره. برای پروژه هم میتونی تستهای معتبر و خطادار رو جدا بنویسی و از test_candidate هر دو رو اجرا کنی. خطای رایج اینه که بعد از اضافهکردن تست استثنا، بررسی حفظ فهرست فراموش بشه. هر fixture باید مستقل ساخته بشه و وضعیتش بعد از فراخوانی هم سنجیده بشه. wrapper فقط نام متنی نسخه رو به تابع وصل میکنه و True را برای عبور کامل گزارش میده؛ بنابراین تستی که فقط پیام موفقیت چاپ کنه همه نسخههای خراب رو هم میپذیره و قابل قبول نیست. این پروژه به unittest، کلاس یا بسته خارجی نیاز نداره.
✍️ مثال حلشده:
def test_valid(candidate):
assert candidate(2) == 4
def test_invalid(candidate):
try:
candidate(-1)
except ValueError:
pass
else:
raise AssertionError("invalid accepted")
def test_all(candidate):
test_valid(candidate)
test_invalid(candidate)
حالا نوبت توئه: test_candidate(candidate) مجموعه کامل فاکتور را اجرا کند. candidate(prices,percent) برای [100,200] با10=>270، با0=>300 و با100=>0؛ [] با10=>0 و [50] با20=>40 بدهد. درصدهای -1 و101، هم با [100] و هم با []، باید ValueError بدهند. فهرست ورودی در مسیر موفق و خطادار تغییر نکند. run_tests("correct") باید True و هشت نام دیگر در CANDIDATES باید False شوند. wrapper و نسخهها را نگه دار؛ آزمونها باید candidate واقعی را با assert و بررسی ValueError بسنجند، نه بر اساس نام نسخه تصمیم بگیرند. مبلغ تخفیف در این پروژه همان حاصل عددی فرمول است و گردکردن مالی انجام نمیشود؛ مثالهای آزمون عمداً نتیجه عددی دقیق دارند.
فعالیت شما
test_candidate(candidate) مجموعه کامل فاکتور را اجرا کند. candidate(prices,percent) برای [100,200] با10=>270، با0=>300 و با100=>0؛ [] با10=>0 و [50] با20=>40 بدهد. درصدهای -1 و101، هم با [100] و هم با []، باید ValueError بدهند. فهرست ورودی در مسیر موفق و خطادار تغییر نکند. run_tests("correct") باید True و هشت نام دیگر در CANDIDATES باید False شوند. wrapper و نسخهها را نگه دار؛ آزمونها باید candidate واقعی را با assert و بررسی ValueError بسنجند، نه بر اساس نام نسخه تصمیم بگیرند. مبلغ تخفیف در این پروژه همان حاصل عددی فرمول است و گردکردن مالی انجام نمیشود؛ مثالهای آزمون عمداً نتیجه عددی دقیق دارند.