Стандартный дистрибутив Python содержит модуль Doctest. Функциональность этого модуля позволяет искать фрагменты текста, которые выглядят как интерактивные сеансы Python, и выполняет эти сеансы, чтобы увидеть, работают ли они точно так, как показано.
Doctest может быть очень полезен в следующих сценариях —
-
Чтобы проверить актуальность строк документации модуля, убедитесь, что все интерактивные примеры по-прежнему работают так, как описано в документации.
-
Выполнить регрессионное тестирование, проверив, что интерактивные примеры из тестового файла или тестового объекта работают должным образом.
-
Чтобы написать учебную документацию для пакета, подробно иллюстрированного примерами ввода-вывода
Чтобы проверить актуальность строк документации модуля, убедитесь, что все интерактивные примеры по-прежнему работают так, как описано в документации.
Выполнить регрессионное тестирование, проверив, что интерактивные примеры из тестового файла или тестового объекта работают должным образом.
Чтобы написать учебную документацию для пакета, подробно иллюстрированного примерами ввода-вывода
В Python строка документации — это строковый литерал, который появляется как первое выражение в классе, функции или модуле. Он игнорируется при выполнении набора, но он распознается компилятором и помещается в атрибут __doc__ включающего класса, функции или модуля. Поскольку он доступен через самоанализ, он является каноническим местом для документирования объекта.
Обычная практика — помещать пример использования различных частей кода Python в строку документации. Модуль doctest позволяет проверить, соответствуют ли эти строки документации прерывистым изменениям в коде.
В следующем коде факториальная функция определяется с использованием примера использования. Чтобы проверить правильность использования примера, вызовите функцию testmod () в модуле doctest.
""" This is the "example" module. The example module supplies one function, factorial(). For example, >>> factorial(5) 120 """ def factorial(x): """Return the factorial of n, an exact integer >= 0. >>> factorial(-1) Traceback (most recent call last): ... ValueError: x must be >= 0 """ if not x >= 0: raise ValueError("x must be >= 0") f = 1 for i in range(1,x+1): f = f*i return f if __name__ == "__main__": import doctest doctest.testmod()
Введите и сохраните приведенный выше скрипт как FactDocTest.py и попробуйте выполнить этот скрипт из командной строки.
Python FactDocTest.py
Выходные данные не будут показаны, если пример не удался. Теперь измените командную строку на следующее —
Python FactDocTest.py –v
Консоль теперь покажет следующий вывод —
C:\Python27>python FactDocTest.py -v Trying: factorial(5) Expecting: 120 ok Trying: factorial(-1) Expecting: Traceback (most recent call last): ... ValueError: x must be >= 0 ok 2 items passed all tests: 1 tests in __main__ 1 tests in __main__.factorial 2 tests in 2 items. 2 passed and 0 failed. Test passed.
Если, с другой стороны, код функции factorial () не дает ожидаемого результата в строке документации, будет отображаться результат ошибки. Например, измените f = 2 вместо f = 1 в приведенном выше сценарии и снова запустите doctest. Результат будет следующим:
Trying: factorial(5) Expecting: 120 ********************************************************************** File "docfacttest.py", line 6, in __main__ Failed example: factorial(5) Expected: 120 Got: 240 Trying: factorial(-1) Expecting: Traceback (most recent call last): ... ValueError: x must be >= 0 ok 1 items passed all tests: 1 tests in __main__.factorial ********************************************************************** 1 items had failures: 1 of 1 in __main__ 2 tests in 2 items. 1 passed and 1 failed. ***Test Failed*** 1 failures.
Doctest: проверка примеров в текстовом файле
Еще одно простое приложение doctest — тестирование интерактивных примеров в текстовом файле. Это можно сделать с помощью функции testfile ().
Следующий текст хранится в текстовом файле с именем «example.txt».
Using ''factorial'' ------------------- This is an example text file in reStructuredText format. First import ''factorial'' from the ''example'' module: >>> from example import factorial Now use it: >>> factorial(5) 120
Содержимое файла обрабатывается как строка документации. Чтобы проверить примеры в текстовом файле, используйте функцию testfile () модуля doctest.
Как и в случае с testmod (), testfile () ничего не отобразит, если не удастся выполнить пример. Если пример терпит неудачу, то неудачный пример (ы) и причина (и) сбоя (ей) выводятся на консоль, используя тот же формат, что и testmod ().
В большинстве случаев копирование и вставка сеанса интерактивной консоли работает нормально, но doctest не пытается выполнить точную эмуляцию какой-либо конкретной оболочки Python.
Любой ожидаемый вывод должен следовать сразу за последней строкой «>>>» или «…», содержащей код, а ожидаемый вывод (если таковой имеется) продолжается до следующей строки «>>>» или пробела.
Ожидаемый вывод не может содержать строку, в которой есть все пробелы, поскольку такая строка используется для обозначения конца ожидаемого вывода. Если ожидаемый результат содержит пустую строку, поместите <BLANKLINE> в ваш пример документа каждый раз, когда ожидается пустая строка.