نحوه نوشتن Doctest در پایتون

نحوه نوشتن Doctest در پایتون

نوشتن اسناد و کد تست نقش کلیدی در فرآیند توسعه نرم افزار ایفا می کند. در واقع، آزمایش کد، اطمینان حاصل می کند که برنامه به درستی کار می کند. همچنین سازگاری بین برنامه نویسی و نیازهای کاربر را فراهم می کند.

در واقع نوشتن یک سند و تست آن قبل از رمزگذاری به برنامه نویس کمک زیادی می کند. این به این دلیل است که برنامه نویس مطمئن می شود که تابع کد شده (مثلا) به خوبی فکر شده است و فقط موارد ممکن را در نظر می گیرد.

زبان برنامه نویسی پایتون یکی از زبان های برنامه نویسی است که آموزش و یادگیری آن بسیار آسان است. بنابراین، بسیاری از توسعه دهندگان این زبان را به عنوان اولین زبان برنامه نویسی خود انتخاب می کنند. در واقع، پایتون به عنوان یک زبان جهانی توسعه داده شد و برای هر چیزی قابل استفاده است.

زبان برنامه نویسی پایتون امکانات زیادی دارد. یکی از این ویژگی ها ماژول چارچوبی به نام Doctest است. این ماژول به صورت برنامه نویسی کد پایتون را برای بخش هایی از متن در نظرات که شبیه جلسات پایتون تعاملی هستند جستجو می کند. سپس ماژول این جلسات را اجرا می کند تا تأیید کند که کد مرجع ارائه شده توسط Doctest مطابق انتظار اجرا می شود.

اما چگونه Doctest را در پایتون بنویسیم؟ در ادامه این مقاله از پارس پک گام به گام نحوه نوشتن Doctest را به شما آموزش می دهیم. پس به ما بپیوندید

نکته: برای استفاده از تابع Doctest ابتدا باید پایتون 3 را نصب کرده و یک محیط برنامه نویسی ایجاد کنید.

ساختار Doctest در پایتون

