ویژگی تصویر

تست نویسی خودکار در پایتون با pytest

  /  پایتون   /  تست نویسی خودکار در پایتون با pytest
بنر تبلیغاتی الف

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

چرا pytest؟

  • سادگی در استفاده: تست‌های pytest به راحتی با استاندارد assert نوشته می‌شوند.
  • پشتیبانی از دسته‌بندی تست‌ها: امکان تنظیم تست‌ها با استفاده از @pytest.mark.
  • قابلیت پشتیبانی از fixture: ساخت و تنظیم داده‌های مورد نیاز تست به صورت خودکار.
  • پشتیبانی از تست‌های تکراری: امکان اجرای تست‌ها با داده‌های مختلف با استفاده از @pytest.mark.parametrize.

نصب و راه‌اندازی pytest

برای شروع کار با pytest، نیاز به نصب آن در محیط توسعه شما وجود دارد. این کار را می‌توانید با استفاده از pip انجام دهید:

pip install pytest

پس از نصب، می‌توانید با دستور pytest --version نسخه آن را بررسی کنید.

نوشتن اولین تست با pytest

فرض کنید یک تابع ساده برای جمع دو عدد داریم. در اینجا مثالی از نحوه نوشتن تست آن را مشاهده می‌کنید:

def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

در این تست، تابع add دو عدد را جمع می‌کند و ما با استفاده از assert چک می‌کنیم که نتیجه درست است. اگر تست شکست بخورد، pytest یک خطا مناسب به ما نشان می‌دهد.

ساختار پروژه و نام‌گذاری فایل‌ها

در تست‌نویسی pytest، بهتر است ساختار پروژه را به صورت زیر تنظیم کنید:

  • src/: فولدری برای کد منبع برنامه.
  • tests/: فولدری برای تست‌ها. هر فایل تست باید با پیشوند test_ شروع شود (مثلاً test_calculator.py).

استفاده از fixture در pytest

fixtureها در pytest به ما کمک می‌کنند تا داده‌های مورد نیاز تست را به صورت خودکار آماده کنیم. برای مثال، فرض کنید یک پایگاه داده موقتی برای تست‌ها نیاز داشته باشیم:

import pytest

@pytest.fixture
def sample_data():
    return [1, 2, 3, 4, 5]

def test_sum(sample_data):
    assert sum(sample_data) == 15

در این مثال، fixture sample_data یک لیست ساده را برگردانده و تست به صورت خودکار آن را دریافت می‌کند. این کار باعث افزایش قابلیت بازاستفاده و تمیزی کد می‌شود.

استفاده از @pytest.mark.parametrize

برای تست یک تابع با داده‌های مختلف، می‌توانید از @pytest.mark.parametrize استفاده کنید:

import pytest

def multiply(a, b):
    return a * b

@pytest.mark.parametrize("a, b, expected", [
    (2, 3, 6),
    (4, 5, 20),
    (-1, 5, -5)
])
def test_multiply(a, b, expected):
    assert multiply(a, b) == expected

در این تست، هر سطر داده‌ها را به تابع multiply می‌دهد و نتیجه آن را با مقدار انتظاری مقایسه می‌کند. این روش تست را کارآمد و دقیق‌تر می‌کند.

استانداردهای تست در pytest

برای نوشتن تست‌های بهتر، باید از استانداردهای زیر پیروی کنید:

  • نام فانکشن تست باید با test_ شروع شود.
  • هر تست باید خودکار و مستقل از سایر تست‌ها باشد.
  • استفاده از assert برای تأیید نتایج.
  • استفاده از fixture برای تنظیم داده‌های مورد نیاز.

اجرای تست‌ها با pytest

برای اجرای تست‌ها، می‌توانید از دستور زیر استفاده کنید:

pytest

همچنین می‌توانید تست‌های خاصی را با دستور زیر اجرا کنید:

pytest test_file.py::test_add

برای نمایش جزئیات بیشتر، از -v استفاده کنید:

pytest -v

مقایسه pytest با unittest

ویژگیpytestunittest
نام‌گذاری تست‌هاtest_test_
نوشتن تست‌هااستفاده از assertاستفاده از assertEqual و سایر متد‌ها
پشتیبانی از fixtureبلهنه
قابلیت پارامتریزه کردن تست‌هابلهنه

نکات مهم در استفاده از pytest

  • استفاده از -x برای متوقف کردن تست‌ها بعد از اولین شکست.
  • استفاده از --tb=short برای نمایش خطا به صورت خلاصه.
  • استفاده از -k "test_name" برای فیلتر کردن تست‌ها.

نمونه پروژه کامل با pytest

در اینجا نمونه کاملی از یک پروژه ساده با استفاده از pytest آورده شده است:

# src/calculator.py
def add(a, b):
    return a + b

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b
# tests/test_calculator.py
import pytest
from src.calculator import add, divide

def test_add():
    assert add(2, 3) == 5

def test_divide():
    assert divide(10, 2) == 5

def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(10, 0)

در این مثال، تابع divide در صورت تقسیم بر صفر خطای مناسب را پرتاب می‌کند. تست‌ها با استفاده از pytest.raises چک می‌شوند.

جمع‌بندی

pytest یکی از ابزارهای قدرتمند برای تست‌نویسی در پایتون است. با این حال، تنها توانایی تست‌نویسی خودکار نیست. این کتابخانه با قابلیت‌هایی مانند fixture و parametrize، کار با تست‌های ساده و پیچیده را بسیار راحت‌تر می‌کند. با یادگیری استانداردهای تست و استفاده از بهترین شیوه‌ها، می‌توانید تست‌های قوی و منظمی بنویسید که به کیفیت نرم‌افزار شما کمک کند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: