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

Flask路由测试用Pytest无法完成,仅终止后执行并通过

Flask单元测试挂起问题的原因与解决办法

问题根源

测试挂起的核心原因是Flask应用代码中的app.run()没有被正确隔离:

  • 当测试代码执行from Flask import app时,会运行整个Flask模块的全局代码,包括启动服务器的app.run()。
  • app.run()会启动一个阻塞式HTTP服务器,占据主线程,导致测试代码无法继续执行,直到手动终止服务器(Ctrl+C),测试才会被触发运行。

解决步骤

1. 修复Flask应用代码

把app.run()放入if __name__ == '__main__':代码块,确保只有直接运行该文件时才启动服务器,导入模块时不会执行启动逻辑:

import pandas as pd
from keras.models import load_model
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import joblib
from flask import Flask  # 注意:原代码遗漏了Flask导入,需补充

app = Flask(__name__)

# load the model
model = load_model('LSTM-KarelOfzo.h5')
scaler = joblib.load('scaler2.pkl')

# ... 原有的路由定义代码保持不变 ...

# 仅在直接运行该文件时启动服务器
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=False)

2. 简化测试代码

Flask的test_client是模拟HTTP请求,不需要真实启动服务器,也无需额外的延迟或清理操作,简化后的测试代码如下:

import unittest
from Flask import app  # 确保此处的"Flask"是你的Flask模块文件名

class TestFlaskAPI(unittest.TestCase):
    def setUp(self):
        app.testing = True  # 启用测试模式,关闭不必要的错误捕获,提升测试效率
        self.app = app.test_client()

    def test_get_glucose_data(self):
        response = self.app.get('/Glucose/1-5-2023')
        self.assertEqual(response.status_code, 200)
        # 接口返回JSON格式,修正content_type断言
        self.assertEqual(response.content_type, 'application/json')

    def test_get_prediction(self):
        response = self.app.get('/prediction/10/50/100')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content_type, 'text/html; charset=utf-8')

if __name__ == '__main__':
    unittest.main()

额外注意事项

  • TensorFlow警告处理:测试时出现的TensorFlow警告是加载Keras模型时的日志输出,不影响测试逻辑,可通过以下代码屏蔽:
    import tensorflow as tf
    tf.get_logger().setLevel('ERROR')
    
  • 接口返回格式校验:原测试中/Glucose/<date>接口的content_type断言错误(实际返回JSON),已在修正后的测试代码中调整,保证测试准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:07:14