متد setUp()

در test_survey.py در هر متدِ آزمون، یک نمونه از AnonymousSurvey و مجموعه‌ای از پاسخ‌های جدید را در هر متد ساختیم. کلاس unittest.TestCase متدی به نام setUp() دارد که به شما مکان می‌دهد این اشیا را یک بار بسازید و سپس از آن‌ها در هر کدام از متدهای آزمون استفاده کنید. زمانی که متد setUp() در یک کلاس TestCase می‌آورید، پایتون آن را پیش از اجرای هر متد آزمونی که با test_ شروع می‌شود، اجرا می‌کند. هر شیء‌ای پس از ساخته‌شدن در متد setUp()، در تمام متدهای آزمون در دسترس خواهد بود.

بیایید از setUp() برای ساختن یک نمونه‌ی نظرسنجی و مجموعه‌ای از پاسخ‌ها استفاده کنیم تا بتوانیم از آن‌ها در test_store_single_response() و test_store_three_responses() استفاده کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import unittest

from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
    """Tests for the class AnonymousSurvey."""

    def setUp(self):
        """Create a survey and a set of responses for use in all test methods."""
        question = "What language did you first learn to speak?"
        self.my_survey = AnonymousSurvey(question)
        self.responses = ['English', 'Spanish', 'Mandarin']

    def test_store_single_response(self):
        """Test that a single response is stored properly."""
        self.my_survey.store_response(self.responses[0])
        self.assertIn(self.responses[0], self.my_survey.responses)

    def test_store_three_responses(self):
        """Test that three individual responses are stored properly."""
        for response in self.responses:
            self.my_survey.store_response(response)
        for response in self.responses:
            self.assertIn(response, self.my_survey.responses)

if __name__ == '__main__':
    unittest.main()

متد setUp() دو کار انجام می‌دهد: یک شیء نمونه‌ی نظرسنجی می‌سازد و لیستی از پاسخ‌ها ایجاد می‌کند. هر دو پیشوند self گرفته‌اند پس می‌توان از آن‌ها هر جای کلاس استفاده کرد. این کار نوشتنِ دو متد را ساده‌تر می‌کنند چون هیچ‌کدام دیگر به ساختن نمونه‌ی نظرسنجی یا لیست پاسخ‌ها نیازی ندارند. متد test_store_single_response() ذخیره شدن اوّلین پاسخ را در self.responses[0] بررسی می‌کند و test_store_three_responses() ذخیره شدن درست هر سه پاسخ موجود را در self.responses درستی‌سنجی می‌کند.

اگر test_survey.py را دوباره اجرا کنیم هر دو آزمون موفّق خواهند بود. این آزمون‌ها به ویژه زمانی سودمندند که بخواهیم AnonymousSurvey را برای رسیدگی به چند پاسخِ یک کاربر توسعه دهیم. پس از تغییر دادن کد برای دریافت چند پاسخ از یک کاربر، می‌توانید این آزمون‌ها را دوباره اجرا کنید تا مطمئن شوید که توانایی ذخیره‌سازی یک پاسخ تکّی یا مجموعه از پاسخ‌های جدا تحت‌الشعاع قرار نگرفته باشد.

وقتی کلاس‌های خود را آزمایش می‌کنید متد setUp() نوشتن متدهای آزمون را ساده‌تر می‌کند. یک مجموعه از نمونه‌ها و مشخّصه‌ها را در setUp() می‌سازید و از آن‌ها در تمام متدهای آزمون خود استفاده می‌کنید. این کار از ساختنِ چندباره‌ی این نمونه‌ها در هر متد آزمون ساده‌تر خواهد بود.

نکته
زمانی که مورد آزمایشی در حال اجراست، پایتون پس از پایان هر آزمون واحد یک کاراکتر چاپ می‌کند؛ برای آزمون موفّق یک نقطه، برای آزمونی که به خطا برمی‌خورد یک E و برای آزمونی که به رد شدن یک متد اثبات می‌انجامد یک F. به این دلیل است که هنگام اجرای موردهای آزمایشی تعداد مختلفی نقطه و کاراکتر در خطّ اوّل می‌بینید. اگر اجرای یک مورد آزمایشی به دلیل تعدّد متدهای آزمون زمان زیادی ببرد می‌توانید با نگاه کردن به این نتایج درکی کلّی از تعداد آزمون‌های در حال انجام و قبول یا رد شدنِ آن‌ها پیدا کنید.

خودآزمایی

۱۱-۳. کارمند: کلاسی به نام Employee بنویسید. متد __init__() باید یک نام، نام خانوادگی و حقوق سالیانه دریافت کند و آن‌ها را به عنوان مشخّصه ذخیره نماید. متدی به نام give_raise() بنویسید که به طور پیش‌فرض ۵۰۰۰ دلار به حقوق سالیانه اضافه کند امّا مقادیر افزایشِ حقوقِ دیگر را هم در صورت وجود بپذیرد.

یک مورد آزمایشی برای Employee بنویسید. دو متد آزمون بنویسید، test_give_default_raise() و test_give_custom_raise(). از متد setUp() استفاده کنید تا مجبور نباشید در هر کدام از متدها یک شیء نمونه‌ی کارمند بسازید. مورد آزمایشی خود را اجرا کنید و مطمئن شوید که هر دو آزمون موفّق خواهند بود.

خلاصه

در این فصل آموختید که چگونه به کمک ابزارهای موجود در ماژول unittest برای تابع‌ها و کلاس‌های خود آزمون بنویسید. نوشتن کلاسی را که از unittest.TestCase ارث می‌برد یاد گرفتید و این که چگونه برای درستی‌سنجی رفتارهای خاصّ تابع‌ها و کلاس‌های خود آزمون بنویسید. به‌کارگیری متد setUp() را برای ساختن کارآمدتر نمونه‌ها و مشخّصه‌ها از کلاس خود آموختید تا از آن‌ها در تمام متدهای آزمون یک کلاس استفاده کنید.

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

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

سر و کلّه زدن با آزمون‌ها برای آشنا شدن با آن‌ها بخشی از فرآیند آزمون کد شماست. برای حیاتی‌ترین رفتارهای تابع‌ها و کلاس‌های خود آزمون بنویسید امّا در پروژه‌های اوّل خود دنبالِ پوشش کامل نباشید مگر این که دلیل خاصّی برای آن داشته باشید.