【发布时间】:2021-10-21 18:27:09
【问题描述】:
我正在关注 testdriven.io 使用 FastAPI 和 Docker 进行测试驱动开发教程,但我被困在 Pytest 设置步骤上。我已经重新检查了一遍,看看我缺少什么,并不断补充不足。
教程中的代码示例表明,在 conftest.py 中,您需要使用以下 from 语句:
from app import main
from app.config import get_settings, Settings
首先,Pycharm 告诉我它无法从上面导入任何内容。 我的文件夹结构:
main.py:
import os
from fastapi import FastAPI, Depends
from tortoise.contrib.fastapi import register_tortoise
from .config import get_settings, Settings
app = FastAPI()
register_tortoise(
app,
db_url=os.environ.get("DATABASE_URL"),
modules={"models": ["app.models.tortoise"]},
generate_schemas=False,
add_exception_handlers=True,
)
@app.get("/ping")
async def pong(settings: Settings = Depends(get_settings)):
return {"ping": "pong", "environment": settings.environment, "testing": settings.testing}
conftest.py
import os
import pytest
from starlette.testclient import TestClient
from app import main
from app.config import get_settings, Settings
def get_settings_override():
return Settings(testing=1, database_url=os.environ.get("DATABASE_TEST_URL"))
@pytest.fixture(scope="module")
def test_app():
# set up
main.app.dependency_overrides[get_settings] = get_settings_override
with TestClient(main.app) as test_client:
# testing
yield test_client
# tear down
本教程让您使用 docker-compose exec web python -m pytest 运行测试
任何帮助将不胜感激。我觉得这是入门级的东西,让人非常头疼。
【问题讨论】:
-
您似乎在整个代码库(包括安装到您的环境中的库)上运行
pytest,而不仅仅是tests目录。尝试调用python -m pytest tests。 -
@MatsLindh,好的。这有帮助。测试现在正在运行,这很棒。尽管导入在 IDE 中无法正常工作,但仍然很奇怪……但是通过 docker 运行测试似乎并不重要?这似乎也错过了本教程中运行测试的命令是错误的。
-
我猜这是因为
app没有作为模块安装 - 因为tests无法导入app(除了当前目录被添加到 sys.path ),conftest.py内部的导入并没有真正识别任何东西。 pytest 文档中关于良好集成实践的第一个提示建议将您的app模块安装为可使用pip install -e编辑的模块。我通常自己做这个,效果很好(你需要一个 setup.py 文件,如示例所示)。
标签: python pytest fastapi testdriven.io