تست نویسی خودکار در پایتون با 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
| ویژگی | pytest | unittest |
|---|---|---|
| نامگذاری تستها | 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، کار با تستهای ساده و پیچیده را بسیار راحتتر میکند. با یادگیری استانداردهای تست و استفاده از بهترین شیوهها، میتوانید تستهای قوی و منظمی بنویسید که به کیفیت نرمافزار شما کمک کند.
آیا این مطلب برای شما مفید بود ؟





