Как написать и использовать doctest для написания тестового кода в docstrings в Python.

Бизнес

Python поставляется со стандартным модулем doctest, который проверяет содержимое doc-строки, облегчая написание примеров ввода и вывода в doc-строке и делая документацию более понятной.

Здесь представлена следующая информация.

  • Простой пример тестирования с помощью doctest
    • Если нет ошибки
    • При возникновении ошибки
  • Управление результатами вывода с помощью опций и аргументов
    • -vВариант
    • verboseаргумент (например, функция, программа, программа)
  • Запустите модуль doctest из командной строки
  • Запись тестов во внешний текстовый файл
    • Как написать текстовый файл
    • Вызывается из файла py
    • Прямое выполнение текстового файла

Простой пример тестирования с помощью doctest

docstring — это строка, заключенная в одну из следующих строк: (1) имя тестируемой функции, (2) имя тестируемой функции и (3) ожидаемое выходное значение в интерактивном режиме Python.

  • """
  • '''

Если нет ошибки

Убедитесь в правильности кода в функции и содержимого docstring.

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, как описано в 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, вы можете прочитать текстовый файл непосредственно из командной строки и запустить тесты.

Выполните команду 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