Относительный импорт с unittest в Python
Я пытаюсь использовать Python unittest и относительный импорт, и я не могу понять это. Я знаю, что есть много связанных вопросов, но никто из них не помог до сих пор. Извините, если это повторяется, но я бы очень признателен за любую помощь. Я пытался использовать синтаксис из PEP 328 http://www.python.org/dev/peps/pep-0328/, но у меня должно быть что-то не так.
Моя структура каталогов:
project/
__init__.py
main_program.py
lib/
__init__.py
lib_a
lib_b
tests/
__init__.py
test_a
test_b
Я запускаю свои тесты, используя:
python -m unittest test_module1 test_module2
test_a необходимо импортировать как lib/lib_a, так и main_program. Это код из test_a, который я пытаюсь использовать для импорта:
from ..lib import lib_a as lib
from ...project import main_program
оба повышают эту ошибку:
ValueError: Attempted relative import in non-package
Все мои init.py файлы в настоящее время пустые.
Приветствуется любой конкретный совет!
Edit:
Это может быть ответ: Пакеты Python?
Я все еще проверяю, будет ли это работать.
Изменить II:
Чтобы уточнить, на этом этапе я попытался запустить тестовый файл тремя способами:
project/tests $ python -m unittest test_a
project/tests $ python -m test_a
project/tests $ ./test_a
Все три ошибки с той же ошибкой, что и выше. Когда я использую те же три синтаксиса, но в каталоге проекта, я получаю эту ошибку:
ValueError: Attempted relative import beyond toplevel package
Еще раз спасибо.
Ответы
Ответ 1
По моему опыту это проще всего, если ваш корневой каталог проекта не является пакетом, например:
project/
test.py
run.py
package/
__init__.py
main_program.py
lib/
__init__.py
lib_a
lib_b
tests/
__init__.py
test_a
test_b
Однако, начиная с python 3.2, модуль unittest предоставляет параметр -t
, который позволяет вам установить каталог верхнего уровня, чтобы вы могли (от package/
):
python -m unittest discover -t ..
Подробнее о unittest docs.
Ответ 2
Я работаю с той же проблемой, и ответ kai решил это. Я просто хочу дополнить его ответ содержанием test.py
(как @gsanta спросил). Я тестировал его только на Python 2.7:
from packages.tests import test_a, test_b
import unittest
# for test_a
unittest.main(test_a)
# for test_b
unittest.main(test_a)
тогда вы можете просто
../project $ python test.py