نوشتن Doctest در پایتون شبیه نوشتن یک نظر است، با این تفاوت که سه نقل قول وجود دارد (“” “در ابتدا و انتهای آن. Doctest ها گاهی با مثالی از تابع و خروجی مورد انتظار نوشته می شوند. اما گاهی اوقات ممکن است توضیحاتی در مورد آنچه تابع در نظر دارد انجام دهد.

درج نظر نشان می دهد که شما به عنوان یک برنامه نویس اهداف خود را واضح تر بیان کرده اید و شخصی که کد را می خواند آن را به خوبی درک می کند. به طور کلی، یکی از شرایط کدنویسی تمیز و منظم، استفاده به موقع از نظرات برای ارائه توضیحات است!

آموزش doctest python و ساختار آن

توجه: برای همراهی شما در هنگام استفاده از مثال در این آموزش، یک پوسته Python تعاملی را در سیستم محلی خود نصب کنید. با اجرای دستور Python3؛ باز کن. حال با افزودن مثال هایی بعد از <<< می توانید آنها را کپی، پیست یا ویرایش کنید.

در زیر یک مثال ریاضی از Doctest برای تابعی مانند جمع (a, b) است که دو عدد را کنار هم قرار می دهد:

"""
Given two integers, return the sum.

>>> add (2, 3)
۵
"""

این مثال شامل یک خط توضیحی، یک مثال از یک تابع add () با دو عدد صحیح به عنوان مقادیر ورودی است. اگر قصد دارید در آینده با این تابع بیش از 2 عدد صحیح اضافه کنید، باید Doctest را تغییر دهید تا با ورودی های تابع شما مطابقت داشته باشد.

این مدرک دکترا را تا کنون همه خوانده اند. با این حال، این رشته سند را می توان با پارامترهای قابل خواندن توسط ماشین و توضیحات بازگشتی – برای روشن کردن متغیرهای ورودی / خروجی این تابع تکرار کرد.

سپس برای هر دو آرگومان ارسال شده به تابع و مقدار بازگشتی، رشته‌های docstrings را اضافه می‌کنیم. اسناد انواع داده ها را برای هر یک از مقادیر – پارامتر a، پارامتر b و مقدار بازگشتی ثبت می کند. در این حالت تمام پارامترها اعداد صحیح هستند.

"""
Given two integers, return the sum.

:param a: int
:param b: int
:return: int

>>> add(2, 3)
۵
"""

خوب، اکنون Doctest آماده راه اندازی و آزمایش است.

Doctest را به تابع تبدیل کنید

Doctest ها معمولا در یک تابع بعد از دستور def و قبل از کد تابع قرار می گیرند. پس از تعریف اولیه یک تابع، طبق قراردادهای پایتون دارای تورفتگی خواهد بود. این تابع کوتاه نحوه درج کانال را در آن نشان می دهد.

def add(a, b):
"""
Given two integers, return the sum.

:param a: int
:param b: int
:return: int

>> add(2, 3)
۵
"""
return a + b

شما از قبل یک تابع دارید، بنابراین باید وارد ماژول Doctest شده و دستوری برای اجرای آن داشته باشید.

برای انجام این کار، باید توضیحات زیر را به قبل و بعد از عملکرد خود اضافه کنید:

import Doctest
...
Doctest .testmod()

در این مرحله به جای ذخیره آن در فایل برنامه، آن را در پوسته پایتون تست کنید. برای این کار می توانید از دستور python3 استفاده کنید:

$ python3

اگر از این مسیر اجرا استفاده کنید، پس از فشار دادن کلید Enter روی صفحه کلید، خروجی زیر را دریافت خواهید کرد:

Output
Type "help", "copyright", "credits" or "license" for more information.
>>>

بعد از علامت <<< می توانید شروع به وارد کردن کد مورد نظر خود کنید.

کد کامل استفاده شده در این مثال شامل تابع () با کانال، کانال و تماس برای فراخوانی کانال است. اکنون آن را در مترجم پایتون خود قرار دهید تا آن را روی گیاه آزمایش کنید:

import Doctest

def add(a, b):
"""
Given two integers, return the sum.

:param a: int
:param b: int
:return: int

>>> add(2, 3)
۵
"""
return a + b

Doctest .testmod()

پس از شروع، کد منبع زیر را دریافت خواهید کرد:

Output
TestResults(failed=0, attempted=1)

یعنی کد مطابق انتظار شما اجرا می شود!

توجه داشته باشید که اگر در برنامه فوق مجموع دو عدد صحیح a + b با ضرب دو عدد a * b تغییر کند، به شما اعلام می شود که موفق نبوده است:

**********************************************************************
File "__main__", line 9, in __main__.add
Failed example:
    add(2, 3)
Expected:
    ۵
Got:
    ۶
**********************************************************************
۱ items had failures:
   ۱ of   1 in __main__.add
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=1)

با استفاده از مثال بالا، می توانید اهمیت ماژول Doctest را درک کنید. زیرا کل ماجرا به شما نشان خواهد داد که چه اتفاقی افتاده است. شاید بخواهید به نمونه های بیشتری نگاه کنید. به عنوان مثال، مقادیر a و b را برای صفر در نظر بگیرید و سپس مجموع آنها را با عملگر + بگیرید:

import Doctest

def add(a, b):
"""
Given two integers, return the sum.

:param a: int
:param b: int
:return: int

>>> add(2, 3)
۵
>>> add(0, 0)
۰
"""
return a + b

Doctest .testmod()

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

TestResults(failed=0, attempted=2)

این نتیجه نشان می دهد که Doctest دو تست انجام داده است. یکی مربوط به مجموع ارزش افزوده (2،3) و دیگری مربوط به مجموع (0،0). هر دو نتیجه صحیح است.

اگر دوباره برنامه را تغییر دهید، با استفاده از عملگر ضرب * به جای عملگر +، می توانید معنای موارد شدید را در ماژول Doctest ببینید. زیرا در مثال دوم add (0,0) همان مقدار را (چه ضرب یا اضافه) برمی گرداند.

import Doctest

