首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FastAPI(61)- 异步测试

FastAPI(61)- 异步测试

作者头像
小菠萝测试笔记
发布2021-10-09 10:57:52
发布2021-10-09 10:57:52
91300
代码可运行
举报
运行总次数:0
代码可运行

前言

  • 前面讲解了通过 pytest 进行单元测试,是针对同步函数的:https://cloud.tencent.com/developer/article/1886017
  • 但它无法再 pytest 中测试或运行任何异步函数
  • 能够在测试中使用异步函数可能很有用
  • 例如,当异步查询数据库时,假设想要测试向 FastAPI 应用程序发送请求,然后验证后端是否成功在数据库中写入了正确的数据,同时使用异步数据库

FastAPI 代码

代码语言:javascript
代码运行次数:0
运行
复制
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Tomato"}

单元测试代码

需要先安装
代码语言:javascript
代码运行次数:0
运行
复制
pip install httpx
pip install trio
pip install anyio
测试代码
代码语言:javascript
代码运行次数:0
运行
复制
import pytest
from httpx import AsyncClient

from .main import app


@pytest.mark.anyio
async def test_root():
    async with AsyncClient(app=app, base_url="http://test") as ac:
        response = await ac.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Tomato"}
httpx
  • 即使 FastAPI 应用程序使用普通 def 函数而不是 async def,它仍然是一个异步应用程序
  • TestClient 在内部使用标准 pytest 在正常 def 测试函数中调用异步 FastAPI 应用程序做了一些魔术
  • 但是当在异步函数中使用调用异步 FastAPI 应用程序时,这种魔法就不再起作用了
  • 通过异步运行测试用例,不能再在测试函数中使用 TestClient,此时有一个不错的替代方案,称为 HTTPX
  • HTTPX 是 Python 3 的 HTTP 客户端,它允许像使用 TestClient 一样查询 FastAPI 应用程序
  • HTTPX 的 API 和 requests 库几乎相同
  • 重要的区别:用 HTTPX 不仅限于同步,还可以发出异步请求
@pytest.mark.anyio

告诉 pytest 这个测试函数应该异步调用

AsyncClient
  • 通过使用 FastAPI app 创建一个 AsyncClient,并使用 await 向它发送异步请求
  • 需要搭配 async/await 一起使用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • FastAPI 代码
  • 单元测试代码
    • 需要先安装
    • 测试代码
    • httpx
    • @pytest.mark.anyio
    • AsyncClient
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档