我遇到了一个问题,由于
pytest
,ModuleNotFoundError
无法在我的本地开发环境中运行测试,特别指出“没有名为‘app’的模块”。但是,我的后端应用程序在 Docker 容器中运行得非常好,并且 app
模块在该环境中可以被识别,没有任何问题。
project-root/
├── app/
│ ├── main.py
│ ├── config.py
│ ├── setup/
│ │ ├── __init__.py
│ ├── data/
│ │ ├── technology/
│ │ │ ├── enums/
│ │ │ ├── __init__.py
│ │ │ ├── technology_type_enum.py
│ ├── tests/
│ │ ├── data/
│ │ │ ├── __init__.py
│ │ │ ├── test_import.py
│ │ ├── conftest.py
├── pyproject.toml
├── README.md
├── CHANGELOG.md
from config import config
from setup import create_app, db
import os
import pytest
@pytest.fixture(scope='session')
def app():
os.environ['ENV'] = 'test'
app = create_app(config.SCHEDULER_API_ENABLED)
yield app
@pytest.fixture(scope='session')
def client(app):
with app.test_client() as client:
with app.app_context():
db.create_all()
yield client
def test_import():
try:
from data.technology.enums import TechnologyTypeEnum
assert True
except ModuleNotFoundError:
assert False, "Import failed"
ERROR app/tests - ModuleNotFoundError: No module named 'data.technology'
PYTHONPATH 调整:
我在运行
PYTHONPATH=$(pwd)/app
之前设置了PYTHONPATH=$(pwd)
和pytest
,但都没有解决问题。
我还在根目录下创建了一个
pytest.ini
文件来指定pythonpath
,但也没有解决问题:
[pytest]
pythonpath = app
[pytest]
pythonpath = absolute/path/to/project/app
Docker 环境:
app
模块被正确识别,一切都按预期工作。在 Docker 中运行
pytest
:
pytest
,以确保与后端正常工作的环境保持一致。不幸的是,即使在 Docker 环境中,我也遇到了与 ModuleNotFoundError
模块相同的 app
。路径修改:
sys.path
中修改conftest.py
以包含项目根目录,但这也没有解决问题。当后端在 Docker 中运行得很好时,为什么
pytest
在本地和 Docker 中都无法识别 app
模块?如何配置我的环境以允许 pytest
识别 app
模块,或者我的设置中可能缺少什么?
任何关于解决工作后端和失败
pytest
之间差异的指导将不胜感激。
您遇到的错误
(ModuleNotFoundError)
可能是由于test_import.py
中的导入语句不正确造成的。要解决此问题,您需要修改导入语句如下:
您必须导入 TechnologyTypeEnum,如 from
app.data.technology.enums.technology_type_enum
import TechnologyTypeEnum
,
而不是从 data.technology.enums
导入 TechnologyTypeEnum
正确导入TechnologyTypeEnum后,您需要导航到根文件夹并使用
pytest
运行特定测试:pytest test app/tests/data/test_import.py
按照这些步骤,您的环境应该配置正确,并且 ModuleNotFoundError 应该得到解决。确保通过运行以下命令在 app 文件夹的父文件夹中正确导出 python 部分。
$env:PYTHONPATH = (Get-Location).Path (for windows)
或导出
PYTHONPATH=$(pwd) (for linux)
。