def add(a, b):
"""
Given two integers, return the sum.

:param a: int
:param b: int
:return: int

>>> add(2, 3)
۵
>>> add(0, 0)
۰
"""
return a * b

Doctest .testmod()

اکنون خروجی زیر برمی گردد:

**********************************************************************
File "__main__", line 9, in __main__.add
Failed example:
add(2, 3)
Expected:
۵
Got:
۶
**********************************************************************
۱ items had failures:
۱ of 2 in __main__.add
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=2)

زمانی که تغییراتی در برنامه ایجاد می کنید ممکن است برای یکی از مثال ها با خطا مواجه شوید اما به طور کلی مراحل مانند قبل انجام می شود. پس به خاطر داشته باشید که ایجاد تغییرات کوچک در برنامه فرصت هایی را برای شکست یا اجرا نشدن آن ایجاد می کند.

Doctest در فایل های برنامه نویسی

تاکنون از ترمینال تعاملی پایتون به عنوان مثال استفاده کرده اید. اکنون از یک فایل برنامه برای شمارش تعداد حروف صدادار در یک کلمه استفاده کنید.

ماژول پایتون Doctest برای آزمایش آسان تر

در یک برنامه می توانید ماژول Doctest را در عبارت if __name__ == “__main__” وارد کرده و فراخوانی کنید: در پایین فایل برنامه. ابتدا یک فایل جدید – counting_vowels.py – در ویرایشگر متن خود ایجاد کنید. می توانید از ویرایشگر نانو در خط فرمان استفاده کنید:

$ nano counting_vowels.py

می توانید با تعریف تابع count_vowels و ارسال پارامتر کلمه به تابع شروع کنید:

def count_vowels(word):

قبل از نوشتن تابع puff، بهتر است توضیح دهید که از تابع در Doctest چه می خواهید:

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

نوع داده را با پارامتر کلمه و نوع داده برگشتی را ابتدا به صورت رشته و در حالت دوم به صورت عدد صحیح در نظر می گیریم. در واقع در حالت اول یک رشته و در حالت دوم یک عدد صحیح نمایش داده می شود.

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

برای درک بهتر موضوع می توانید مثالی را امتحان کنید. یک کلمه مصوت را در نظر بگیرید و آن را در رشته رشته سند وارد کنید.

به عنوان مثال، کلمه “Cusco” را انتخاب کنید. در این کلمه چند حرف صدادار وجود دارد؟ در زبان انگلیسی حروف صدادار شامل a، e، i، o و u هستند. بنابراین در این مثال شما دو مصوت o و u دارید.

حالا تست کلمه Cuso و بازگشت آن را اضافه می کنیم که در برنامه ما 2 عدد صحیح است:

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

    >>> count_vowels('Cusco')
    ۲

برای درک بهتر موضوع، مثال دیگری را با حروف صدادار بیشتر مانند Manila امتحان کنید:

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

    >>> count_vowels('Cusco')
    ۲

    >>> count_vowels('Manila')
    ۳
    """

Doctest در حال حاضر در حال اجرا است. بنابراین می توانید برنامه نویسی خود را شروع کنید.

بیایید با مقداردهی اولیه یک متغیر شروع کنیم: از total_vowels برای حفظ حروف صدادار در کلمه استفاده کنید. حالا در مرحله بعد یک حلقه for ایجاد کنید تا بین حروف رشته تکرار شود. سپس از یک دستور شرطی برای بررسی اینکه حروف صدادار هستند استفاده کنید. تعداد حروف صدادار در طول چرخه افزایش می یابد و در نهایت آخرین عدد به دست آمده از تعداد کلمات صدادار به total_values ​​برمی گردد. بنابراین برنامه مشابه ساختار ارائه شده بدون کانال است، به شرح زیر:

def count_vowels(word):
    total_vowels = 0
    for letter in word:
        if letter in 'aeiou':
            total_vowels += 1
    return total_vowels

اکنون کلید اصلی خود را در پایین کد وارد کرده و ماژول Ductest را اجرا کنید:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

در نهایت برنامه به شرح زیر است:

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

    >>> count_vowels('Cusco')
    ۲

    >>> count_vowels('Manila')
    ۳
    """
    total_vowels = 0
    for letter in word:
        if letter in 'aeiou':
            total_vowels += 1
    return total_vowels

