مقدمه
به عنوان یک مهندس پشتیبان یا یک مهندس QA/test، اطمینان از کیفیت و قابلیت اطمینان کد شما مهم است. یکی از راههای رسیدن به این هدف، استفاده از چارچوبهای تست پایتون برای خودکار کردن فرآیند تست و شناسایی باگها یا مشکلات موجود در کد شما قبل از انتشار یا استقرار نرمافزار است.
آنها مزایای زیر را ارائه می دهند:
- فریم ورک های آزمایشی کیفیت کد را بهبود می بخشد.
- تست خودکار باعث صرفه جویی در زمان و تلاش می شود.
- قابلیت استفاده مجدد کد، تلاش های تست را بهینه می کند و تکرار را کاهش می دهد.
- چارچوب های تست پایتون به طور یکپارچه با ابزارها، ماژول ها و کتابخانه های دیگر ادغام می شوند.
در این راهنمای گام به گام، نحوه پیادهسازی PyTest – یکی از محبوبترین چارچوبهای تست پایتون را یاد خواهید گرفت.
پیش نیازها
قبل از پرداختن به جزئیات چارچوبهای تست پایتون، اجازه دهید ابتدا روی پیشنیازهای پیادهسازی PyTest تمرکز کنیم.
- نصب پایتون: لطفا مطمئن شوید که پایتون را روی سیستم خود نصب کرده اید. می توانید آخرین نسخه پایتون را از وب سایت رسمی پایتون دانلود کنید.
- نصب Pip: Pip (نصب کننده بسته برای پایتون) ابزاری است که برای مدیریت بسته ها، کتابخانه ها و وابستگی ها در پایتون استفاده می شود. به ما امکان می دهد بسته های پایتون را نصب و مدیریت کنیم. مطمئن شوید که پیپ را روی سیستم خود نصب کرده اید.
با اجرای دستور زیر در خط فرمان/ترمینال خود می توانید بررسی کنید که آیا پیپ نصب شده است:
python -m pip --version
یا
python3 -m pip --version
چارچوب تست پایتون چیست؟
چارچوب تست پایتون مجموعه ای از ابزارها و کتابخانه ها است که ساختار و دستورالعمل هایی را برای نوشتن و اجرای تست ها در پایتون برای تست اتوماسیون ارائه می دهد. این اطمینان حاصل می کند که کد مطابق با استانداردهای کیفیت مطلوب است. برای هر توسعه دهنده Backend، مهندس نرم افزار، DevOps و مهندس QA/Test ضروری و مفید است. چند فریم ورک تست معروف و پرکاربرد پایتون عبارتند از Pytest، PyUnit، DocTest، Testify، Robot و بسیاری دیگر.
پیاده سازی PyTest
در حال نصب PyTest
برای شروع با PyTest، باید آن را روی سیستم خود نصب کنید. ترمینال خود را باز کنید و دستور زیر را اجرا کنید:
pip install pytest
این دستور آخرین نسخه PyTest و وابستگی های آن را دانلود و نصب می کند.
موارد تست نوشتن
اکنون که PyTest نصب شده است، اجازه دهید شروع به نوشتن موارد تست واحد اولیه کنیم.
لطفاً یک فایل پایتون جدید ایجاد کنید و نام آن را test_backend.py
بگذارید. این فایل موارد تست ما را با استفاده از نحو PyTest تعریف می کند.
توجه: بهطور پیشفرض، PyTest همه موارد آزمایشی را در فایلهایی با نامهایی که با «test_» شروع میشوند یا با «_test» ختم میشوند، کشف و اجرا میکند. فرآیند کشف pytest بهطور بازگشتی پوشه فعلی و زیرپوشههای آن را برای فایلهایی که با نام شروع میشوند اسکن میکند. test_” یا با “_test” ختم می شود. سپس تست های موجود در آن فایل ها اجرا می شوند.
import pytest
def test_addition():
assert 3 + 3 == 6
def test_subtraction():
assert 5 - 4 == 1
def test_multiplication():
assert 4 * 4 == 16
def test_division():
assert 10 / 2 == 5
در مثال بالا، ما چهار مورد تست واحد پایه را به عنوان توابع تعریف کردهایم: test_addition، test_subtraction، test_multiplication و test_division. کلمه کلیدی assert هنگام اشکال زدایی کد استفاده می شود و به شما امکان می دهد آزمایش کنید که آیا یک شرط خاص در کد شما True را برمی گرداند یا خیر. اگر نه، یک AssertionError برمی گرداند.
اجرا موارد تست،اجرا تست های خاص
برای اجرای تست ها، به پوشه ای که فایل test_backend.py را در آن ذخیره کرده اید بروید و سپس دستور زیر را در ترمینال یا خط فرمان خود اجرا کنید:
pytest
یا
python -m pytest
خروجی:
Output
test session starts
==================================================
platform darwin -- Python 3.9.6, pytest-7.4.3, pluggy-1.3.0
rootdir: ~/Python Testing Frameworks
collected 4 items
test_backend.py ....
==================================================
4 passed in 0.01s
هنگام استفاده از PyTest، لازم نیست هر تست را به صورت دستی در فایل خود اجرا کنید. این ابزار به طور خودکار تمام موارد تست تعریف شده را پیدا کرده و اجرا می کند. اگر همه چیز خوب پیش برود و همه ادعاها درست باشند، خلاصه خوبی از نتایج آزمون به همراه تعداد تست های گذرانده شده را همانطور که در بالا نشان داده شده است دریافت خواهید کرد.
بیایید فرض کنیم که یکی از تست ها در آن زمان شکست بخورد، خروجی زیر را مشاهده می کنیم:
Output
test session starts
==================================================
platform darwin -- Python 3.9.6, pytest-7.4.3, pluggy-1.3.0
rootdir: ~/Python Testing Frameworks
collected 4 items
test_backend.py ...F
================================================== [100%]
FAILURES
==================================================
test_division
def test_division():
> assert 10 / 2 == 6
E assert (10 / 2) == 6
test_backend.py:13: AssertionError
short test summary info
==================================================
FAILED test_backend.py::**test_division** - assert (10 / 2) == 6
1 failed, 3 passed in 0.01s
کشف آزمایشی
PyTest قابلیت های کشف تست قدرتمندی را ارائه می دهد که به شما امکان می دهد موارد آزمایشی خود را به روشی ساختاریافته سازماندهی کنید. بهطور پیشفرض، PyTest تمام موارد تست را در فایلهایی با نامهایی که با «test_» شروع میشوند یا با «_test» ختم میشوند، کشف و اجرا میکند. با این حال، میتوانید فرآیند کشف تست را با استفاده از گزینههای مختلف خط فرمان یا با پیکربندی یک فایل pytest.ini
سفارشی کنید.
به عنوان مثال، میتوان با اجرای دستور زیر یک دایرکتوری خاص را برای جستجوی ماژولهای آزمایشی مشخص کرد:
pytest tests/
این دستور فقط موارد تست را در دایرکتوری “tests” اجرا می کند.
تجهیزات تست
ابزارهای تست در Pytest مؤلفههای شگفتانگیزی هستند که میتوان از آنها برای تنظیم یک خط پایه ثابت برای موارد آزمایشی خود استفاده مجدد کرد. زمانی که میخواهید پیششرطهایی را برای آزمایشهای خود ایجاد کنید و زمانی که میخواهید پس از انجام آزمایشها، منابعی را پاک کنید، به کار میآیند. PyTest تعریف و استفاده زیبا از وسایل تست را آسان می کند.
برای تعریف یک فیکسچر تست، باید از دکوراتور @pytest.fixture
استفاده کنید. به عنوان مثال، یک فیکسچر به نام db که در زیر تعریف شده است، یک اتصال پایگاه داده را راه اندازی می کند و پس از عملیات اتصال را می بندد. می توانیم این فیکسچر را به صورت زیر تعریف کنیم:
import pytest
@pytest.fixture
def db():
# Set up the database connection
db = create_db()
yield db
# Clean up the database connection
db.close()
در این مثال، عبارت yield کد اجرا شده پس از اجرای موارد تست را تعریف می کند. کلمه کلیدی yield برای کنترل جریان یک تابع مولد استفاده می شود که شبیه به عبارت بازگشتی است که برای برگرداندن مقادیر در پایتون استفاده می شود.
برای استفاده از فیکسچر در یک تست، باید آن را به عنوان آرگومان در تابع تست قرار دهید.
مثلا:
def query_test(db):
results = db.query("SELECT * FROM users")
assert len(result) == 12
در این مورد آزمایشی، فیکسچر db
به طور خودکار به تابع query_test()
تزریق می شود و به شما امکان می دهد از آن برای انجام عملیات پایگاه داده استفاده کنید. فیکسچرها برای توسعه دهندگان مفید هستند تا محیط آزمایشی خاصی مانند اتصالات پایگاه داده، کلاینت های API یا اشیاء ساختگی را آماده کنند. با استفاده از فیکسچرها، توسعه دهندگان می توانند اطمینان حاصل کنند که تست ها ایزوله و قابل تکرار هستند.
مهندسان آزمایش همچنین می توانند از تجهیزات برای آماده سازی سیستم تحت آزمایش، مدیریت داده های آزمایشی یا شبیه سازی سناریوهای پیچیده استفاده کنند.
علاوه بر این، وسایل را می توان برای پاکسازی منابع پس از آزمایش، بهبود قابلیت اطمینان و نگهداری مجموعه آزمایشی مورد استفاده قرار داد.
نتیجه
در این آموزش پیاده سازی و استفاده از PyTest را یاد گرفتیم که یکی از محبوب ترین و غنی ترین فریم ورک های تست پایتون است و راهنمای گام به گام پیاده سازی آن در پایتون را ارائه کردیم. نوشتن و به روز رسانی مستمر موارد آزمایشی با تکامل پایگاه کد شما ضروری است. با صرف زمان و تلاش در آزمایش، میتوانید باگها را زودتر شناسایی کنید، کیفیت کد را بهبود بخشید و نرمافزار قویتر و قابل اعتمادتری ارائه دهید.