Встречайте doctests, застенчивые гиганты тестовых модулей

1656610332 vstrechajte doctests zastenchivye giganty testovyh modulej

Вы используете Python даже для стирки одежды? И считаете ли вы модульное тестирование скучным, но все равно должны это делать, потому что вы находите ценность в автоматизированном тестировании? Тогда это статья для вас.

Идея

Если вы любитель Python, я считаю, что вы время от времени использовали консоль Python. Предположим, вы пишете несколько встроенных функций, как показано ниже, чтобы поэкспериментировать с материалом:

$ python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 18:10:19) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def addme(a):
...     return a + a
... 
>>> addme(2)
4
>>> addme(1.9)
3.8
>>> addme(0)
0
>>>

Итак, вы написали встроенную функцию и выполнили несколько тестовых запусков, чтобы выполнить некоторые основные проверки. Что если бы Python смог прочитать вышеприведенный результат и сделать соображения за вас во время выполнения? Это идея doctests, мой друг.

Серьезно?

V3es93rVCDb3SSQnkAYWHMY1T8zo38gaupW4
Успокойся, Патрик

Да, вполне! Python иногда представил много интуитивно понятных и… душевных функций, которые сейчас являются основными среди нескольких основных языков. Почему и этому не быть?

Преимущества доктестов

Преимуществ в doctests достаточно много.

Прежде всего, их к смешному легко писать. Я имею в виду, что вы даже можете передать это своему младшему двоюродному брату, изучающему анатомию атомов почвы (а не программирующему), потому что он должен вам за ремонт своего компьютера.

Во-вторых, если вы не считаете, что копировать вставить тяжело, писать им будет приятнее. Однако в этот раз вы должны быть знакомы со средой терминала.

В-третьих, нет необходимости открывать другой файл (даже если вы можете поместить все doctests для вашей программы в один файл), чтобы прочесть тестовый код для любой функции, поскольку они лежат прямо под сигнатурой каждой функции.

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

А как насчет модульных тестов?

Модульные тесты по-прежнему предлагают большую ценность и расширенные возможности тестирования. Хотя doctests отлично подходит для проверки простых и чистых функций, они не очень полезны, когда вам нужно выполнить сложную проверку (или, например, если во время теста была вызвана последовательность команд).

А издевательство?

Doctests могут изящно справляться с издевкой с помощью великолепной библиотеки под названием Minimock. Я призываю вас попробовать и сообщить мне свои мысли.

Хотя мне нравится инициатива, я предпочитаю, чтобы мои тесты играли отдельные роли. Я не хочу, чтобы мои doctests были сильно загружены и единственные для всех. Но это действительно дело вкуса и нет ничего плохого, если вы не согласны. Я более чем рад услышать ваше обоснование, если да.

Рабочий пример

Говорить по дешевке, поэтому давайте напишем код. Ниже приведен рабочий пример использования функции подсказки выше.

addme(a):
    """
    This is a docstring, usually to explain the use of a function. Please do not confuse it with doctests. They both mean to provide forms of documentation, but doctests are executable too.
    >>> addme(4)
    8
    >>> addme('a')
    'aa'
    >>> addme(set())
    Traceback (most recent call last):
        ...
    TypeError: unsupported operand type(s) for +: 'set' and 'set'
    """
    return a + a

if __name__ == '__main__':
    import doctest
    doctest.testmod()
    print(addme(1))

Здесь следует обратить внимание на несколько моментов:

  • Доктесты должны жить внутри строчки документов. Там просто скопируйте и вставьте результаты быстрых тестов вашей консоли Python.
  • Если необходимо смоделировать исключение, необходимо добавить только первую и последнюю строки сообщения об исключении. Вы ожидали жестко запрограммировать пути или выполнить какую-нибудь странную логику, чтобы получить полный путь к файлу и напечатать его полностью? Давай, Python этого не сделает:)
  • Для выполнения тестов требуется библиотека doctest. Но Носу это не нужно.
  • Вы можете запустить вышеуказанное, как обычно, с помощью python mydoctests.py

Мне нужно, чтобы мои тесты проходили как часть цикла CI/CD/CT. Что для меня?

Я здесь не для того, чтобы вас разочаровать, не правда ли? 🙂

Тест для носа поддерживает выполнение всех ваших doctests в дополнение к вашим модульным тестам. Просто добавьте флаг --with-doctest и вы готовы уходить.

Хорошие вещи, куда мне отсюда уходить?

  • Прочитайте документацию Python, чтобы узнать больше о подергиваниях и случаях.
  • Прочтите эту фантастическую книгу, а особенно главу 4, которая охватывает тесты.
  • Проверьте реализацию других языков. Например, для NodeJS
  • Лекарственные тесты и нос

Спасибо, что прочли эту статью, я надеюсь, что она вам понравилась, и что статья вызвала у вас интерес к написанию более (и менее болезненных) тестов. Если да, распространяйте свою любовь с помощью кнопок ниже. Не стесняйтесь также добавлять свои собственные мнения и опыт по doctests.

Первоначально опубликовано на мой блог.

Добавить комментарий

Ваш адрес email не будет опубликован.