if __name__ == "__main__":
    import doctest
    doctest.testmod()

می توانید این برنامه را با استفاده از دستور python یا python3 (بسته به منابع مجازی خود) اجرا کنید:

python counting_vowels.py

اگر کل برنامه شما مطابق بالا نوشته شده باشد، تمام تست ها باید پشت سر گذاشته شود و نتیجه ای نخواهید گرفت. این به این معنی است که شما در آزمون ها موفق شده اید. این ویژگی برای شروع برنامه برای اهداف دیگر مفید است. اگر تست را به طور خاص برای دیدن نتیجه اجرا کنید، می توانید از v-flag به صورت زیر استفاده کنید:

python counting_vowels.py -v

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

Trying:
    count_vowels('Cusco')
Expecting:
    ۲
ok
Trying:
    count_vowels('Manila')
Expecting:
    ۳
ok
۱ items had no tests:
    __main__
۱ items passed all tests:
   ۲ tests in __main__.count_vowels
۲ tests in 2 items.
۲ passed and 0 failed.
Test passed.

تا کنون آزمون را با موفقیت پشت سر گذاشته اید. با این حال، ممکن است کد برنامه برای شرایط خاص بهینه نشده باشد. در زیر می آموزیم که چگونه از Doctests برای بهبود کد خود استفاده کنیم.

از Doctest برای بهبود و تقویت کد استفاده کنید

تا اینجا برنامه ای داریم که کار می کند. اما شاید بهترین برنامه در دسترس نباشد. بنابراین در این مرحله سعی می کنیم کاستی های جزئی آن را اصلاح کنیم. به عنوان مثال، آیا تا به حال فکر کرده اید که اگر یک مصوت را به شکل اصلی وارد کنیم چه اتفاقی می افتد؟

نمونه ای از استفاده از doctest ها در پایتون

