Автор оригинала: Pankaj Kumar.
Давайте узнаем о конкретном механизме тестирования и отладки в Python. Доктесты в Python-это тестовые случаи для функций, и их можно использовать для проверки того, работает ли функция должным образом.
Что такое строки документов в Python?
Прежде чем мы перейдем к док-тестам, нам нужно узнать о док-строках .
- Строки документов-это необязательные строки, заключенные в тройные кавычки, которые записываются в первую очередь при объявлении функции.
- Строки документов используются для описания функции. Мы можем написать, что делает функция, как она работает, количество аргументов, которые она принимает, тип возвращаемого объекта и т. Д.
Все эти вещи описывают назначение функции программисту, и программист может получить доступ к строке документа функции с помощью атрибута __doc__
.
Возьмем пример функции, которая выводит факториал числа..
def factorial(num): """ A function that returns the factorial of a given number. No. of arguments: 1, Integer Returns: Integer """ res = 1 for i in range(1, num+1): res *= i print(res)
Как вы можете видеть, сразу после объявления функции, прежде чем что-либо делать, мы пишем строку, заключенную в тройные кавычки, которая описывает функцию. Это сделает эту строку документацией для этой функции, и доступ к атрибуту __doc__
вернет эту строку. Давайте сделаем это сейчас.
print(factorial.__doc__)
Выход:
A function that returns the factorial of a given number. No. of arguments: 1, Integer Returns: Integer
Теперь, когда нам ясно, что такое docstring, мы можем перейти к doctests.
Что такое doctests в Python?
Как мы уже обсуждали ранее, тесты на Python-это тестовые случаи, написанные внутри строки документа. В нашем случае факториал 5 будет равен 120, поэтому вызов факториал(5)
выведет 120
, аналогично, вызов factorial(0)
выведет 1
.
Это могут быть тестовые случаи, которые мы можем проверить для функции, и для этого мы описываем их в строке документа, используя синтаксис, подобный этому:
def factorial(num): """ A function that returns the factorial of a given number. No. of arguments: 1, Integer Returns: Integer >>> factorial(5) 120 >>> factorial(0) 1 """ res = 1 for i in range(1, num+1): res *= i print(res)
Если вы помните оболочку Python, мы пишем весь код в оболочке после трех угловых скобок( >>>
), и код будет выполнен сразу же, как только мы нажмем enter.
Итак, если мы вызовем factorial(5)
через оболочку Python, он будет выглядеть точно так, как мы написали в приведенной выше строке документа.
Указание этого в строке документа говорит Python, что приведенные выше строки являются ожидаемым результатом после запуска factorial(5)
в оболочке.
Аналогично ниже мы написали точный ожидаемый результат для факториала(0)
.
Обратите внимание, что тесты чувствительны к пробелам и вкладкам, поэтому нам нужно написать именно то, что мы хотим получить в результате.
Мы также можем указать исключения и ошибки, которые функция может возвращать в результате неправильного ввода.
Теперь, когда у нас есть несколько тестов, написанных в нашей функции, давайте воспользуемся ими и проверим, правильно ли работает функция.
Успешные доктесты на Python
import doctest doctest.testmod(name='factorial', verbose=True)
Вот как мы используем doctests в Python. Мы импортируем модуль с именем doctest
и используем его функцию testmod
, как показано на рисунке.
Результат будет выглядеть следующим образом:
Trying: factorial(5) Expecting: 120 ok Trying: factorial(0) Expecting: 1 ok 1 items had no tests: factorial 1 items passed all tests: 2 tests in factorial.factorial 2 tests in 2 items. 2 passed and 0 failed. Test passed. TestResults(failed=0, attempted=2)
Как вы можете видеть, он будет запускать каждый тестовый случай и проверять, соответствует ли фактический результат ожидаемому. В конце концов, он напечатает результат тестирования, и программист сможет проанализировать, как работает функция.
Если какой-либо из тестовых случаев завершится неудачно, он выведет точный вывод после ожидаемого вывода и укажет количество тестовых случаев, которые завершились неудачно в конце.
Неудачные тесты на Python
Давайте сделаем доктесты на Python, которые, как мы знаем, потерпят неудачу:
def factorial(num): """ A function that returns the factorial of a given number. No. of arguments: 1, Integer Returns: Integer >>> factorial(5) 120 >>> factorial(0) 1 >>> factorial(2) Two """ res = 1 for i in range(1, num+1): res *= i print(res) import doctest doctest.testmod(name='factorial', verbose=True)
В третьем доктесте отправка 2
никогда не будет печатать Два
, поэтому давайте посмотрим результат:
Trying: factorial(5) Expecting: 120 ok Trying: factorial(0) Expecting: 1 ok Trying: factorial(2) Expecting: Two ********************************************************************** File "__main__", line 13, in factorial.factorial Failed example: factorial(2) Expected: Two Got: 2 1 items had no tests: factorial ********************************************************************** 1 items had failures: 1 of 3 in factorial.factorial 3 tests in 2 items. 2 passed and 1 failed. ***Test Failed*** 1 failures. TestResults(failed=1, attempted=3)
Для третьего тестового случая он потерпел неудачу, и модуль напечатал точно, как он потерпел неудачу, и в конце мы видим, что было предпринято три тестовых случая и один потерпел неудачу.
Использование доктестов в Python?
Doctests в Python предназначены для использования при создании функции с учетом ожидаемого результата.
Если вам нужна функция, которая печатает точно что-то при вызове с чем-то, то вы можете указать ее в doctest, и в конце модуль doctest позволит вам запустить все тестовые случаи сразу, и вы сможете увидеть, как выполняется функция.
Упомянутые тестовые случаи должны быть именно тем, что вы ожидаете, если какой-либо из них не сработает, это указывает на ошибку в функции, которую следует исправить.
Испытания готового продукта всегда должны быть успешными.
Хотя мы не можем написать каждый тестовый случай, в большом проекте неплохо написать те, которые могут потерпеть неудачу в результате неожиданного ввода, например 0, 9999999, -1 или “банан”.
Вывод
В этом уроке мы изучили, что такое док-тесты на Python, как их писать, как их использовать и когда их использовать.
Мы обсудили, как доктесты являются механизмом тестирования для программистов и как это облегчает написание тестовых случаев.
Я надеюсь, что вы чему-то научились и увидимся в другом уроке.