ویژگی تصویر

کتابخانه nose در پایتون

  /  پایتون   /  کتابخانه nose در پایتون
بنر تبلیغاتی الف

کتابخانه nose یکی از ابزارهای محبوب در پایتون برای انجام تست‌های خودکار (Automated Testing) است. این کتابخانه بر پایه‌ی ماژول استاندارد unittest ساخته شده و قابلیت‌های اضافی زیادی مانند کشف خودکار تست‌ها، گزارش‌گیری پیشرفته، پشتیبانی از افزونه‌ها (plugins) و ادغام با CI/CD را فراهم می‌کند.

هدف کتابخانه Nose چیست؟

در پروژه‌های بزرگ پایتون، اجرای تست‌ها به‌صورت دستی می‌تواند وقت‌گیر باشد. nose با ساده‌سازی فرآیند نوشتن، کشف و اجرای تست‌ها به توسعه‌دهندگان کمک می‌کند تا مطمئن شوند کدها به درستی کار می‌کنند.

  • کشف خودکار فایل‌های تست بدون نیاز به ثبت دستی آن‌ها
  • گزارش‌دهی بهتر نسبت به unittest
  • پشتیبانی از افزونه‌ها برای توسعه قابلیت‌ها
  • سازگاری کامل با unittest و doctest

نصب کتابخانه Nose

برای نصب این کتابخانه کافی است از دستور زیر استفاده کنید:

pip install nose

پس از نصب، دستور nosetests به محیط شما اضافه می‌شود که برای اجرای تست‌ها به کار می‌رود.

ساخت اولین تست با Nose

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

# file: test_example.py

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

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

در این مثال تابعی به نام add تعریف کرده‌ایم و سپس تابع تست test_add را نوشته‌ایم که بررسی می‌کند آیا خروجی تابع صحیح است یا خیر.

برای اجرای تست کافی است دستور زیر را در ترمینال وارد کنید:

nosetests

کتابخانه Nose به‌صورت خودکار فایل‌هایی را که با test_ شروع یا به آن ختم می‌شوند پیدا کرده و اجرا می‌کند.

الگوی نام‌گذاری در Nose

Nose برای کشف خودکار تست‌ها از الگوی خاصی پیروی می‌کند:

  • فایل‌هایی با نامی مشابه test_*.py
  • کلاس‌هایی که با Test شروع می‌شوند
  • توابعی که با test_ شروع می‌شوند

برای مثال اگر فایل‌های زیر را داشته باشید، Nose آن‌ها را به‌صورت خودکار شناسایی می‌کند:

test_math.py
test_utils.py
example_test.py

تست کلاس‌ها با Nose

# file: test_calculator.py

class Calculator:
    def multiply(self, a, b):
        return a * b

class TestCalculator:
    def test_multiply(self):
        calc = Calculator()
        assert calc.multiply(2, 3) == 6

کلاس TestCalculator با پیشوند Test شروع می‌شود، بنابراین Nose آن را به عنوان کلاس تست شناسایی کرده و تمام توابعی که با test_ شروع می‌شوند را اجرا می‌کند.

اجرای تست‌ها با جزئیات بیشتر

برای مشاهده جزئیات بیشتر از اجرای تست‌ها، می‌توانید از گزینه -v (verbose) استفاده کنید:

nosetests -v

این گزینه باعث می‌شود نام تست‌ها و نتایج آن‌ها در خروجی نمایش داده شود.

مدیریت خطاها و شکست تست‌ها

اگر یکی از تست‌ها شکست بخورد، Nose اطلاعات دقیقی از دلیل شکست ارائه می‌دهد:

AssertionError: Expected 5 but got 6

برای دیباگ سریع‌تر می‌توانید از گزینه --pdb استفاده کنید تا در زمان خطا وارد محیط دیباگر پایتون شوید:

nosetests --pdb

افزونه‌های کتابخانه Nose

یکی از مزایای اصلی Nose پشتیبانی از plugins است. این افزونه‌ها می‌توانند برای تولید گزارش HTML، خروجی XML برای Jenkins یا اضافه‌کردن قابلیت‌های دیگر به کار روند.

افزونهکاربرد
nose-htmloutputتولید گزارش‌های HTML برای تست‌ها
nose-xunitتولید گزارش XML برای سیستم‌های CI مانند Jenkins
nose-progressiveنمایش زیباتر وضعیت تست‌ها در ترمینال

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

pip install nose-htmloutput

اجرای تست‌ها در پوشه خاص

می‌توانید با مشخص کردن مسیر، تنها تست‌های موجود در یک فولدر خاص را اجرا کنید:

nosetests tests/

Nose به صورت بازگشتی تمام فایل‌های تست داخل پوشه tests را شناسایی و اجرا می‌کند.

مقایسه Nose با unittest و pytest

ویژگیunittestnosepytest
کشف خودکار تست‌هامحدودبلهبله
پشتیبانی از افزونه‌هاخیربلهبله
سادگی در استفادهمتوسطسادهبسیار ساده
وضعیت توسعهفعالغیرفعال (deprecated)فعال و به‌روز

نکته مهم: توقف توسعه Nose

توسعه‌ی کتابخانه Nose از سال ۲۰۱۵ متوقف شده است و دیگر به‌روزرسانی جدیدی دریافت نمی‌کند. به همین دلیل، برای پروژه‌های جدید پیشنهاد می‌شود از pytest به‌جای Nose استفاده کنید. با این حال، اگر در پروژه‌ای قدیمی با Nose مواجه شدید، دانستن ساختار و طرز کار آن هنوز مفید است.

نحوه مهاجرت از Nose به pytest

اگر پروژه‌ی شما از Nose استفاده می‌کند، مهاجرت به pytest معمولاً ساده است زیرا pytest با ساختار Nose سازگار است. به عنوان مثال:

# فایل تست در Nose
def test_sum():
    assert sum([1, 2, 3]) == 6

# همان تست در pytest بدون تغییر قابل اجراست
def test_sum():
    assert sum([1, 2, 3]) == 6

اکثر تست‌های Nose در pytest بدون هیچ تغییری اجرا می‌شوند، اما می‌توانید از امکانات اضافی pytest مانند fixtures و parametrization برای بهبود ساختار تست‌ها استفاده کنید.

بهترین روش‌ها در استفاده از Nose

  • نام‌گذاری دقیق توابع و کلاس‌های تست برای خوانایی بیشتر
  • تقسیم تست‌ها به چند فایل برای مدیریت ساده‌تر
  • استفاده از افزونه‌ها برای گزارش‌دهی بهتر
  • اجرای منظم تست‌ها در فرآیند CI/CD

جمع‌بندی

کتابخانه nose ابزاری قدرتمند برای اجرای تست‌های خودکار در پایتون است که با وجود توقف توسعه، هنوز در پروژه‌های قدیمی کاربرد دارد. این کتابخانه فرآیند نوشتن و اجرای تست‌ها را بسیار ساده‌تر از unittest می‌کند و قابلیت کشف خودکار و پشتیبانی از افزونه‌ها را دارد. با این حال، برای پروژه‌های جدید، توصیه می‌شود از pytest استفاده کنید که نسخه‌ای مدرن‌تر و پشتیبانی‌شده از ایده‌های Nose محسوب می‌شود.

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

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