در نتیجه نمونه دیگری را در Doctest وارد خواهید کرد. این بار به کلمه «استانبول» فکر کنید. استانبول نیز مانند مانیل دارای سه مصوت است.
در اینجا می توانید برنامه به روز شده را با یک مثال جدید مشاهده کنید:

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

    >>> count_vowels('Cusco')
    ۲

    >>> count_vowels('Manila')
    ۳

    >>> count_vowels('Istanbul')
    ۳
    """
    total_vowels = 0
    for letter in word:
        if letter in 'aeiou':
            total_vowels += 1
    return total_vowels

if __name__ == "__main__":
    import doctest
    doctest.testmod()

اکنون دوباره برنامه را اجرا کنید:

$ python counting_vowels.py

همون لحظه متوجه اشتباهی شدیم که دنبالش بودیم! به عبارت ساده، پس از اجرا خروجی زیر را دریافت خواهید کرد:

**********************************************************************
File "counting_vowels.py", line 14, in __main__.count_vowels
Failed example:
    count_vowels('Istanbul')
Expected:
    ۳
Got:
    ۲
**********************************************************************
۱ items had failures:
   ۱ of   3 in __main__.count_vowels
***Test Failed*** 1 failures.

خروجی بالا نشان می دهد که برنامه شما با خطا مواجه شده است. انتظار داشتید که 3 مصوت را نشان دهد در حالی که فقط 2 مصوت را تشخیص می دهد. اما دلیل این خطا چیست؟

دلیل خطا این است که در عبارت شرطی if حرف در ‘aeiou’: حروف صدادار کوچک تعریف کرده اید و برنامه نمی تواند حروف بزرگ را تشخیص دهد.

برای حل این مشکل، می‌توانید حروف صدادار را به‌عنوان AEIOUaeiou تعریف کنید یا می‌توانید کلمه را به word.lower () تغییر دهید تا هر حرف بزرگ را به حروف کوچک تبدیل کنید و بنابراین آن را به جز برای شمارش محاسبه کنید. آهسته. تدریجی.

def count_vowels(word):
    """
    Given a single word, return the total number of vowels in that single word.

    :param word: str
    :return: int

    >>> count_vowels('Cusco')
    ۲

    >>> count_vowels('Manila')
    ۳

    >>> count_vowels('Istanbul')
    ۳
    """
    total_vowels = 0
    for letter in word.lower():
        if letter in 'aeiou':
            total_vowels += 1
    return total_vowels

if __name__ == "__main__":
    import doctest
    doctest.testmod()

در نهایت، برنامه را با استفاده از python counting_vowels.py -v و یک پرچم کلمه دار اجرا کنید. ممکن است این برنامه بهترین برنامه ممکن نباشد و پس از راه اندازی خطاهایی رخ دهد.

مثلاً اگر کلمه «سیدنی» را در نظر بگیرید. در زبان انگلیسی، حرف Y گاهی به عنوان مصوت در نظر گرفته می شود. یا مثلاً اگر کلمه «وورزبورگ» را در نظر بگیرید، حرف «ü» در انگلیسی چیست؟ چگونه باید با این کلمات برخورد کرد؟ از چه کد یا دستوراتی برای این کلمات استفاده خواهید کرد؟

به عنوان یک برنامه نویس، گاهی اوقات باید تصمیمات پیچیده ای بگیرید. در بسیاری از موارد، طیف کاملی از گزینه ها را در نظر نخواهید گرفت. به همین دلیل است که ماژول Doctest ابزار خوبی برای شروع به فکر کردن در مورد موارد خاص و ثبت اسناد اولیه است. اما در نهایت باید از تست های سفارشی انسانی برای ایجاد اپلیکیشن های قوی استفاده کنید.

نتیجه

ماژول Doctest نه تنها راهی برای تست و مستندسازی نرم افزار است، بلکه راهی برای فکر کردن به کدنویسی، نحوه شروع، مستندسازی، تست و نوشتن کد است. در واقع، فقدان تست کد نه تنها منجر به خطا، بلکه منجر به اختلال در عملکرد نرم افزار می شود.

سوالات متداول

1. چگونه از Doctest در پایتون استفاده کنم؟

ساده ترین راه برای شروع استفاده از doctest استفاده از کد زیر در هر ماژول M است:

  • if __name__ == “__main__”: import doctest doctest. حالت تست ()
  • پایتون M. py.
  • پایتون M. py -v.
  • python -m doctest -in مثال. py

2. روش صحیح نوشتن Doctest در پایتون چیست؟

  1. تست پایتون با استفاده از ماژول Doctest به شرح زیر است:
  2. وارد ماژول Doctest شوید.
  3. تابع را با docstring بنویسید. در داخل Docstring، دو خط زیر را بنویسید تا همان ویژگی را آزمایش کنید. >>>…
  4. کد تابع را بنویسید.
  5. حالا با Doctest تماس بگیرید. تابع Testmod (نام = نام تابع، verbose = True) برای آزمایش.

{“@context”: “https://schema.org”، “@type”: “FAQPage”، “mainEntity”: [{
“@type”: “Question”,
“name”: “چگونه از Doctest در پایتون استفاده کنیم؟”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “ساده ترین راه برای شروع استفاده از doctest این است که در هر ماژول M از کد زیر استفاده کنید:

if __name__ == “__main__”: import doctest doctest. testmod()
python M. py.
python M. py -v.
python -m doctest -v example. py.”
}
},{
“@type”: “Question”,
“name”: “روش صحیح نوشتن Doctest در پایتون چیست؟”,
“acceptedAnswer”: {
“@type”: “Answer”,
“text”: “تست در پایتون با استفاده از ماژول Doctest به صورت زیر است:
ماژول Doctest را وارد کنید.
تابع را با docstring بنویسید. در داخل Docstring دو خط زیر را برای آزمایش همان تابع بنویسید. >>>…
کد تابع را بنویسید.
حالا با Doctest را فراخوانی کنید. تابع testmod(name=function_name، verbose=True) برای آزمایش.”
}
}]
}

نحوه نوشتن Doctest در پایتون برای اولین بار در پارسوپک. به نظر می رسد.