Доктест - 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.