На Python doctest и unittest [закрыт]



Я пытаюсь начать с модульного тестирования в Python, и мне было интересно, может ли кто-нибудь объяснить преимущества и недостатки doctest и unittest.



какие условия вы бы использовали для каждого?

646   11  

11 ответов:

оба являются ценными. Я использую как doctest, так и нос занимая место unittest. Я использую doctest для случаев, когда тест дает пример использования, который на самом деле полезен в качестве документации. Как правило, я не делаю эти тесты всеобъемлющими, стремясь исключительно к информативности. Я эффективно использую doctest в обратном порядке: не для проверки правильности моего кода на основе моего doctest, а для проверки правильности моей документации на основе кода.

причина в том, что я найти всеобъемлющие doctests будет загромождать вашу документацию слишком много, так что вы либо в конечном итоге либо непригодные docstrings, либо неполное тестирование.

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

Я использую unittest почти исключительно.

время от времени я буду помещать некоторые вещи в строку документа, которая может использоваться doctest.

95% из тестовых случаев unittest.

Почему? Мне нравится держать docstrings несколько короче и более по существу. Иногда тестовые случаи помогают уточнить строку документа. В большинстве случаев тестовые случаи приложения слишком длинны для строки документа.

еще одно преимущество doctesting заключается в том, что вы можете убедиться, что ваш код делает то, что говорит ваша документация. Через некоторое время изменения программного обеспечения могут заставить вашу документацию и код делать разные вещи. : -)

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

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

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

Итак, чтобы возобновить мой ответ: doctests полезны, когда вам нужно писать небольшие скрипты, и когда вам нужно их передать или показать для исследователей, которые не компьютерщики.

Если вы только начинаете с идеей модульного тестирования, я бы начал с doctest потому что это так просто в использовании. Он также, естественно, обеспечивает некоторый уровень документации. И для более полного тестирования с doctest, вы можете поместить тесты во внешний файл, чтобы он не загромождал вашу документацию.

Я бы предложил unittest Если вы исходите из фона использования JUnit или чего-то подобного, где вы хотите иметь возможность писать модульные тесты в как правило, так же, как вы были в другом месте.

использование обоих является допустимым и довольно простым вариантом. Элемент doctest модуль обеспечивает DoctTestSuite и DocFileSuite методы, которые создают unittest-совместимый testsuite из модуля или файла, соответственно.

поэтому я использую оба и обычно использую doctest для простых тестов с функциями, которые требуют небольшой или никакой настройки (простые типы для Аргументов). Я на самом деле думаю, что несколько тестов doctest помогите документ функцию, а не отвлекать от него.

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

Я использую unittest исключительно; я думаю, что doctest загромождает основной модуль слишком много. Вероятно, это связано с написанием тщательных тестов.

Я не использую doctest в качестве замены unittest. Хотя они немного перекрываются, два модуля не имеют одной и той же функции:

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

  • Я использую doctest как гарантия того, что комментарии (а именно docstrings) по-прежнему актуальны для текущей версии кода.

в широко документированные преимущества разработки на основе тестов я получаю от unittest. doctest решает гораздо более тонкую опасность наличия устаревших комментариев, вводящих в заблуждение обслуживание кода.

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

Doctest может несколько раз привести к неправильному результату. Особенно если выходные данные содержат escape-последовательности. Например

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

дает

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

также не проверяет тип вывода. Он просто сравнивает выходные строки. Например, он сделал некоторый тип rational, который печатает так же, как целое число, если это целое число. Тогда предположим, что у вас есть функция, которая возвращает rational. Таким образом, doctest не будет различать, является ли выход рациональным целым числом или целым числом число.

Я предпочитаю системы на основе обнаружения ("нос" и " py.тест", используя первый в настоящее время).

doctest хорошо, когда тест также хорош в качестве документации, в противном случае они имеют тенденцию загромождать код слишком много.

Comments

    Ничего не найдено.