FastAPI je jako testabilan zahvaljujući TestClient-u (izgrađenom na Starlette/httpx-u) i svom sistemu injekcije ovisnosti, što čini mockiranje ovisnosti trivijalno. Testovi obično koriste pytest i TestClient za slanje zahtjeva aplikaciji bez pokrenuta servera.
Osnovnog testiranja krajnjih točaka s TestClient-om
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_read_item():
response = client.get("/items/5") # send a request to the app in-process
assert response.status_code == 200
assert response.json() == {"item_id": 5}
def test_create_item():
response = client.post("/items", json={"name": "Phone", "price": 999})
assert response.status_code == 201
assert response.json()["name"] == "Phone"
def test_validation_error():
response = client.post("/items", json={"name": "Phone"}) # missing price
assert response.status_code == 422 # FastAPI validates automatically
TestClient šalje prave zahtjeve vašoj aplikaciji u procesu (nije potreban server), tako da testirate cijeli tok — rutiranje, validaciju, serijalizaciju — i provjeravate kodove stanja i JSON odgovore.
Prebrisavanje ovisnosti (ključ za čiste testove)
# override a dependency with a mock/test version — no real database needed
def override_get_db():
return test_db_session
app.dependency_overrides[get_db] = override_get_db # swap the real dependency
def test_with_test_db():
response = client.get("/users")
# uses the test database via the override
app.dependency_overrides.clear() # reset after
FastAPI-jeva dependency_overrides omogućava vam da zamijenite bilo koju ovisnost (sesija baze podataka, provjera autentičnosti, vanjski servisi) s test zamjenom — temelj brzih, izolirani testova, učinjenih trivijalnima DI dizajnom.
Testiranje zaštićenih krajnjih točaka
def test_protected():
# override the auth dependency to simulate a logged-in user
app.dependency_overrides[get_current_user] = lambda: fake_user
response = client.get("/me")
assert response.status_code == 200
Strategija testiranja
✓ Use a TEST database (separate, or transactions rolled back per test)
✓ Override dependencies (DB, auth, external APIs) for isolation
✓ Test: status codes, response shapes, validation (422s), auth/permissions, edge cases
✓ For async-specific code, use httpx.AsyncClient / pytest-asyncio
✓ Tools: pytest, factory libraries for test data, coverage.py
Zašto je to važno
Testiranje je neophodno za pouzdane aplikacije, a FastAPI je izrazito testabilan — razumijevanje kako ga testirati je važno i za kvalitetu koda i jer je okvir dizajniran za testabilnost.
TestClient čini jednostavnim testiranje punog toka zahtjev/odgovor u procesu (nije potreban server), provjera rutiranja, validacije, serijalizacije i odgovora baš kako bi ih klijenti doživjeli.
Isticaća karakteristika je prebrisavanje ovisnosti: jer FastAPI koristi injekciju ovisnosti, možete trivijalno zamijeniti bilo koju ovisnost — sesije baze podataka, provjeru autentičnosti, vanjske servise — s test zamjenama putem app.dependency_overrides, omogućavajući brze, izolirane testove bez prave infrastrukture (ta testabilnost je glavna prednost DI dizajna).
Znati kako koristiti TestClient, prebrisavati ovisnosti radi izolacije (testne baze podataka, mockirana autentičnost/servisi), testirati zaštićene krajnje točke i strukturirati razumnu strategiju testiranja (kodovi stanja, oblici odgovora, validacija, autentičnost, granični slučajevi) važno je znanje na razini seniora za izgradnju robusnih FastAPI aplikacija.
Dobro testirane API-je hvataju regresije i omogućavaju samopouzdano refaktoriranje, a FastAPI-jevi alati za testiranje čine temeljito testiranje jednostavnim, čineći ovu temu često relevantnom, stručno važnom temom.
