Подтвердить что ты не робот

Относительный импорт с 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

Еще раз спасибо.

4b9b3361

Ответ 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