Pytest ModuleNotFoundError:尽管在 Docker 环境中工作,但没有名为“app”的模块

问题描述 投票:0回答:1

我遇到了一个问题,由于

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

conftest.py:

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

test_import.py:

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'

我尝试过的:

  1. PYTHONPATH 调整

    • 我在运行

      PYTHONPATH=$(pwd)/app
      之前设置了
      PYTHONPATH=$(pwd)
      pytest
      ,但都没有解决问题。

    • 我还在根目录下创建了一个

      pytest.ini
      文件来指定
      pythonpath
      ,但也没有解决问题:

      [pytest]
      pythonpath = app
      
      [pytest]
      pythonpath = absolute/path/to/project/app
      
  2. Docker 环境:

    • 后端在 Docker 容器内运行没有问题。
      app
      模块被正确识别,一切都按预期工作。
  3. 在 Docker 中运行

    pytest
    :

    • 我还尝试在 Docker 容器内运行
      pytest
      ,以确保与后端正常工作的环境保持一致。不幸的是,即使在 Docker 环境中,我也遇到了与
      ModuleNotFoundError
      模块相同的
      app
  4. 路径修改:

    • 我尝试直接在
      sys.path
      中修改
      conftest.py
      以包含项目根目录,但这也没有解决问题。

问题:

当后端在 Docker 中运行得很好时,为什么

pytest
在本地和 Docker 中都无法识别
app
模块?如何配置我的环境以允许
pytest
识别
app
模块,或者我的设置中可能缺少什么?

任何关于解决工作后端和失败

pytest
之间差异的指导将不胜感激。

unit-testing flask testing pytest pythonpath
1个回答
0
投票

您遇到的错误

(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)

© www.soinside.com 2019 - 2024. All rights reserved.