Flask图片上传预测接口单元测试TypeError报错求助
问题分析与解决方案
核心问题点
- 请求参数不匹配:接口通过
request.files.getlist("images")获取批量文件,但测试代码里用的参数键是image,导致接口判定"images" not in request.files,返回index.html,后续测试断言逻辑完全偏离预期。 - 响应类型错误:接口返回的是渲染后的HTML模板(
render_template),而非JSON数据,但测试代码尝试通过rv.json["filename"]解析JSON,导致rv.json为None,触发TypeError: 'NoneType' object is not subscriptable。 - 断言逻辑错误:原测试断言的
rv.json["filename"]完全不符合接口的返回结构,接口返回的是包含预测结果字典的HTML页面,而非单独的filename字段。
修复后的单元测试代码
def test_upload_1files(test_client): # 确保测试文件存在,或用临时文件模拟真实图片 with open("fakeimage1.png", "rb") as img_file: data = { # 键名改为接口要求的"images",用列表格式适配getlist逻辑 'images': [(img_file, "fakeimage1.png")] } rv = test_client.post('/', data=data, content_type='multipart/form-data') # 断言状态码符合预期 assert rv.status_code == 201 # 断言响应内容包含上传的文件名(接口返回的results.html会渲染文件名) assert b"fakeimage1.png" in rv.data # 若需验证预测结果,可根据RCLASSES的预期值补充断言 # assert b"[你的预期分类结果]" in rv.data
额外优化建议
- 模型加载优化:当前接口每次POST请求都重新加载模型(
rmodel = tf.keras.models.load_model(MODEL)),建议把模型加载代码移到路由外部,避免重复加载浪费资源。 - 文件校验增强:对上传文件的格式、有效性(如非图片文件)增加校验,防止
Image.open(file)抛出异常导致接口崩溃。 - 测试文件模拟:使用
tempfile模块创建临时测试图片,避免依赖本地真实文件,提升测试的独立性。
内容的提问来源于stack exchange,提问作者preetham
相关产品推荐
相关产品推荐

