Вкратце: как мне настроить конвейер тестирования GitLab, чтобы тесты также запускались локально в VS Code?
Я очень новичок в конвейерах GitLab, поэтому, пожалуйста, простите меня, если вопрос будет дилетантским. У меня есть репозиторий GitLab, настроенный онлайн, и я использую VS Code для локальной разработки. Я создал новый конвейер, я хочу, чтобы все мои модульные тесты (написанные с помощью PyTest) запускались каждый раз, когда я делаю коммит.
Проблема в том, что, несмотря на то, что я использую один и тот же файл setup.py
для обоих мест (очевидно), я не могу заставить одновременно работать как тестирование VS Code, так и тест конвейера GitLab. Проблема в том, что я делаю импорт для своих тестов, и если я импортирую как
...
from external_workforce import misc_tools
# I want to test functions in this misc_tools module
...
Тогда это работает на GitLab, но не на VS Code, так как VS Code выдает ошибку, когда я делаю тестовое обнаружение, а именно: ModuleNotFoundError: No module named 'external_workforce'
. Однако это работает на GitLab. Но если я импортирую (в свой файл test_tools.py
, см. расположение ниже) вот так:
...
from hr_datapool.external_workforce import misc_tools
...
Это работает в VS Code, но теперь GitLab сводит меня с ума, говоря ModuleNotFoundError: No module named 'hr_datapool'
.
Я думаю, что соответствующая информация может быть следующей, пожалуйста, запросите дополнительную информацию, если требуется дополнительная информация!
Моя файловая структура:
.
|__ requirements.txt
setup.py
hr_datapool
|__ external_workforce
|__ __init__.py
misc_tools.py
tests
|__ test_tools.py
|__ other_module
...
В моем конвейерном редакторе (файл .gitlab-ci.yml
) у меня есть:
image: python:3.9.7
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
paths:
- .cache/pip
- venv/
before_script:
- python --version # For debugging
- pip install virtualenv
- virtualenv venv
- source venv/bin/activate
- pip install -r requirements.txt
test:
script:
- pytest --pyargs hr_datapool #- python setup.py test
run:
script:
- python setup.py bdist_wheel
artifacts:
paths:
- dist/*.whl
И, наконец, мой setup.py
:
import re
from unittest import removeResult
from setuptools import setup, find_packages
with open('requirements.txt') as f:
requirements = f.read().splitlines()
for req in ['wheel', 'bar']:
requirements.append(req)
setup(
name='hr-datapool',
version='0.1',
...
packages=find_packages(),
install_requires=requirements,
)
По сути, вопрос таков: как мне настроить тестовый конвейер GitLab, чтобы тесты также выполнялись локально в VS Code? Благодарю вас!
Обновлено:
Добавление полной трассировки из VS Code:
> conda run -n base --no-capture-output --live-stream python ~/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/get_output_via_markers.py ~/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/testing_tools/run_adapter.py discover pytest -- --rootdir "." -s --cache-clear hr_datapool
cwd: .
[ERROR 2022-2-23 9:2:4.500]: Error discovering pytest tests:
[r [Error]: ============================= test session starts ==============================
platform darwin -- Python 3.9.7, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /Users/myuser/Documents/myfolder
plugins: anyio-2.2.0
collected 0 items / 1 error
==================================== ERRORS ====================================
_____ ERROR collecting hr_datapool/external_workforce/tests/test_tools.py ______
ImportError while importing test module '/Users/myuser/Documents/myfolder/hr_datapool/external_workforce/tests/test_tools.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../opt/anaconda3/lib/python3.9/importlib/__init__.py:127: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
hr_datapool/external_workforce/tests/test_tools.py:2: in <module>
from external_workforce import misc_tools
E ModuleNotFoundError: No module named 'external_workforce'
=========================== short test summary info ============================
ERROR hr_datapool/external_workforce/tests/test_tools.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
===================== no tests collected, 1 error in 0.08s =====================
Traceback (most recent call last):
File "/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/get_output_via_markers.py", line 26, in <module>
runpy.run_path(module, run_name = "__main__")
File "/Users/myuser/opt/anaconda3/lib/python3.9/runpy.py", line 268, in run_path
return _run_module_code(code, init_globals, run_name,
File "/Users/myuser/opt/anaconda3/lib/python3.9/runpy.py", line 97, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "/Users/myuser/opt/anaconda3/lib/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/testing_tools/run_adapter.py", line 22, in <module>
main(tool, cmd, subargs, toolargs)
File "/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/testing_tools/adapter/__main__.py", line 100, in main
parents, result = run(toolargs, **subargs)
File "/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/testing_tools/adapter/pytest/_discovery.py", line 44, in discover
raise Exception("pytest discovery failed (exit code {})".format(ec))
Exception: pytest discovery failed (exit code 2)
ERROR conda.cli.main_run:execute(33): Subprocess for 'conda run ['python', '/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/get_output_via_markers.py', '/Users/A111086670/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/testing_tools/run_adapter.py', 'discover', 'pytest', '--', '--rootdir', '/Users/myuser/Documents/myfolder', '-s', '--cache-clear', 'hr_datapool']' command failed. (See above for error)
at ChildProcess.<anonymous> (/Users/myuser/.vscode/extensions/ms-python.python-2022.2.1924087327/out/client/extension.js:32:39235)
at Object.onceWrapper (events.js:422:26)
at ChildProcess.emit (events.js:315:20)
at maybeClose (internal/child_process.js:1048:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)]
PYTHONPATH
вызвал проблему.
В видеexternal_workforce
путь к родительской папке -> путь hr_datapool
в PYTHONPATH
при использовании GitLab. Покаhr_datapool
путь к родительской папке в PYTHONPATH
при использовании VSCode.
Вы запускаете тест в терминале на VSCode? И вы добавили это в файл settings.json?
"terminal.integrated.env.windows": {
"PYTHONPATH": "${workspaceFolder};"
},
Затем вы можете выполнить pytest
в терминале на VSCode. Но вы не настроили это в GitLab вместо добавления hr-datapool
( - pytest --pyargs hr_datapool
или setup( name='hr-datapool',
), поэтому вы получите сообщение об ошибке.
@lte__ Извините за это, это osx
. Не могли бы вы выполнить pprint(sys.path)
, я думаю, вы получите другой результат PYTHONPATH
.
Если я использую терминал VS Code для запуска Python и печати sys.path
, похоже, что он пытается использовать Python 2.7?? Но я выбрал версию conda с помощью cmd-shift-P и «Выбор интерпретатора». Кроме того, добавление "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder};"},
в настройки json не решило эту проблему.
@lte__ Да, это проблема Code Runer
.
О, это определенно пытается использовать правильный интерпретатор conda, я могу сказать по пути, который он печатает для ошибки. Я добавлю полную трассировку в пост, секундочку.
@lte__ Не могли бы вы попытаться создать .env
в корневом пути VSCode и добавить в него PYTHONPATH=./hr_datapool?
Давайте продолжить обсуждение в чате.
Я не совсем понимаю, что ты говоришь.
external_workforce
родительская папкаhr_datapool
в обоих случаях. Кроме того, я на MacOS, настройка все еще называется...env.windows
? Я пытаюсь запустить тесты из функции тестирования VS Code (нижний левый значок на левой панели), я думаю, что в конечном итоге это использует терминал VS Code. Но в качестве интерпретатора в VS Code я использую установку conda python, а также устанавливаю в среду conda с помощьюsetup.py
.