Как запустить тесты без установки пакета?

У меня есть пакет Python и некоторые тесты. Файлы выкладываются после http://pytest.org/latest/goodpractices.html#choosing-a-test-layout-import-rules

Помещение тестов в дополнительный каталог за пределами вашего фактического приложения код, полезный, если у вас много функциональных тестов или по другим причинам хотите, чтобы тесты отличались от фактического кода приложения (часто это хорошо идея):

setup.py   # your distutils/setuptools Python package metadata
mypkg/
    __init__.py
    appmodule.py
tests/
        test_app.py

Моя проблема в том, что когда я запускаю тесты py.test, я получаю сообщение об ошибке

ImportError: нет модуля с именем 'mypkg'

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

Что я могу сделать?

Ответ 1

Обычный подход для разработки - использовать virtualenv и использовать pip install -e . в virtualenv (это почти эквивалентно python setup.py develop). Теперь ваш исходный каталог используется как установленный пакет на sys.path.

Есть, конечно, множество других способов получить ваш пакет на sys.path для тестирования, см. Обеспечение того, что py.test включает каталог приложений в sys.path на вопрос с более полным ответом на эту ту же самую проблему.

Ответ 2

Я знаю, что этот вопрос уже закрыт, но я часто использую простой способ вызова pytest через python -m из корня (родителя пакета).

$ python -m pytest tests

Это работает, потому что опция -m добавляет текущий каталог к пути python, и, следовательно, mypkg определяется как локальный пакет (а не как установленный).

См.: https://docs.pytest.org/en/latest/usage.html#calling-pytest-through-python-m-pytest.

Ответ 3

Импортируйте пакет, используя from .. import mypkg. Для этого вам нужно будет добавить (пустые) __init__.py файлы в каталог tests и содержащий каталог. py.test должен позаботиться об остальном.