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

Flask pytest测试执行卡住无报错,请求排查代码问题

Flask测试用例执行卡住的问题排查与修复

问题根源

你的测试用例卡住的核心原因是test_app fixture中调用了app.run(port=5001, debug=True)——这个方法会启动Flask的开发服务器,是阻塞式的,一旦执行就会一直占用进程,不会进入后续的yield app步骤,导致依赖这个fixture的token和test_index都无法执行,进程自然卡住不动。

修复方案

Flask提供了专门的测试客户端test_client(),不需要启动真实的服务器就能模拟请求。修改你的测试代码如下:

import os
import json
import pytest
from your_app_module import create_app  # 替换为你的实际应用导入路径

@pytest.fixture(scope='module')
def test_app():
    app = create_app('config')
    # 无需调用app.run(),直接yield app实例
    yield app

@pytest.fixture(scope='module')
def token(test_app):
    with test_app.test_client() as client:
        TEST_ADMIN = os.environ['TEST_ADMIN']
        TEST_PASSWORD = os.environ['TEST_PASSWORD']
        req = {"username": TEST_ADMIN, "password": TEST_PASSWORD}
        response = client.post('/api/login/', json=req)
        # 新增断言确保登录请求成功,避免后续token获取失败
        assert response.status_code == 200
        token = response.json['access_token']
    return token

def test_index(test_app, token):
    with test_app.test_client() as client:
        # 必须通过test_client发起请求,而非直接调用app.get()
        res = client.get('/test/', headers={"Authorization": f"Bearer {token}"})
        assert res.status_code == 200
        expected = {"code": "200"}
        assert expected == json.loads(res.get_data(as_text=True))

额外注意事项

  • 原代码中test_app.get('/test/')是错误用法,Flask app实例本身没有get方法,必须通过test_client()对象发起请求。
  • 如果/test/接口需要认证,记得在请求头中携带获取到的token,否则会返回401未授权状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:37:24