تست در جنگو بخش حیاتی از فرایند توسعه نرمافزار است که به شما کمک میکند تا کیفیت و صحت کد خود را تضمین کنید. جنگو ابزارهایی را برای نوشتن و اجرای تستها فراهم کرده است که میتوانند به شما در شناسایی مشکلات و اطمینان از عملکرد درست برنامه کمک کنند. جنگو از unittest (کتابخانه تستنویسی Python) استفاده میکند و بسیاری از قابلیتها را برای سهولت در نوشتن و اجرای تستها اضافه کرده است.
۱. ساختار تستها در جنگو
در جنگو، تستها به طور معمول در دایرکتوری tests.py یا در دایرکتوری جداگانهای درون هر برنامه (app) قرار میگیرند.
۱.۱. ایجاد فایل تست
در هر اپلیکیشن جنگو، میتوانید یک فایل به نام tests.py ایجاد کنید تا تستها را در آن بنویسید. در این فایل، کلاسهایی برای هر دسته از تستها ایجاد میکنید که از django.test.TestCase ارثبری میکنند.
۲. نوشتن تستها در جنگو
جنگو از کلاس TestCase برای نوشتن تستها استفاده میکند. این کلاس از unittest.TestCase ارثبری میکند و چندین متد کمکی مانند setUp(), tearDown(), و assert برای نوشتن تستها فراهم میکند.
1.2. یک تست ساده
برای نوشتن تست، ابتدا باید از django.test.TestCase ارثبری کنید و سپس متدهای assert را برای بررسی رفتارهای مورد نظر در تستها استفاده کنید.
مثال:
from .models import Book
class BookTestCase(TestCase):
def setUp(self):
# ایجاد دادههای تست
Book.objects.create(title='Django for Beginners', author='John Doe')
def test_book_creation(self):
# بررسی اینکه کتاب به درستی ایجاد شده است
book = Book.objects.get(title='Django for Beginners')
self.assertEqual(book.author, 'John Doe')
در این مثال:
- ()setUp برای ایجاد دادههای تستی پیش از اجرای هر تست استفاده میشود.
- ()test_book_creation بررسی میکند که آیا کتاب به درستی ایجاد شده است.
۲.۲. متدهای assert
جنگو برای نوشتن تستها متدهای مختلفی را فراهم کرده است که به شما کمک میکنند تا مقادیر و رفتارها را بررسی کنید. برخی از متدهای رایج عبارتند از:
- assertEqual(a, b) – بررسی میکند که a و b برابر باشند.
- assertNotEqual(a, b) – بررسی میکند که a و b برابر نباشند.
- assertTrue(x) – بررسی میکند که x درست باشد.
- assertFalse(x) – بررسی میکند که x غلط باشد.
- assertIsNone(x) – بررسی میکند که x مقدار None باشد.
- assertContains(response, text) – بررسی میکند که پاسخ دریافتی شامل متن خاصی باشد.
۳. تستهای مربوط به ویوها
یکی از جنبههای مهم تستها در جنگو، تست ویوها (views) است. برای این کار، جنگو ابزارهایی مانند Client را فراهم کرده است که میتوانید برای شبیهسازی درخواستها به ویوها استفاده کنید.
1.3. تست ویوها با Client
از django.test.Client برای شبیهسازی درخواستهای HTTP استفاده میشود. این ابزار به شما اجازه میدهد تا درخواستهای GET, POST, PUT و دیگر درخواستهای HTTP را شبیهسازی کنید و پاسخ دریافتی را بررسی کنید.
مثال:
from django.urls import reverse
class BookViewTestCase(TestCase):
def test_book_list_view(self):
response = self.client.get(reverse('book_list'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Django for Beginners')
در این مثال:
- self.client.get() یک درخواست GET به ویو book_list ارسال میکند.
- response.status_code بررسی میکند که وضعیت پاسخ 200 باشد (موفقیتآمیز).
- self.assertContains() بررسی میکند که متن خاصی در پاسخ وجود داشته باشد.
2.3. تست فرمها
در صورتی که فرمهایی در پروژه شما وجود داشته باشد، میتوانید با شبیهسازی درخواستهای POST آنها را تست کنید.
مثال:
from .models import Book
from .forms import BookForm
class BookFormTestCase(TestCase):
def test_form_valid(self):
data = {'title': 'New Book', 'author': 'Jane Doe'}
form = BookForm(data=data)
self.assertTrue(form.is_valid())
def test_form_invalid(self):
data = {'title': '', 'author': 'Jane Doe'}
form = BookForm(data=data)
self.assertFalse(form.is_valid())
در این مثال:
- test_form_valid بررسی میکند که فرم با دادههای صحیح معتبر است.
- test_form_invalid بررسی میکند که فرم با دادههای نامعتبر غیرمعتبر است.
۴. اجرای تستها
برای اجرای تستها در جنگو میتوانید از دستور python manage.py test استفاده کنید. این دستور تمامی تستها را در پروژه شما شبیهسازی کرده و نتایج آنها را نشان میدهد.
مثال:
این دستور به طور خودکار تمامی فایلهای tests.py را در اپلیکیشنها پیدا کرده و اجرا میکند.
1.4. اجرای تستها در یک اپلیکیشن خاص
اگر میخواهید فقط تستهای یک اپلیکیشن خاص را اجرا کنید، میتوانید نام اپلیکیشن را به دستور اضافه کنید:
2.4. تستهای مخصوص برای یک کلاس یا متد خاص
برای اجرای تستهای یک کلاس یا متد خاص، میتوانید نام کلاس یا متد را مشخص کنید:
یا برای یک متد خاص:
۵. تستهای یکپارچگی و تستهای سیستم (Integration & System Testing)
در صورتی که میخواهید تمامی سیستم (شامل پایگاه داده، فرمها، ویوها و غیره) را به صورت یکپارچه تست کنید، میتوانید از تستهای یکپارچگی (integration tests) و تستهای سیستم استفاده کنید. این تستها به شما کمک میکنند تا مطمئن شوید که تمامی اجزای سیستم به درستی با هم کار میکنند.
۶. تستهای پرفورمنس (Performance Testing)
گاهی اوقات، نیاز است که پرفورمنس برنامه را تست کنید تا مطمئن شوید که بارگذاری صفحات سریع است و سیستم توانایی مقیاسپذیری دارد. این تستها معمولاً با ابزارهای خاصی مانند Locust یا JMeter انجام میشوند که میتوانند بار زیادی را روی سیستم شبیهسازی کنند.
نتیجهگیری
تست در جنگو ابزارهای قدرتمندی برای تست قسمتهای مختلف یک پروژه مانند مدلها، ویوها، فرمها و حتی پرفورمنس فراهم میکند. با نوشتن تستهای مناسب میتوانید از عملکرد صحیح برنامه خود اطمینان حاصل کرده و مشکلات احتمالی را شناسایی کنید.
