Тестирование с помощью pytest: импорт, который работает в GitLab, не работает в VS Code (и наоборот)

Вкратце: как мне настроить конвейер тестирования 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)]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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',), поэтому вы получите сообщение об ошибке.

Я не совсем понимаю, что ты говоришь. external_workforce родительская папка hr_datapool в обоих случаях. Кроме того, я на MacOS, настройка все еще называется ...env.windows? Я пытаюсь запустить тесты из функции тестирования VS Code (нижний левый значок на левой панели), я думаю, что в конечном итоге это использует терминал VS Code. Но в качестве интерпретатора в VS Code я использую установку conda python, а также устанавливаю в среду conda с помощью setup.py.

lte__ 23.03.2022 08:49

@lte__ Извините за это, это osx. Не могли бы вы выполнить pprint(sys.path), я думаю, вы получите другой результат PYTHONPATH.

Steven-MSFT 23.03.2022 08:53

Если я использую терминал VS Code для запуска Python и печати sys.path, похоже, что он пытается использовать Python 2.7?? Но я выбрал версию conda с помощью cmd-shift-P и «Выбор интерпретатора». Кроме того, добавление "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder};"}, в настройки json не решило эту проблему.

lte__ 23.03.2022 08:59

@lte__ Да, это проблема Code Runer.

Steven-MSFT 23.03.2022 09:01

О, это определенно пытается использовать правильный интерпретатор conda, я могу сказать по пути, который он печатает для ошибки. Я добавлю полную трассировку в пост, секундочку.

lte__ 23.03.2022 09:01

@lte__ Не могли бы вы попытаться создать .env в корневом пути VSCode и добавить в него PYTHONPATH=./hr_datapool?

Steven-MSFT 23.03.2022 09:04

Давайте продолжить обсуждение в чате.

lte__ 23.03.2022 09:05

Другие вопросы по теме