Предпочтительная структура модульного тестирования Python [закрыто]
до сих пор я использовал встроенный модуль unittest (pyUnit) для модульного тестирования кода Python. Однако для простых случаев это кажется излишним. Будучи производным от xUnit, он кажется немного тяжелым для динамической природы Python, где я ожидал бы писать меньше, чтобы достичь тех же эффектов. С другой стороны, он встроен, он заставляет вас писать свои тесты организованно, и он проверяется временем.
основные альтернативы, которые я видел онлайн являются:
какой из фреймворков вы предпочитаете и почему?
обновление 10.12.2011: с недавним добавлением тестового автоматического обнаружения и многих новых функций в unittest
(в Python 2.7 и 3.2), IMHO имеет меньше смысла использовать внешнюю библиотеку.
относительно doctest: Я не считаю это юнит-тестирование рамки per-se. Я определенно не стал бы использовать его для написания большого набора тестов для значительного приложения. doctest больше подходит для того, чтобы убедиться, что примеры, которые вы предоставляете в документации, работают. У него есть свое место для этой потребности, но это не конкурент для unittest, py.тест и другие фреймворки.
10 ответов:
nose
на самом деле это не модульное тестирование. Это тестовый бегун и отличный в этом. Он может запускать тесты, созданные с помощьюunittest
,py.test
илиdoctest
.мое предпочтение для платформы модульного тестирования является стандартным
unittest
модуль (также известный какpyUnit
). Он похож на другие фреймворки xUnit и легко относится к людям без фона python. Существует также довольно хорошая поддержка для него в Eclipse / PyDevOn
py.test
, Я нахожу несколько уровней настройки / демонтажи очень запутанные. Я также считаю, что это приводит к очень неструктурированным и трудным для чтения модульным тестам.
doctest
- это хорошо для простых вещей, но я считаю, что это очень ограничивает и не очень масштаба комплексных и интерактивных код.
интересно, что никто еще не ответил, чтобы защитить py.тест. На список рассылки testing-in-python он довольно популярен, например, этот недавний поток " почему вы используете py.тест?". Наиболее распространенные ответы включали:
- легкая поддержка распределенного тестирования
- хорошая архитектура плагина
- более простые утверждения (просто
assert x == 42
, нетassertEqual()
)- funcargs (начиная с 2.3 или 2.4 названные светильники, несколько отличающиеся от того, что другие тестовые фреймворки называют светильниками)
мы изначально начали нашу структуру автоматизации с помощью unittest и nosetest. Мы разделили все наши тестовые классы на подклассы от unittest, так как unittest предлагает отличный синтаксис для утверждений. Для фактического выполнения тестов, мы использовали нос, который был довольно хорошим с точки зрения отчетности и указания, какие тесты необходимо выполнить. Логика генерации тестов также была довольно хороша - используя метод выхода, он был прост в использовании. Единственная проблема с поколением теста носа что тестовый класс не может наследовать от unittest - поколения тест не пройден то. Здесь можно использовать только утверждения носа.
мы столкнулись с серьезными проблемами с носом когда мы хотели распараллелить тестовые запуски. Крайне неудачная отчетность получилась, когда тесты проводились параллельно. Кроме того, если вы создаете определенные ресурсы в методах установки, то также происходит сбой распараллеливания со странными ошибками. Казалось очень сложным использовать нос для распараллеливания тестовых запусков - мы перепробовал почти все. Наконец один из членов нашей команды нажмите на пы.тест. В течение очень короткого времени он сумел внести необходимые изменения в набор из 30 тестов, чтобы запустить их параллельно. Он начал пробег,и к его удивлению пробег прошел в рекордные 15 минут по сравнению с предыдущими 75 минутами, которые он использовал. Он был в состоянии выполнить все 30 тестов параллельно успешно с наименьшим количеством усилий и хлопот. Синтаксис был также прост, и отчетность была превосходной-далеко превосходил отчет о структуре носа.
поэтому я бы сказал, что выигрышная комбинация-py.тест с unittest.
Я просто использую стандартный
unittest
. Не уверен, как бы вы писали тесты так же эффективно с другим стилем-возможно, каждый тест в функции, но тогда как бы вы справились с настройкой / демонтажем?
nose2 вытеснил нос и поддерживает параметризованные тесты это означает, что вы можете запускать одни и те же утверждения с разными параметрами. Это позволяет охватить больше сценариев с гораздо меньшим количеством кода.
на
unittest.TestCase
- Это класс. Не стесняйтесь подкласс его с вашими собственными дополнительными функциями, которые позволяют "писать меньше, чтобы достичь тех же эффектов".
Я согласен, что одна из приятных особенностей носа Плагины. Например, я начал изучать Python, когда запустился движок приложений Google, и почти сразу появился плагин для носа Для поддержки GAE. Таким образом, нос с его плагинами помог мне начать тестовую разработку с новой платформой, такой как GAE, с самого начала. Плагин покрытия был там, когда я был готов к нему, а также.
одна из самых приятных особенностей nose-это система плагинов: например, плагин покрытия показывает, сколько вашего кода покрыто unittests. После написания большого количества unittests часто шокирует, насколько ваш код не покрыт ....
всегда doctest Если вы хотите, чтобы ваши модульные тесты были близки к коду.
HTH
Я думаю, что это вопрос выбора действительно. Я использовал все основные фреймворки тестирования, это сводится к тому, какой из них, по вашему мнению, выполняет работу с меньшим количеством кодирования. Тем не менее, я тоже предпочитаю doctest.
но с тех пор я открыл pytest и никогда не оглядывался назад. Я все еще использую doctest иногда, но предпочитаю использовать pytest на новых проектах.