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

如何使用pytest从test_client访问Flask应用上下文?

解决Flask测试中通过test_client访问应用上下文属性的问题

问题根源

你遇到的AttributeError是因为测试函数中的test_app是FlaskClient(测试客户端)实例,而非你定义的Flask应用实例app。测试客户端只是模拟发送HTTP请求的工具,本身并不包含应用实例的属性(比如my_content)。

解决方案

方案1:直接访问全局应用实例

如果你的应用使用全局app实例,可以直接在测试中引用它,而非测试客户端:

修改测试函数:

def test_example_func(test_app):
    response = test_app.get("/test/")
    # 直接使用全局的app实例访问my_content
    assert app.my_content["test"] == "testing entry"

方案2:夹具返回应用实例+测试客户端(推荐)

为了避免依赖全局变量,同时防止测试间的状态污染,建议在夹具中每次创建新的应用实例,并同时返回应用和测试客户端:

修改Pytest夹具:

@pytest.fixture(name="test_setup")
def test_setup():
    # 每次测试创建全新的应用实例,避免测试污染
    app = make_service()
    with app.test_client() as testing_client:
        with app.app_context():
            yield app, testing_client

对应的测试函数:

def test_example_func(test_setup):
    app, test_client = test_setup
    response = test_client.get("/test/")
    # 从返回的应用实例中访问my_content
    assert app.my_content["test"] == "testing entry"

额外优化:简化应用初始化代码

你在make_service中给应用添加my_content属性时,不需要包裹在app.app_context()中——直接给Flask实例添加属性即可,因为这是应用实例本身的属性,而非上下文临时变量:

from flask import Flask
from typing import Dict

def make_service():
    service = Flask("my_service")
    # 直接给应用实例添加属性,无需app_context
    service.my_content: Dict[str, str] = {}
    return service

app = make_service()

@app.route("/test/")
def example_func():
    app.my_content["test"] = "testing entry"
    return "OK"  # 路由需要返回响应,否则会触发Flask错误

关于app_context的补充说明

Flask的app_context是用来管理应用上下文的,它让current_app、g等上下文变量在当前线程中可用。比如在路由外需要访问应用配置或上下文变量时,才需要手动激活app_context。而给应用实例本身添加属性(如my_content),不需要依赖上下文,可以直接操作实例。

内容的提问来源于stack exchange,提问作者Kroshtan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:32:14