Утилита Python устраняет необходимость в модульных тестах?

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

Спасибо. -Daniel

EDIT: может ли кто-нибудь предоставить ссылку, показывающую, что доктрина не должна заменять модульное тестирование?

Ответ 1

I (ab) использовал doctest вместо unittest, когда я начал проект gmpy много лет назад - - вы можете просматривать его источники и видеть, что все функциональные возможности тщательно протестированы с помощью доктрин (функциональность, предоставляемая C-кодированным расширением Python, и в последний раз я измерил ее для измерения охвата. Я был более 95% охвата). Почему я это сделал? Потому что doctest был совершенно новым, как было gmpy, и мне было любопытно посмотреть, как далеко я могу его нажать.

Ответ: очень далеко, но определенно не стоит (новинка изнашивается, но вы не хотите переписывать все свои тесты, поэтому тесты на gmpy все еще все-доктрины). Крайняя хрупкость доктрин, где даже самая маленькая опечатка в сообщении нарушает тест, является реальной проблемой, когда они подвергаются насилию таким образом. Это похоже на традиционные интеграционные тесты, основанные на сравнении результатов с "золотой" (хорошо известной) ожидаемой продукцией: легко писать в первый раз, но вы будете раскаиваться на досуге после нескольких лет фиксации безвозмездных тестовых обрывов;).

Если вы находите unittest стиль обременительным, есть другие превосходные альтернативы, которые по-прежнему означают для использования в модульных тестах, например py.test и nose - doctest действительно предназначено для другой цели (поддержка документов, а не общих единиц тесты), и, хотя, конечно же, стоит добавить какие-либо доктрины, которые вы написали для целей документов, к своей тестовой батарее, это не стоит головных болей для тестирования, связанных с заменой модульных тестов.

Ответ 2

На самом деле нет аргументов для или против тестов doc. Это просто тесты. Фактически, начиная с python 2.4 существует способ создания unit test костюмов из ваших доктрин: http://docs.python.org/library/doctest.html#unittest-api

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

Однако документы python предлагают использовать доктрины для таких вещей, как:

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

Их аргумент состоит в том, что если вы напишете свои тесты в документации, вам придется писать как лучшие документы, так и тесты. В отличие от того, когда вы пишете отдельные тесты отдельно - вы редко добавляете достаточную документацию, и они имеют тенденцию застаиваться и устаревать.

См: http://docs.python.org/library/doctest.html#soapbox

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

Все зависит от вашего проекта. Нет никакого "правильного" способа тестирования.

Также я рекомендую взглянуть на Code Complete 2, так как вы можете обнаружить, что модульное тестирование - не лучший способ убедиться ваше программное обеспечение является неисправным.

Ответ 3

В стандартной библиотеке Python есть конкретный пример, который убеждает меня, что одних только доктрин недостаточно, а именно модуля decimal. Он имеет более 60000 отдельных тестовых таблиц (в Lib/test/decimaltestdata); если бы все они были переписаны как доктрины, десятичный модуль стал бы очень громоздким. Возможно, количество тестов может быть уменьшено, но при этом обеспечивается хороший охват, но многие из числовых алгоритмов достаточно сложны, что вам нужно огромное количество отдельных тестов для охвата всех возможных комбинаций ветвей.

Ответ 4

доктрины отлично подходят для некоторых целей

  • рабочая и актуальная документация
  • примеры тестов, встроенных в docstrings
  • шипы или фазы проектирования, когда классы API не очень понятны

модульные тесты лучше в разных случаях:

  • когда вам нужна четкая и сложная настройка/отключение
  • при попытке улучшить охват всех случаев, inclosinf corner cases
  • для независимого тестирования тестов
Другими словами, по крайней мере для моего собственного использования, доктрины великолепны, когда вы сосредотачиваетесь на объяснении того, что вы делаете (документы, но также и этапы проектирования), но больше бремени, когда вы намерены использовать тесты в качестве ремня безопасности для рефакторинг или покрытие кода.

Ответ 5

Можно реализовать полный пакет unit test с доктринами. Тем не менее, доктрины немного ограничены, и обычно лучше зарезервировать это для простых примеров документации и использовать более надежную структуру unit test (например, unittest) для реальных подробных модульных тестов.

Еще одно преимущество unittest заключается в том, что среда тестирования будет знакома кому-то, исходя из другой среды разработки, которая использует JUnit, NUnit или аналогичную. Модуль doctest немного отличается.

Ответ 6

Я думаю, что это неправильный способ думать о доктринах. Doctests - это документация. Они дополняют регулярные модульные тесты. Подумайте о доктринах в качестве примеров документации, которые могут быть протестированы. Доктрины должны быть там, чтобы проиллюстрировать эту функцию для пользователей. Модульные тесты должны проверять весь код, даже на угловые случаи. Если вы добавите доктрины для угловых дел или десятки доктрин, это просто заставит вашу документацию прочитать.