У меня проблемы с запуском pytest
в моем пакете. У меня есть следующая структура ...
tree -f
.
├── [ 0 Jan 4 22:04] ./__init__.py
├── [ 34K Jan 12 11:37] ./LICENSE
├── [1.4K Jan 6 07:43] ./README.md
├── [1.1K Jan 12 11:42] ./setup.cfg
├── [ 79 Jan 6 08:22] ./setup.py
├── [4.0K Jan 12 11:49] ./tcx2gpx
│ ├── [ 701 Jan 6 23:13] ./tcx2gpx/__init__.py
│ ├── [4.0K Jan 12 12:13] ./tcx2gpx/__pycache__
│ │ ├── [ 683 Jan 12 12:13] ./tcx2gpx/__pycache__/__init__.cpython-36.pyc
│ │ └── [3.0K Jan 6 21:00] ./tcx2gpx/__pycache__/tcx2gpx.cpython-36.pyc
│ └── [3.1K Jan 12 11:49] ./tcx2gpx/tcx2gpx.py
├── [4.0K Jan 4 21:52] ./tests
│ ├── [4.0K Jan 6 06:32] ./tests/resources
│ │ ├── [288K Jan 6 21:07] ./tests/resources/2019-10-20 12:51:21.0.gpx
│ │ └── [816K Jan 4 22:03] ./tests/resources/2019-10-20 12:51:21.0.tcx
│ └── [4.0K Jan 12 12:24] ./tests/tcx2gpx
│ ├── [ 386 Jan 12 12:17] ./tests/tcx2gpx/conftest.py
│ ├── [ 0 Jan 12 11:48] ./tests/tcx2gpx/__init__.py
│ └── [1.3K Jan 12 12:24] ./tests/tcx2gpx/test_tcx2gpx.py
└── [4.0K Jan 6 06:21] ./tmp
├── [288K Jan 6 06:21] ./tmp/2019-10-20 12:51:21.0.gpx
└── [ 415 Jan 5 08:38] ./tmp/test.py
А у моего conftest.py
есть следующие ...
"""
Fixtures for test_tcx2gpx
"""
from pathlib import Path
import pytest
from tcx2gpx.tcx2gpx import TCX2GPX
TCX_DIR = Path(__file__).resolve().parents[1]
TCX_FILE = TCX_DIR / 'resources' / '2019-10-20 12:51:21.0.tcx'
GPX_FILE = TCX_DIR / 'resources' / '2019-10-20 12:51:21.0.gpx'
@pytest.fixture
def tcx_file():
"""
Fixture of TCX file
"""
return TCX2GPX(TCX_FILE)
При запуске pytest
с верхнего уровня я проинформировал ...
____________________________________________________ ERROR collecting test session ____________________________________________________
/home/neil/.virtualenvs/default/lib/python3.6/site-packages/_pytest/config/__init__.py:458: in _importconftest
return self._conftestpath2mod[key]
E KeyError: PosixPath('/mnt/work/python/tcx2gpx/tests/tcx2gpx/conftest.py')
During handling of the above exception, another exception occurred:
/home/neil/.virtualenvs/default/lib/python3.6/site-packages/_pytest/config/__init__.py:464: in _importconftest
mod = conftestpath.pyimport()
/home/neil/.virtualenvs/default/lib/python3.6/site-packages/py/_path/local.py:701: in pyimport
__import__(modname)
/home/neil/.virtualenvs/default/lib/python3.6/site-packages/_pytest/assertion/rewrite.py:143: in exec_module
exec(co, module.__dict__)
tests/tcx2gpx/conftest.py:7: in <module>
from tcx2gpx.tcx2gpx import TCX2GPX
E ModuleNotFoundError: No module named 'tcx2gpx.tcx2gpx'
Читая вокруг, я нашел несколько тем по этому поводу (например, здесь ) и, поскольку я работаю над CI на GitLab, я решил попробовать изменить PYTHONPATH
(как я могу поместить их как часть script
, который выполняется при выполнении GitLab CI) ...
export PYTHONPATH="$PYTHONPATH:."
python -c "import sys;print(sys.path)"
['', '/mnt/work/python/tcx2gpx', '/home/neil/.virtualenvs/default/lib64/python
36.zip', '/home/neil/.virtualenvs/default/lib64/python3.6', '/home/neil/.virtualenvs/default/lib64/python3.6/lib
-dynload', '/usr/lib64/python3.6', '/usr/lib/python3.6', '/home/neil/.virtualenvs/default/lib/python3.6/site-pac
kages', '/mnt/work/python/python-tcxparser']
pytest
Но я получаю ту же ошибку, даже если /mnt/work/python/tcx2gpx
, где вышеупомянутый каталог структура находится в PYTHONPATH
.
Я также пытался использовать python -m pytest
, потому что, как указано здесь , это должно автоматически включать текущий каталог в syspath
. Я получаю тот же результат: ModuleNotFoundError
.
Я также нашел эту статью , которая описывает конфликты между установленной системой pytest
и системой в виртуальной среде, но, во-первых, я не могу удалите его на системном уровне, потому что это обязательная зависимость от других пакетов, которые я установил в системе, и во-вторых, я получаю ту же ошибку при попытке запустить тесты в GitLab CI, где я не думаю, что есть какая-либо другая версия pytest
установлен (я должен явно установить его как часть этапа тестирования).
Действительно озадачен тем, почему это не работает, любые предложения или указатели будут очень признательны.