FastAPI异步接口大数据集pytest测试慢,求配置验证与提速方案
FastAPI大规模数据集测试提速方案
1. 复用AsyncClient连接
当前的async_app_client fixture是函数级的,每次测试都会新建并销毁客户端连接,产生大量额外开销。改成会话级fixture,整个测试过程只创建一次客户端:
@pytest_asyncio.fixture(scope="session") async def async_app_client(): async with AsyncClient(app=app, base_url='http://localhost') as client: yield client
2. 批量异步请求,减少任务调度开销
逐个发起请求会频繁触发异步任务调度,速度很慢。改用asyncio.gather批量执行请求,同时先对term去重,解决重复值导致的结果不一致问题:
import asyncio @pytest.mark.asyncio async def test_on_terms_batch(async_app_client): # 去重处理,减少无效重复请求 unique_terms = dataset['value'].unique() # 分批次避免一次性请求过多压垮接口 batch_size = 50 for batch_start in range(0, len(unique_terms), batch_size): current_batch = unique_terms[batch_start:batch_start+batch_size] # 批量创建请求任务 tasks = [async_app_client.get(f"/endpoint?text={term}") for term in current_batch] # 并发执行所有请求 responses = await asyncio.gather(*tasks) # 批量校验响应状态 for term, response in zip(current_batch, responses): assert response.status_code == 200, f"{term} 返回非200状态码"
3. 优化数据集加载
针对大规模数据集,加载时可做如下优化:
- 只加载需要的列:
pd.read_csv("data.csv", usecols=["value"]) - 指定列类型避免自动类型推断:
pd.read_csv("data.csv", dtype={"value": str}, low_memory=False)
4. 简化pytest运行参数
运行测试时添加以下参数减少额外开销:
--tb=short:缩短错误回溯信息,减少报告生成耗时--no-cache:禁用pytest缓存,避免不必要的IO操作-q:静默模式,减少控制台输出的耗时
5. 优化接口测试环境
如果接口本身处理耗时,测试时可临时简化依赖:
- 用内存数据库替代真实数据库
- 禁用非必要中间件(如日志、认证组件)
- Mock掉接口中的耗时业务逻辑,仅测试路由和响应格式正确性
内容的提问来源于stack exchange,提问作者kwehmeyer
相关产品推荐
相关产品推荐

