ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FastAPI(61)- 异步测试

2022-01-06 14:34:16  阅读:219  来源: 互联网

标签:异步 FastAPI app 应用程序 61 pytest async


FastAPI(61)- 异步测试 

 

前言

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

 

FastAPI 代码

from fastapi import FastAPI

app = FastAPI()


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

 

单元测试代码

需要先安装

pip install httpx
pip install trio
pip install anyio

 

测试代码

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 一起使用

 

标签:异步,FastAPI,app,应用程序,61,pytest,async
来源: https://www.cnblogs.com/xiao-xue-di/p/15770956.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有