Как импортировать модуль из родительского каталога?(цели юнит-теста) - PullRequest
11 голосов
/ 03 августа 2011

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

Чего я хотел бы достичь: у меня есть подпакет основного пакета, который содержит все модули, которые я хочу протестировать внутри него. Я хочу поместить подпакет внутри, который называется «тесты», или что-то, что затем содержит все мои тесты, которые я хотел бы объединить в набор тестов вне пакета, чтобы в конечном итоге я мог выполнить весь тест для весь проект за один раз.

Структура примерно такая:

/projectPackage
/projectPackage/package
/projectPackage/package/\__init__.py (empty)
/projectPackage/package/someModule.py
/projectPackage/package/... (more modules)
/projectPackage/package/testing.py (runs all the tests in /tests/)
/projectPackage/package/tests
/projectPackage/package/tests/\__init__.py (empty)
/projectPackage/package/tests/someModuleTests.py

У меня проблема:

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

Attempted relative import beyond toplevel package

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

Ответы [ 3 ]

16 голосов
/ 03 августа 2011

Запустите модульный тест из родительского каталога, чтобы каталог находился в вашей PYTHONPATH (текущий рабочий каталог всегда есть).Это можно сделать, выполнив тестовый файл из родительского каталога или используя что-то наподобие проверки на нос, который рекурсивно ищет все тесты в вашем пакете.

Не используйте относительный импорт, они вызывают такие вещиНе взламывайте PYTHONPATH и / или sys.path, чтобы попытаться исправить это.

1 голос
/ 16 декабря 2015

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

python -m unittest package.tests.someModuleTests
1 голос
/ 03 августа 2011

Если вы можете выполнить свой код, тогда ваш PYTHONPATH уже должен быть установлен правильно.Что вам нужно сделать, это указать модуль, который вы хотите импортировать, например,

import projectPackage.package.someModule
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...