Рубрики
Без рубрики

Доктесты на Python – Краткий обзор

Давайте узнаем о конкретном механизме тестирования и отладки в Python. Doctests в Python-это тестовые случаи для функций, и они могут быть использованы для проверки

Автор оригинала: 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, как их писать, как их использовать и когда их использовать.

Мы обсудили, как доктесты являются механизмом тестирования для программистов и как это облегчает написание тестовых случаев.

Я надеюсь, что вы чему-то научились и увидимся в другом уроке.