Jump to content

доктор

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

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

[ редактировать ]

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

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

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

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

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

Грамотное программирование и документация

[ редактировать ]

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

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

[ редактировать ]

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

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

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

Пример 1: Документация, встроенная в строку документации функции

[ редактировать ]
def list_to_0_index(lst):
    """A solution to the problem given in:
    https://rgrig.blogspot.com/2005/11/writing-readable-code.html

    'Given a list, lst, say for each element the 0-index where it appears for
    the first time. So the list x = [0, 1, 4, 2, 4, 1, 0, 2] is
    transformed into y = [0, 1, 2, 3, 2, 1, 0, 3]. Notice that for all
    i we have x[y[i]] = x[i]. Use any programming language and any data
    representation you want.'

    >>> x = [0, 1, 4, 2, 4, 1, 0, 2]
    >>> list_to_0_index(x)
    [0, 1, 2, 3, 2, 1, 0, 3]
    >>>
    """

    return [lst.index(i) for i in lst]

Пример 2: документация, встроенная в файл README.txt.

[ редактировать ]
======================
Demonstration doctests
======================

This is just an example of what a README text looks like that can be used with
the doctest.DocFileSuite() function from Python's doctest module.

Normally, the README file would explain the API of the module, like this:

>>> a = 1
>>> b = 2
>>> a + b
3

Notice, that we just demonstrated how to add two numbers in Python, and 
what the result will look like.

A special option allows you to be somewhat fuzzy about your examples:

>>> o = object()
>>> o                 # doctest: +ELLIPSIS
<object object at 0x...>

Exceptions can be tested very nicely too:

>>> x
Traceback (most recent call last):
 ...
NameError: name 'x' is not defined

Пример 3: unique_words.py

[ редактировать ]

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

def unique_words(page):
    """Return set of the unique words in list of lines of text.

    Example:

    >>> from StringIO import StringIO
    >>> fileText = '''the cat sat on the mat
    ... the mat was ondur the cat
    ... one fish two fish red fish
    ... blue fish
    ... This fish has a yellow car
    ... This fish has a yellow star'''
    >>> file = StringIO(fileText)
    >>> page = file.readlines()
    >>> words = unique_words(page)
    >>> print sorted(list(words))
    ["This", "a", "blue", "car", "cat", "fish", "has", "mat",
     "on", "ondur", "one", "red", "sat", "star", "the", "two",
     "was", "yellow"]
    >>>
    """
    return set(word for line in page for word in line.split())

def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()

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

[ редактировать ]

И формат EpyText Epydoc Docutils , и формат reStructuredText поддерживают разметку разделов документации в строках документации.

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

[ редактировать ]

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

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

Реализация Doctest для Haskell . [5]

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

Написание тестов документации на Rust . [7]

Написание тестов документации в Elixir . [8]

byexample[9] поддерживает написание документов для нескольких популярных языков программирования (например, Python, Ruby, Shell, JavaScript, C/C++, Java, Go, Rust) внутри Markdown , reStructuredText и других текстовых документов.

  1. ^ «doctest — Тестирование интерактивных примеров Python» . Документация Python . Архивировано из оригинала 15 июля 2024 г.
  2. ^ «[LONG] тестирование на основе строки документации» . groups.google.com . Архивировано из оригинала 2 октября 2022 г. Проверено 16 июля 2024 г.
  3. ^ "доктест/доктест" . 15 июля 2024 г. Получено 16 июля 2024 г. - через GitHub.
  4. ^ «ExUnit.DocTest — ExUnit v1.17.2» . hexdocs.pm . Проверено 16 июля 2024 г.
  5. ^ "соль/доктест" . 16 июля 2024 г. Архивировано из оригинала 31 мая 2024 г. Получено 16 июля 2024 г. - через GitHub.
  6. ^ "tshm/elm-doctest" . 05.04.2023. Архивировано из оригинала 07 марта 2023 г. Получено 16 июля 2024 г. - через GitHub.
  7. ^ «Тестирование» . doc.rust-lang.org . Архивировано из оригинала 5 января 2024 г. Проверено 16 июля 2024 г.
  8. ^ «Доктесты, паттерны и прочее — Эликсир v1.17.2» . hexdocs.pm . Проверено 16 июля 2024 г.
  9. ^ «по примеру» . по примеру . Архивировано из оригинала 27 мая 2023 г. Проверено 16 июля 2024 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 13f12218b6244d1a2ae8d439e351f38f__1721163960
URL1:https://arc.ask3.ru/arc/aa/13/8f/13f12218b6244d1a2ae8d439e351f38f.html
Заголовок, (Title) документа по адресу, URL1:
doctest - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)