Pytest ImportError и ModuleNotFoundError при запуске теста из подкаталога

#python #mysql #pytest #importerror #conftest

#python #mysql #pytest #importerror #conftest

Вопрос:

У меня есть приведенная ниже структура проекта

 - root
    - main.py
    - test/
        - __init__.py
        - conftest.py
        - test.py
 

У conftest.py меня есть несколько пользовательских приспособлений mysql.connector . Поэтому я импортирую:

 import mysql.connector

@pytest.fixture(scope='module')  # maintain connection for all tests
def cnx(database, username, password):
    cnx = mysql.connector.connect(database=database, user=username, password=password)
    yield cnx
    cnx.close()
 

когда я запускаю test.py с терминала в корневом каталоге с помощью приведенной ниже команды:

 pytest tests/test.py
 

Я получаю следующую ошибку:

 ImportError while loading conftest '/tests/conftest.py'.
tests/conftest.py:5: in <module>
    import mysql.connector
E   ModuleNotFoundError: No module named 'mysql'
 

Почему это происходит? mysql определенно установлено.

Комментарии:

1. Попробуйте использовать псевдоним для вашего импорта: например, так: import mysql.connector as MODULE_ALIAS . PS: не забудьте заменить mysql.connector.connect на MODULE_ALIAS.connect

2. Если import mysql сбой, это означает, что mysql-connector-python он не установлен. Как должен python -m pytest помочь запуск в этом случае?

3. Если «это работает», потому что вы просто распаковали MySQL connector в корневой каталог проекта, это, безусловно, неправильный способ установки сторонних пакетов.

4. Я предполагаю, что вы не запускаете это из виртуальной среды python? Если нет, установлено ли у вас несколько версий python?

Ответ №1:

Вы пробовали запускать этот python в CLI? затем попробуйте import mysql.connector , работает ли? Другое решение — удалить текущую версию MySQL и вместо этого попробовать этот пакет pip install mysql-connector-python-rf

Ответ №2:

Команда для запуска тестового скрипта pytest не pytest tests/test.py является, но

 python -m pytest tests/test.py
 

как подробно описано в официальных документах.

Комментарии:

1. python -m защищает только версию используемого вами модуля python и считается наилучшей практикой. Это не влияет на саму команду ( pytest tests/test.py )