如何使用pytest测试Flask中处理请求的非路由业务函数?
问题解答
错误原因分析
- 第一个
AttributeError: 'function' object has no attribute 'post'报错的根因是:pytest的fixture需要作为参数传入测试函数才会被实例化,你写的test_process_post_request没有声明接收client参数,此时函数内的client指向的是fixture函数本身,而非实例化的测试客户端对象。 - 第二个核心逻辑误区:
client.post()返回的是请求的响应对象,而非Flask的request请求对象,完全不符合process_post_request的入参要求,就算修复了fixture的问题也无法正常调用函数。
正确测试方案
方案1:单元测试(推荐,隔离性最好,不需要走路由匹配)
直接通过Flask提供的测试请求上下文构造符合要求的request对象,单独测试工具函数,代码如下:
import pytest from flask import request # 替换为你自己项目的app实例和process_post_request导入路径 from your_app_module import app, process_post_request def test_process_post_request(): # 构造POST请求测试上下文,路径可以任意填写,不需要匹配实际路由 with app.test_request_context( method="POST", data={"param1": "5", "param2": "7"} ): # 上下文内的request对象就是符合入参要求的请求对象 sum_val, product_val = process_post_request(request) assert sum_val == 12 assert product_val == 35
注意:你原函数中直接从
request.form取的参数是字符串类型,直接执行加减会得到字符串拼接结果,需要先转成数值类型再计算,修改原函数如下:def process_post_request(request): param1 = int(request.form.get('param1', 0)) param2 = int(request.form.get('param2', 0)) sum_val = param1 + param2 product_val = param1 * param2 return sum_val, product_val
方案2:集成测试(验证路由逻辑)
如果你需要同时验证路由和工具函数的联动效果,可以直接测试路由的返回结果,不需要单独调用process_post_request:
import pytest # 替换为你自己项目的app实例导入路径 from your_app_module import app @pytest.fixture def client(): with app.test_client() as client: yield client def test_api_route(client): resp = client.post('/api', data={'param1': 5, 'param2':7}) # 按你的api路由实际返回逻辑修改断言,此处假设返回JSON格式结果 resp_data = resp.get_json() assert resp_data['sum'] == 12 assert resp_data['product'] == 35
内容的提问来源于stack exchange,提问作者bwooster
相关产品推荐
相关产品推荐

