集成SQLAlchemy与Oracle的FastAPI应用测试报错求助
FastAPI接口测试异常排查方案
问题1:首页接口返回400状态码,断言200失败
核心排查方向
TrustedHostMiddleware 校验拦截
该中间件会校验请求的Host头,如果测试时请求的Host不在allowed_hosts列表中,直接返回400。- 临时注释
main.py中的TrustedHostMiddleware,重新运行测试,若恢复正常则确认是该问题。 - 解决方法:
- 测试请求时显式添加合法Host头:
client.get("/", headers={"Host": "your-allowed-domain.com"}) - 用环境变量动态控制允许的Host,测试环境设为通配符:
测试前设置环境变量# main.py import os from fastapi.middleware.trustedhost import TrustedHostMiddleware allowed_hosts = os.getenv("ALLOWED_HOSTS", "*").split(",") app.add_middleware(TrustedHostMiddleware, allowed_hosts=allowed_hosts)ALLOWED_HOSTS=*
- 测试请求时显式添加合法Host头:
- 临时注释
SessionMiddleware 配置问题
若首页接口依赖Session,需确认SessionMiddleware的secret_key已正确配置,测试环境与生产环境的配置保持一致,避免因Session初始化失败导致400。请求路径/方法不匹配
核对测试代码的请求路径(如是否应为"/"而非"/index")、请求方法(如是否用GET而非POST)与实际路由定义完全一致。
问题2:课程搜索接口出现 AttributeError: 'function' object has no attribute 'get'
核心排查方向
数据库依赖注入错误
该错误通常是把数据库Session的创建函数当成实例注入了接口。- 检查测试代码中的依赖覆盖逻辑:
# 错误示例:注入的是函数本身而非实例 app.dependency_overrides[get_db] = get_db # 正确示例:注入的是Session实例生成器 def override_get_db(): try: db = TestingSessionLocal() yield db finally: db.close() app.dependency_overrides[get_db] = override_get_db
- 检查测试代码中的依赖覆盖逻辑:
存储过程结果处理错误
cx_Oracle调用存储过程的返回值不是字典,若直接调用.get()会报错:- 错误示例:
result = cursor.callproc("GET_COURSES") course_name = result.get("course_name") # 此处报错 - 正确处理:根据存储过程的输出参数或结果集,用
cursor.fetchall()或提取输出参数的方式获取数据。
- 错误示例:
请求参数获取错误
检查接口中获取查询参数的代码,是否误把request.query_params当成函数调用:# 错误 query = request.query_params().get("q") # 正确 query = request.query_params.get("q")
通用排查点
- 确认测试环境的Oracle连接正常:检查连接字符串、数据库权限,确保能正常执行目标存储过程。
- 导入app时,直接从
main.py导入已完成中间件和路由注册的实例,避免测试中重新创建app导致配置缺失。 - 使用
fastapi.testclient.TestClient而非Starlette的TestClient,确保对FastAPI特性的兼容支持。
内容的提问来源于stack exchange,提问作者cpunz
相关产品推荐
相关产品推荐

