Как да напишем и използваме doctest за писане на тестови код в docstrings в 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