Куда идут юнит-тесты Python? - PullRequest
       44

Куда идут юнит-тесты Python?

443 голосов
/ 14 сентября 2008

Если вы пишете библиотеку или приложение, куда попадают файлы модульного теста?

Приятно отделить тестовые файлы от основного кода приложения, но неудобно помещать их в подкаталог «tests» внутри корневого каталога приложения, потому что это затрудняет импорт модулей, которые вы будете тестировать ,

Есть ли здесь лучшая практика?

Ответы [ 18 ]

6 голосов
/ 02 марта 2010

Как мне это сделать ...

Структура папок:

project/
    src/
        code.py
    tests/
    setup.py

Setup.py указывает на src / как местоположение, содержащее модули моих проектов, затем я запускаю:

setup.py develop

Который добавляет мой проект в пакеты сайтов, указывая на мою рабочую копию. Для запуска моих тестов я использую:

setup.py tests

Использование любого настроенного мной тестера.

4 голосов
/ 20 декабря 2008

Я предпочитаю выполнять тестовый каталог верхнего уровня. Это означает, что импорт становится немного сложнее. Для этого у меня есть два решения:

  1. Используйте setuptools. Затем вы можете передать test_suite='tests.runalltests.suite' в setup() и выполнить тесты просто: python setup.py test
  2. Установить PYTHONPATH при запуске тестов: PYTHONPATH=. python tests/runalltests.py

Вот как этот материал поддерживается кодом в M2Crypto:

Если вы предпочитаете проводить тесты с тестами носа, вам может потребоваться сделать что-то немного другое.

1 голос
/ 17 сентября 2008

Если тесты просты, просто поместите их в строку документации - большинство каркасов тестирования для Python смогут использовать это:

>>> import module
>>> module.method('test')
'testresult'

Для других более сложных тестов я бы поставил их либо в ../tests/test_module.py, либо в tests/test_module.py.

1 голос
/ 15 сентября 2008

В C # я обычно разделял тесты на отдельную сборку.

В Python - пока что - я обычно пишу тесты документов, где тест находится в строке документации функции, или помещаю их в блок if __name__ == "__main__" внизу модуля.

1 голос
/ 24 сентября 2008

Мы используем

Приложение / SRC / code.py

app / testing / code_test.py

приложение / документы /..

В каждом тестовом файле мы вставляем "../src/" в sys.path. Это не самое лучшее решение, но оно работает. Я думаю, было бы замечательно, если бы кто-то придумал что-то вроде maven в Java, которое дает вам стандартные соглашения, которые просто работают, независимо от того, над каким проектом вы работаете.

0 голосов
/ 14 сентября 2008

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

Итак, у меня есть:

app/
 appfile.py
test/
 appfileTest.py

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

0 голосов
/ 12 декабря 2018

Я помещаю свои тесты в ту же директорию, что и тестируемый код (CUT); для foo.py тесты будут в foo_ut.py или аналогичном. (Я настраиваю тестовый процесс обнаружения, чтобы найти их.)

Это помещает тесты прямо рядом с кодом в список каталогов, делая очевидным наличие тестов, и делает открытие тестов настолько простым, насколько это возможно, когда они находятся в отдельном файле. (Для редакторов командной строки vim foo* и при использовании браузера с графической файловой системой просто щелкните файл CUT, а затем непосредственно прилегающий тестовый файл.)

Как отметили другие , это также облегчает рефакторинг и извлечение кода для использования в другом месте, если это когда-либо понадобится.

Мне очень не нравится идея помещать тесты в совершенно другое дерево каталогов; зачем усложнять разработчикам открытие тестов при открытии файла с помощью CUT? Не то, чтобы подавляющее большинство разработчиков так увлекались написанием или настройкой тестов, что игнорировали бы любой барьер для этого, вместо того, чтобы использовать этот барьер в качестве оправдания. (Наоборот, по моему опыту; даже когда вы делаете это как можно проще, я знаю многих разработчиков, которые не могут быть обеспокоены написанием тестов.)

0 голосов
/ 15 сентября 2008

При написании пакета с именем "foo" я помещу модульные тесты в отдельный пакет "foo_test". Модули и подпакеты будут иметь то же имя, что и модуль пакета SUT. Например. тесты для модуля foo.x.y находятся в foo_test.x.y. Файлы __init__.py каждого пакета тестирования содержат набор AllTests, который включает все наборы тестов пакета. setuptools предоставляет удобный способ указать основной пакет тестирования, поэтому после «python setup.py development» вы можете просто использовать «python setup.py test» или «python setup.py test -s foo_test.x.SomeTestSuite» просто конкретный набор.

...