Установка и тестирование проекта Python в Travis - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть такая файловая структура:

./
    project_name/
        __init__.py
    setup.py
    tests/
    .travis.yml

Так что я запускаю py.test в моем .travis.yml.В зависимости от того, как я устанавливаю пакет, он либо работает, либо я сталкиваюсь с ошибкой.

Если я устанавливаю пакет с pip install -e ., все нормально, но недостатком является то, что он не является реалистичным сценарием установки.

Если я установлю пакет с pip install ., он будет установлен так же, как и на другом компьютере в режиме не-dev.Однако возникает проблема: когда я запускаю pytest, мои тесты используют import project_name.Затем python импортирует локально из каталога вместо использования установленного пакета, что приводит к ImportMismatchError.

Как лучше всего с этим справиться?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

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

project_root
├── src
│   ├── spam
│   │   ├── __init__.py
│   │   └── eggs.py
│   └── ...
├── tests
│   ├── test_spam.py
│   └── ...
└── setup.py

Настройка сценария установки для учета src dir:

# setup.py

from setuptools import setup, find_packages

setup(
    name='spam',
    ...
    packages=find_packages('src'),
    package_dir={'': 'src'},
    ...
)

С этим макетом, хотя текущий каталог (project_root) все еще добавляется вsys.path, все пакеты скрыты от импорта.Таким образом, вы вынуждены установить свой пакет, чтобы иметь возможность вызывать тесты и всегда тестировать установленный код.Обычно вы устанавливаете пакет в режиме разработки с помощью pip install --editable . на локальном компьютере во время написания кода и устанавливаете пакет с помощью pip install . на CI-сервере, и тесты будут выполняться поверх фактической установки пакета.Еще одним преимуществом является то, что эта компоновка не позволяет импортировать исходный код вашего пакета в сценарии установки, вы не сталкиваетесь с проблемой «куриного яйца» при установке (для установки кода ваш код должен быть уже установлен).

Если у вас есть свободные модули, я предпочитаю использовать команду pathlib:

py_modules=[p.name for p in pathlib.Path('src').glob('*.py')]

Если вам все еще нужна совместимость с Python 2, решение может выглядеть следующим образом:

py_modules=[os.path.splitext(os.path.basename(p))[0] for p in glob.glob("src/*.py")]
0 голосов
/ 01 декабря 2018

Одним из решений может быть создание файла с именем tox.ini на верхнем уровне для использования с tox.Это инструмент, который заботится о создании среды - он похож на make, но более специфичен для Python.Если вы сделаете tox.ini:

[tox]
envlist = py

[testenv]
commands = pytest tests
deps =
    pytest

, затем установите tox с pip3 install tox, а затем просто наберите команду tox из командной строки, она позаботится об установке пакета и запускетесты в изолированной виртуальной среде.

Затем вы можете сделать это внутри вашего travis.yml:

language: python
python:
  - 3.6
install:
  - pip install tox
script:
  - tox

И Трэвис будет использовать tox для запуска тестов в более воспроизводимом виде.путь.

...