Кажется, что очень распространенная структура каталогов даже для простого модуля Python - это разделение модульных тестов на их собственный test
каталог:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
например, посмотрите это руководство по проекту Python .
У меня вопрос просто : как обычно проводить тесты? Я подозреваю, что это очевидно для всех, кроме меня, но вы не можете просто запустить python test_antigravity.py
из тестового каталога, так как import antigravity
он потерпит неудачу, так как модуль не находится на пути.
Я знаю, что могу изменить PYTHONPATH и другие приемы, связанные с поиском, но я не могу поверить, что это самый простой способ - хорошо, если вы разработчик, но нереалистично ожидать, что ваши пользователи будут использовать, если они просто хотят проверить тесты. прохождение.
Другая альтернатива - просто скопировать тестовый файл в другой каталог, но он выглядит немного глупым и упускает смысл начинать их с отдельного каталога.
Итак, если бы вы только что загрузили исходный код в мой новый проект, как бы вы запустили модульные тесты? Я бы предпочел ответ, который позволил бы мне сказать моим пользователям: «Чтобы запустить модульные тесты, сделайте X».
источник
unittest
интерфейс командной строки, как описано в моем ответе ниже, чтобы вам не нужно было добавлять каталог в путь.Ответы:
Лучшее решение, на мой взгляд, это использовать
unittest
интерфейс командной строки, который добавит каталог,sys.path
так что вам не нужно (сделано вTestLoader
классе).Например, для такой структуры каталогов:
Вы можете просто запустить:
Для структуры каталогов, подобных вашей:
И в тестовых модулях внутри
test
пакета вы можете импортироватьantigravity
пакет и его модули как обычно:Запуск одного тестового модуля:
Чтобы запустить один тестовый модуль, в этом случае
test_antigravity.py
:Просто ссылайтесь на тестовый модуль так же, как вы импортируете его.
Выполнение одного теста или метода тестирования:
Также вы можете запустить один
TestCase
или один метод тестирования:Запуск всех тестов:
Вы также можете использовать тестовое обнаружение, которое обнаружит и запустит все тесты для вас, это должны быть модули или пакеты с именами
test*.py
(можно изменить с помощью-p, --pattern
флага):Это запустит все
test*.py
модули внутриtest
пакета.источник
python -m unittest discover
найдет и запустит тесты вtest
каталоге, если они названыtest*.py
. Если вы назвали подкаталогtests
, используйтеpython -m unittest discover -s tests
, и если вы назвали тестовые файлыantigravity_test.py
, используйтеpython -m unittest discover -s tests -p '*test.py'
Имена файлов, можно использовать подчеркивания, но не тире.ImportError: No module named 'test.test_antigravity'
из-за конфликта с тестовым подмодулем библиотеки unittest. Возможно, эксперт может подтвердить и изменить имя подкаталога ответа, например, «тесты» (множественное число).test_antigravity.py
все еще выдает ошибку импорта для обоихimport antigravity
иfrom antigravity import antigravity
, как хорошо. У меня есть оба__init_.py
файла, и я звонюpython3 -m unittest discover
изnew project
каталога. Что еще может быть не так?test/__init__.py
имеет решающее значение здесь, даже если он пустtest
является специальным ... но для справки , это не так. : Ppython -m unittest discover
работает с тестовыми файламиtests/
так же хорошо, как иtest/
.Самое простое решение для ваших пользователей - предоставить исполняемый скрипт (
runtests.py
или какой-то другой), который загружает необходимую тестовую среду, включая, при необходимости,sys.path
временное добавление корневого каталога проекта . Это не требует, чтобы пользователи устанавливали переменные окружения, что-то вроде этого прекрасно работает в скрипте начальной загрузки:Тогда ваши инструкции для пользователей могут быть такими же простыми, как "
python runtests.py
".Конечно, если путь, который вам действительно нужен
os.path.dirname(__file__)
, то вам вообще не нужно его добавлятьsys.path
; Python всегда помещает каталог запущенного в данный момент скрипта в началоsys.path
, поэтому в зависимости от вашей структуры каталогов, просто найтиruntests.py
нужное место может быть все, что нужно.Кроме того, модуль unittest в Python 2.7+ (который перенесен как unittest2 для Python 2.6 и более ранних версий ) теперь имеет встроенное обнаружение тестов , поэтому в носе больше нет необходимости, если вы хотите автоматическое обнаружение тестов: ваши пользовательские инструкции могут быть такими же простыми, как
python -m unittest discover
,источник
python -m pdb tests\test_antigravity.py
. Внутри pdb я выполнил,sys.path.insert(0, "antigravity")
что позволило оператору импорта разрешить, как будто я запускаю модуль.Обычно я создаю скрипт «run tests» в каталоге проекта (тот, который является общим как для исходного каталога, так и для
test
), который загружает мой «All Tests» комплект. Обычно это стандартный код, поэтому я могу использовать его от проекта к проекту.run_tests.py:
test / all_tests.py (из Как запустить все модульные тесты Python в каталоге? )
С этой настройкой вы действительно можете просто
include antigravity
в своих тестовых модулях. Недостатком является то, что вам потребуется больше кода поддержки для выполнения определенного теста ... Я просто запускаю их каждый раз.источник
run tests
сценарий в директории проекта и нашел более чистый способ много , чтобы сделать это. Настоятельно рекомендуется.Из статьи, на которую вы ссылаетесь:
Возможно, вы должны смотреть на нос, как он предлагает?
источник
У меня была такая же проблема, с отдельной папкой юнит-тестов. Из упомянутых предложений я добавляю абсолютный исходный путь к
sys.path
.Преимущество следующего решения заключается в том, что файл можно запустить,
test/test_yourmodule.py
не переходя сначала в каталог test:источник
если вы запустите "python setup.py development", то пакет будет в пути. Но вы можете не захотеть этого делать, потому что вы можете заразить вашу системную установку python, поэтому существуют такие инструменты, как virtualenv и buildout .
источник
Решение / Пример для модуля Python unittest
Учитывая следующую структуру проекта:
Вы можете запустить свой проект из корневого каталога с помощью
python project_name
которого вызываютсяProjectName/project_name/__main__.py
.Чтобы запустить ваши тесты с
python test
эффективным запускомProjectName/test/__main__.py
, вам нужно сделать следующее:1) Преврати свой
test/models
каталог в пакет, добавив__init__.py
файл. Это делает тестовые случаи в подкаталоге доступными из родительскогоtest
каталога.2) Измените системный путь,
test/__main__.py
чтобы включитьproject_name
каталог.Теперь вы можете успешно импортировать вещи из
project_name
ваших тестов.источник
Используйте,
setup.py develop
чтобы ваш рабочий каталог был частью установленной среды Python, затем запустите тесты.источник
invalid command 'develop'
и эта опция не упоминается, если я попрошуsetup.py --help-commands
. Нужно ли что-то вsetup.py
себе, чтобы это работало?import setuptools
из моегоsetup.py
файла. Но я думаю, это показывает, что это не будет работать все время для модулей других людей.pip install -e .
это также добавляет пакет в среду Python без копирования исходного кода, что позволяет вам продолжать редактировать его там, где он находится.pip install -e .
это то же самоеpython setup.py develop
, что просто обезьянаsetup.py
к использованию setuptools, даже если это не так, поэтому он работает в любом случае.Если вы используете VS Code и ваши тесты расположены на том же уровне, что и ваш проект, то запуск и отладка вашего кода не будут работать из коробки. Что вы можете сделать, это изменить файл launch.json:
Ключевая строка здесь envFile
В корне вашего проекта добавьте .env файл
Внутри вашего .env файла добавьте путь к корню вашего проекта. Это временно добавит
путь к вашему проекту, и вы сможете использовать отладочные юнит-тесты из VS Code
источник
Я заметил, что если вы запускаете интерфейс командной строки unittest из своего каталога "src", то импорт работает корректно без изменений.
Если вы хотите поместить это в командный файл в каталоге вашего проекта, вы можете сделать это:
источник
У меня была такая же проблема в течение длительного времени. Недавно я выбрал следующую структуру каталогов:
и в
__init__.py
скрипте тестовой папки я пишу следующее:Очень важным для совместного использования проекта является Makefile, потому что он обеспечивает правильную работу скриптов. Вот команда, которую я положил в Makefile:
Makefile важен не только из-за команды, которую он запускает, но и из-за того, откуда он его запускает . Если бы вы тестировали компакт-диск и делали это
python -m unittest discover .
, он бы не работал, потому что инициализация скрипт в unit_tests вызывает os.getcwd (), который затем указывал бы на неверный абсолютный путь (который будет добавлен в sys.path и вы пропустите ваша исходная папка). Сценарии запускались бы, так как Discover находит все тесты, но они не работают должным образом. Таким образом, Makefile существует, чтобы избежать необходимости помнить эту проблему.Мне действительно нравится этот подход, потому что мне не нужно трогать мою папку src, мои модульные тесты или переменные окружения, и все идет гладко.
Дайте мне знать, если вам это нравится.
Надеюсь, это поможет,
источник
Ниже приведена структура моего проекта:
Я нашел, что лучше импортировать в метод setUp ():
источник
Я использую Python 3.6.2
Чтобы установить pytest :
sudo pip install pytest
Я не установил никакой переменной пути, и мой импорт не завершился с той же «тестовой» структурой проекта.
Я закомментировал этот материал:
if __name__ == '__main__'
как это:test_antigravity.py
источник
Можно использовать упаковщик, который запускает выбранные или все тесты.
Например:
или для запуска всех тестов рекурсивно используйте globbing (
tests/**/*.py
) (включитьshopt -s globstar
).Оболочка может в основном использовать
argparse
для анализа аргументов, таких как:Затем загрузите все тесты:
затем добавьте их в свой набор тестов (используя
inspect
):и запустить их:
Проверьте этот пример для более подробной информации.
Смотрите также: Как запустить все модульные тесты Python в каталоге?
источник
Python 3+
Добавление в @Pierre
Используя
unittest
структуру каталогов следующим образом:Чтобы запустить тестовый модуль
test_antigravity.py
:Или один
TestCase
Обязательно не забывайте,
__init__.py
даже если пусто, иначе не сработает.источник
Вы не можете импортировать из родительского каталога без некоторого вуду. Вот еще один способ, который работает по крайней мере с Python 3.6.
Сначала создайте файл test / context.py со следующим содержимым:
Затем выполните следующий импорт в файл test / test_antigravity.py:
Обратите внимание на то, что причина этого предложения о том, что
С этим обманом они оба работают.
Теперь вы можете запустить все тестовые файлы в тестовом каталоге с помощью:
или запустите отдельный тестовый файл с:
Хорошо, это не намного красивее, чем содержание context.py в test_antigravity.py, но, возможно, немного. Предложения приветствуются.
источник
Если у вас есть несколько каталогов в вашем тестовом каталоге, то вы должны добавить в каждый каталог
__init__.py
файл.Затем, чтобы запустить каждый тест сразу, запустите:
Источник:
python -m unittest -h
источник
Этот BASH-скрипт будет выполнять тестовый каталог python unittest из любой точки файловой системы, независимо от того, в каком рабочем каталоге вы находитесь.
Это полезно, когда вы остаетесь в рабочем
./src
или./example
рабочем каталоге, и вам нужен быстрый юнит-тест:Нет необходимости загружать
test/__init__.py
файл / нагрузку на ваш пакет / память во время производства.источник
Таким образом, вы сможете запускать тестовые сценарии из любого места, не тратя время на системные переменные из командной строки.
Это добавляет основную папку проекта к пути Python, причем местоположение находится относительно самого скрипта, а не относительно текущего рабочего каталога.
Добавьте это в начало всех ваших тестовых сценариев. Это добавит основную папку проекта в системный путь, поэтому любой импорт модулей, который работает оттуда, теперь будет работать. И не важно, откуда вы запускаете тесты.
Очевидно, вы можете изменить файл project_path_hack, чтобы он соответствовал местоположению вашей основной папки проекта.
источник
Если вы ищете решение только для командной строки:
На основе следующей структуры каталогов (обобщенной с выделенным каталогом источника):
Windows : (в
new_project
)Посмотрите этот вопрос, если вы хотите использовать его в цикле for.
Linux : (в
new_project
)При таком подходе также возможно добавить дополнительные каталоги в PYTHONPATH, если это необходимо.
источник
Вы должны действительно использовать инструмент pip.
Используйте
pip install -e .
для установки вашего пакета в режиме разработки. Это очень хорошая практика, рекомендованная pytest (см. Документацию по хорошей практике , где вы также можете найти два макета проекта для подражания).источник
pytest
лучше запускать тесты, потому что вывод на консоль цветной, с информацией о трассировке стека и подробной информацией об ошибках подтверждения.