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
相关产品推荐
相关产品推荐

