You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试时如何创建带自定义环境变量的多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:34:54