๐ ๐ฏ¶
๐ โ๏ธ โช ๐ โ ๐ฏ ๐ FastAPI ๐ธ โ๏ธ ๐ TestClient
. ๐ ๐, ๐ โ๏ธ ๐ด ๐ โ โ ๐ ๐ฏ, ๐ต โ๏ธ async
๐ข.
โ ๐ช โ๏ธ ๐ ๐ข ๐ ๐ฏ ๐ช โ , ๐ผ, ๐โ ๐ ๐ฌ ๐ ๐ฝ ๐. ๐ ๐ ๐ ๐ฏ ๐จ ๐จ ๐ FastAPI ๐ธ & โคด๏ธ โ ๐ ๐ ๐ฉโ๐ป โช โ โ ๐ฝ ๐ฝ, โช โ๏ธ ๐ ๐ฝ ๐.
โก๏ธ ๐ โ ๐ฅ ๐ช โ ๐ ๐ท.
pytest.mark.anyio¶
๐ฅ ๐ฅ ๐ ๐ค ๐ ๐ข ๐ ๐ฏ, ๐ ๐ฏ ๐ข โ๏ธ ๐. AnyIO ๐ ๐ ๐ ๐, ๐ โ ๐ฅ โ ๐ ๐ฏ ๐ข ๐ค ๐.
๐ธ๐ฒ¶
๐ฅ ๐ FastAPI ๐ธ โ๏ธ ๐ def
๐ข โฉ๏ธ async def
, โซ๏ธ async
๐ธ ๐.
TestClient
๐จ ๐ฑ ๐ ๐ค ๐ FastAPI ๐ธ ๐ ๐ def
๐ฏ ๐ข, โ๏ธ ๐ฉ โณ. โ๏ธ ๐ ๐ฑ ๐ซ ๐ท ๐ซ๐ ๐โ ๐ฅ โ๏ธ โซ๏ธ ๐ ๐ ๐ข. ๐ ๐ ๐ฏ ๐, ๐ฅ ๐ช ๐
โโ ๐ โ๏ธ TestClient
๐ ๐ ๐ฏ ๐ข.
TestClient
โ๏ธ ๐ ๐ธ๐ฒ, & โฉ๏ธ, ๐ฅ ๐ช โ๏ธ โซ๏ธ ๐ ๐ฏ ๐ ๏ธ.
๐ผ¶
๐ ๐ผ, โก๏ธ ๐ค ๐ ๐ ๐ 1๏ธโฃ ๐ฌ ๐ฆ ๐ธ & ๐ฌ:
.
โโโ app
โย ย โโโ __init__.py
โย ย โโโ main.py
โย ย โโโ test_main.py
๐ main.py
๐ โ๏ธ:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Tomato"}
๐ test_main.py
๐ โ๏ธ ๐ฏ main.py
, โซ๏ธ ๐ช ๐ ๐ ๐ ๐:
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"}
๐ โซ๏ธ¶
๐ ๐ช ๐ ๐ ๐ฏ ๐ ๐จ:
$ pytest
---> 100%
โน¶
๐ @pytest.mark.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"}
Tip
๐ ๐ ๐ฏ ๐ข ๐ async def
โฉ๏ธ def
โญ ๐โ โ๏ธ TestClient
.
โคด๏ธ ๐ฅ ๐ช โ AsyncClient
โฎ๏ธ ๐ฑ, & ๐จ ๐ ๐จ โซ๏ธ, โ๏ธ await
.
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"}
๐ ๐:
response = client.get('/')
...๐ ๐ฅ โ๏ธ โ ๐ ๐จ โฎ๏ธ TestClient
.
Tip
๐ ๐ ๐ฅ โ๏ธ ๐/โ โฎ๏ธ ๐ AsyncClient
- ๐จ ๐.
๐ ๐ ๐ข ๐ค¶
๐ฌ ๐ข ๐ ๐, ๐ ๐ช ๐ ๐ค (& await
) ๐ async
๐ข โ๏ธ โช๏ธโก๏ธ ๐จ ๐จ ๐ FastAPI ๐ธ ๐ ๐ฏ, โซ๏ธโ ๐ ๐ ๐ค ๐ซ ๐ ๐ ๐ ๐.
Tip
๐ฅ ๐ โ RuntimeError: Task attached to a different loop
๐โ ๐ ๏ธ ๐ ๐ข ๐ค ๐ ๐ฏ (โ
๐โ โ๏ธ โณ MotorClient) ๐ญ ๐ ๐ ๐ ๐ช ๐ โฐ ๐ด ๐ ๐ ๐ข, โ
'@app.on_event("startup")
โฒ.