测试时如何创建带自定义环境变量的多FastAPI应用实例
解决测试中切换配置创建不同FastAPI实例的方法
方法1:重构配置与应用初始化逻辑,支持动态传参
把全局配置改成可调用函数,让应用初始化时能接收自定义配置,这样测试时可以灵活传入不同的参数值。
修改config.py
from pydantic_settings import BaseSettings from dotenv import load_dotenv def get_config(env_file: str = ".env", override: dict = None): load_dotenv(env_file) settings = BaseSettings() if override: for key, value in override.items(): setattr(settings, key, value) return settings # 保留原有全局cfg,不影响生产环境代码 cfg = get_config()
修改app.py
from fastapi import FastAPI def create_app(cfg=None): # 未传配置时用默认全局配置,兼容原有逻辑 if cfg is None: from config import cfg app = FastAPI(debug=cfg.DEBUG) @app.get("/get_feature") def get_feature(): if cfg.USING_FASTER_API: # 快速API调用逻辑 return {"data": "consistent_result"} else: # 慢速API调用逻辑 return {"data": "consistent_result"} return app # 保留原有app初始化,不影响正常运行 app = create_app()
测试代码(基于pytest)
from fastapi.testclient import TestClient from config import get_config from app import create_app def test_get_feature_both_modes_return_same(): # 创建快速API模式的客户端 fast_cfg = get_config(override={"USING_FASTER_API": True}) fast_client = TestClient(create_app(fast_cfg)) # 创建慢速API模式的客户端 slow_cfg = get_config(override={"USING_FASTER_API": False}) slow_client = TestClient(create_app(slow_cfg)) # 发起请求并断言结果一致 fast_res = fast_client.get("/get_feature").json() slow_res = slow_client.get("/get_feature").json() assert fast_res == slow_res
方法2:测试中临时修改环境变量,重载模块
利用Python的importlib.reload,每次修改环境变量后重新加载配置和应用模块,生成新的应用实例。
测试代码示例
import os import importlib from fastapi.testclient import TestClient def test_get_feature_different_modes(): # 测试快速API模式 os.environ["USING_FASTER_API"] = "TRUE" import config importlib.reload(config) import app importlib.reload(app) fast_res = TestClient(app.app).get("/get_feature").json() # 测试慢速API模式 os.environ["USING_FASTER_API"] = "FALSE" importlib.reload(config) importlib.reload(app) slow_res = TestClient(app.app).get("/get_feature").json() assert fast_res == slow_res
注意:如果有其他依赖该配置的模块,也需要一并重载,避免缓存导致的配置不更新问题。
方法3:用pytest参数化fixture批量测试
结合pytest的参数化fixture,自动为不同配置生成测试客户端,减少重复代码。
测试代码示例
import pytest from fastapi.testclient import TestClient from config import get_config from app import create_app @pytest.fixture(params=[True, False]) def client(request): using_fast_api = request.param cfg = get_config(override={"USING_FASTER_API": using_fast_api}) return TestClient(create_app(cfg)) def test_get_feature_consistent_result(client): res = client.get("/get_feature") assert res.status_code == 200 assert res.json() == {"data": "consistent_result"}
这个fixture会自动运行两次测试,分别覆盖
USING_FASTER_API=True和False的场景,验证结果一致性。
内容的提问来源于stack exchange,提问作者Hang
相关产品推荐
相关产品推荐

