نحوه نوشتن و استفاده از doctest برای نوشتن کد تست در رشته‌های docstring در پایتون.

کسب و کار

پایتون دارای یک ماژول استاندارد doctest است که محتویات یک docstring را آزمایش می‌کند و نوشتن نمونه‌های ورودی و خروجی در docstring را آسان‌تر می‌کند و درک مستندات را آسان‌تر می‌کند.

اطلاعات زیر در اینجا ارائه شده است.

  • یک مثال ساده از تست با doctest
    • اگر خطایی وجود نداشته باشد
    • اگر خطایی وجود داشته باشد
  • نتایج خروجی را با گزینه ها و آرگومان ها کنترل کنید
    • -vگزینه
    • verboseآرگومان (به عنوان مثال تابع، برنامه، برنامه)
  • ماژول doctest را از خط فرمان اجرا کنید
  • تست های نوشتن در یک فایل متنی خارجی
    • نحوه نوشتن یک فایل متنی
    • از فایل py فراخوانی شده است
    • یک فایل متنی را مستقیما اجرا کنید

یک مثال ساده از تست با doctest

رشته docstring رشته ای است که در یکی از موارد زیر محصور شده است: (1) نام تابعی که باید آزمایش شود، (2) نام تابعی که باید آزمایش شود، و (3) مقدار خروجی مورد انتظار در حالت تعاملی پایتون.

  • """
  • ''

اگر خطایی وجود نداشته باشد

اطمینان حاصل کنید که کد در محتوای تابع و رشته مستند درست است.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


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

این فایل را اجرا کنید.

$ python3 doctest_example.py

اگر خطایی وجود نداشته باشد، هیچ چیزی خروجی نخواهد شد.

if __name__ == '__main__'این به این معنی است که پردازش بعدی را فقط زمانی اجرا کنید که فایل اسکریپت مربوطه از خط فرمان اجرا شود.

اگر خطایی وجود داشته باشد

اگر کد زیر را اشتباه ایجاد و اجرا کنید، یک خطا در خروجی ظاهر می شود.

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    10
    '''

    return a * b


if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python3 doctest_example_error.py
**********************************************************************
File "doctest_example_error.py", line 3, in __main__.add
Failed example:
    add(1, 2)
Expected:
    3
Got:
    2
**********************************************************************
File "doctest_example_error.py", line 5, in __main__.add
Failed example:
    add(5, 10)
Expected:
    10
Got:
    50
**********************************************************************
1 items had failures:
   2 of   2 in __main__.add
***Test Failed*** 2 failures.

به صورت زیر نشان داده شده است.

مقادیر خروجی مورد انتظار در doctest نوشته شده است.Expected
مقدار واقعی خروجیGot

نتایج خروجی را با گزینه ها و آرگومان ها کنترل کنید

-vگزینه

اگر می خواهید نتایج خروجی حتی در صورت عدم وجود خطا نمایش داده شود، دستور را با گزینه -v در خط فرمان اجرا کنید.

$ python3 doctest_example.py -v
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

verboseآرگومان (به عنوان مثال تابع، برنامه، برنامه)

اگر می خواهید همیشه نتایج خروجی نمایش داده شود، آرگومان verbose=True را در doctest.testmod() در فایل py مشخص کنید.

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

نتایج خروجی همیشه بدون گزینه -v در زمان اجرا نمایش داده می شود.

$ python3 doctest_example_verbose.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

ماژول doctest را از خط فرمان اجرا کنید

if __name__ == '__main__'اگر می‌خواهید کار دیگری در آن انجام دهید، می‌توانید ماژول doctest را مستقیماً از خط فرمان بدون فراخوانی doctest.testmod() در فایل py اجرا کنید.

برای مثال در موارد زیر

def add(a, b):
    '''
    >>> add(1, 2)
    3
    >>> add(5, 10)
    15
    '''

    return a + b


if __name__ == '__main__':
    import sys
    result = add(int(sys.argv[1]), int(sys.argv[2]))
    print(result)

می تواند آرگومان های خط فرمان را دریافت کند و فرآیند را طبق معمول اجرا کند.

$ python3 doctest_example_without_import.py 3 4
7

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

$ python3 -m doctest doctest_example_without_import.py

$ python3 -m doctest -v doctest_example_without_import.py
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items had no tests:
    doctest_example_without_import
1 items passed all tests:
   2 tests in doctest_example_without_import.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

تست های نوشتن در یک فایل متنی خارجی

همچنین می‌توانید کد آزمایشی را به‌جای اینکه در Docstring در یک فایل متنی خارجی بنویسید.

نحوه نوشتن یک فایل متنی

همانطور که در docstring توضیح داده شده است در قالب حالت تعاملی پایتون بنویسید. لازم است توابع مورد استفاده را وارد کنید.

اگر می خواهید فایل متنی را در همان دایرکتوری فایل .py قرار دهید تا آزمایش شود، کافی است آن را به صورت زیر وارد کنید.

>>> from doctest_example import add
>>> add(1, 2)
3
>>> add(5, 10)
15

از فایل py فراخوانی شده است

برای آزمایش، doctest.testfile() را در یک فایل .py دیگر فراخوانی کنید.

مسیر فایل متنی را مشخص کنید که کد تست به عنوان آرگومان doctest.testfile() نوشته شده است.

import doctest
doctest.testfile('doctest_text.txt')

این فایل py را اجرا کنید.

$ python3 doctest_example_testfile.py -v
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.

یک فایل متنی را مستقیما اجرا کنید

حتی اگر فایل py را ندارید، می توانید فایل متنی را مستقیماً از خط فرمان بخوانید و تست ها را اجرا کنید.

دستور پایتون را با گزینه -m اجرا کنید تا doctest را به صورت اسکریپت اجرا کنید. می توانید مسیر فایل متنی را به عنوان آرگومان خط فرمان مشخص کنید.

$ python3 -m doctest -v doctest_text.txt
Trying:
    from doctest_example import add
Expecting nothing
ok
Trying:
    add(1, 2)
Expecting:
    3
ok
Trying:
    add(5, 10)
Expecting:
    15
ok
1 items passed all tests:
   3 tests in doctest_text.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.
Copied title and URL