Як напісаць і выкарыстоўваць doctest для напісання тэставага кода ў радках дакументаў на Python.

Бізнэс

Python пастаўляецца са стандартным модулем doctest, які правярае змесціва радка дакументаў, што дазваляе лёгка запісваць прыклады ўводу і вываду ў радок дакументаў і робіць дакументацыю больш простым для разумення.

Тут прадстаўлена наступная інфармацыя.

  • Просты прыклад тэставання з doctest
    • Калі няма памылкі
    • Калі ёсць памылка
  • Кантралюйце вынікі вываду з дапамогай параметраў і аргументаў
    • -vВарыянт
    • verboseаргумент (напрыклад, функцыя, праграма, праграма)
  • Запусціце модуль doctest з каманднага радка
  • Напісанне тэстаў у знешні тэкставы файл
    • Як напісаць тэкставы файл
    • Выклікаецца з файла py
    • Непасрэдна выканаць тэкставы файл

Просты прыклад тэставання з doctest

Дакументальны радок – гэта радок, заключаны ў адно з наступнага: (1) назва функцыі, якая будзе тэставацца, (2) назва функцыі, якая будзе тэставацца, і (3) чаканае значэнне вываду ў інтэрактыўным рэжыме Python.

  • """
  • ''

Калі няма памылкі

Пераканайцеся, што код правільны ў функцыі і змесціве радка дакументаў.

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.

Напісанне тэстаў у знешні тэкставы файл

Вы таксама можаце напісаць тэставы код у знешні тэкставы файл, а не ў радок дакументаў.

Як напісаць тэкставы файл

Пішыце ў фармаце інтэрактыўнага рэжыму Python, як апісана ў радку дакументаў. Неабходна імпартаваць функцыі, якія будуць выкарыстоўвацца.

Калі вы хочаце змясціць тэкставы файл у той жа каталог, што і файл .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, вы можаце прачытаць тэкставы файл непасрэдна з каманднага радка і запусціць тэсты.

Запусціце каманду Python з опцыяй -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