Доктест - Doctest

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

Особенности реализации

Доктест делает инновационные[нужна цитата ] использование следующих возможностей Python:[1]

  • строки документации
  • Интерактивная оболочка Python (как командная строка, так и включенное простаивающее приложение)
  • Самоанализ Python

При использовании оболочки Python за основным приглашением: >>> следуют новые команды. Вторичная подсказка: ... используется при продолжении выполнения команд в нескольких строках; и результат выполнения команды ожидается в следующих строках. Пустая строка или другая строка, начинающаяся с основного приглашения, рассматривается как конец вывода команды.

Модуль doctest ищет такие последовательности подсказок в строке документации, повторно выполняет извлеченную команду и сравнивает вывод с выводом команды, указанной в примере проверки строк документации.

Действие по умолчанию при запуске doctests - не показывать вывод при прохождении тестов. Это может быть изменено с помощью опций программы запуска тестов. Кроме того, doctest интегрирован с модулем модульного тестирования Python, что позволяет запускать doctest как стандартные тестовые наборы unittest. Средство выполнения тестовых сценариев Unittest предоставляет больше возможностей при запуске тестов, таких как создание отчетов о тестовой статистике, например о пройденных и неудачных тестах.

Грамотное программирование и доктесты

Хотя doctest не позволяет встраивать программу Python в повествовательный текст, он позволяет встраивать проверяемые примеры в строки документации, где строки документации могут содержать другой текст. Строки документов, в свою очередь, можно извлекать из файлов программы для создания документации в других форматах, таких как HTML или PDF. Можно создать программный файл, содержащий документацию, тесты, а также код и тесты, легко проверяемые по коду. Это позволяет коду, тестам и документации развиваться вместе.

Документирование библиотек на примере

Доктесты хорошо подходят для ознакомления с библиотекой, демонстрируя, как используется API.

На основе вывода интерактивного интерпретатора Python текст может быть смешан с тестами, которые проверяют библиотеку, показывая ожидаемые результаты.

Примеры

Первый пример показывает, как повествовательный текст можно перемежать с тестируемыми примерами в строке документации. Во втором примере показаны другие функции doctest и их объяснение. Пример 3 настроен на запуск всех тестов в файле при запуске файла, но при импорте в виде модуля тесты не запускаются.

Пример 1. Доктест, встроенный в строку документации функции

def list_to_0_index(lst):    "" "Решение проблемы, приведенное в:    https://rgrig.blogspot.com/2005/11/writing-readable-code.html    'Учитывая список, lst, скажем, для каждого элемента 0-индекс, где он появляется для    первый раз. Итак, список x = [0, 1, 4, 2, 4, 1, 0, 2] является    преобразуется в y = [0, 1, 2, 3, 2, 1, 0, 3]. Заметьте, что для всех    i мы имеем x [y [i]] = x [i]. Используйте любой язык программирования и любые данные    представление, которое вы хотите ».    >>> x = [0, 1, 4, 2, 4, 1, 0, 2]    >>> list_to_0_index (x)    [0, 1, 2, 3, 2, 1, 0, 3]    >>>    """    возвращаться [lst.индекс(я) за я в lst]

Пример 2: тесты, встроенные в файл README.txt

======================Демонстрационные документы======================Это просто пример того, как выглядит текст README, который можно использовать сфункция doctest.DocFileSuite () из модуля Python doctest.Обычно файл README объясняет API модуля, например:>>> а = 1>>> б = 2>>> а + б3Обратите внимание, что мы только что продемонстрировали, как сложить два числа в Python, и как будет выглядеть результат.Специальная опция позволяет вам быть нечеткими в ваших примерах:>>> о = объект()>>> о                 # doctest: + ЭЛЛИПСИС<object object at 0x...>Исключения тоже можно тестировать очень хорошо:>>> ИксОтслеживание (последний вызов последний): ...NameError: имя 'x' не определено

Пример 3: unique_words.py

В этом примере также имитируется ввод в функцию из файла с помощью модуля Python StringIO.

def unique_words(страница):    '' 'Вернуть набор уникальных слов в списке строк текста.    Пример:    >>> из StringIO импортировать StringIO    >>> fileText = "" "кот сел на циновку    ... коврик был на кошке    ... одна рыба две рыбы красная рыба    ... синяя рыба    ... У этой рыбы желтая машина    ... У этой рыбы есть желтая звездочка "" "    >>> файл = StringIO (fileText)    >>> page = file.readlines ()    >>> words = unique_words (страница)    >>> распечатать отсортированный (список (слова))    [«This», «a», «blue», «car», «cat», «fish», «has», «mat»,     «on», «ondur», «one», «red», «sat», «star», «the», «two»,     «был», «желтый»]    >>>    '''    возвращаться набор(слово за линия в страница за слово в линия.расколоть())def _тест():    импорт доктест    доктест.testmod()если __имя__ == "__главный__":    _тест()

Генераторы документов и документации

Оба формата EpyText Эпидок и Docutils ' reStructuredText формат поддерживает разметку разделов документации в строках документации.

Реализация на других языках программирования

В C ++ фреймворк doctest является наиболее близкой возможной реализацией концепции - тесты могут быть написаны непосредственно в производственном коде с минимальными накладными расходами и возможностью вырезать их из двоичного файла.[2]

ExUnit.DocTest Эликсир Библиотека реализует функциональность, аналогичную Doctest.[3]

Реализация Доктеста для Haskell.[4]

Написание тестов документации на Вяз.[5]

Написание тестов документации на Ржавчина.[6]

Рекомендации

  • Питерс, Тим (1999-03-06). "тестирование, управляемое строкой документации". Usenet:  000001be679b $ 0b263e00 $ a99e2299 @ tim.
  • «Средства разработки - доктест». Справочник по библиотеке Python. 2008-12-18.