Το FastAPI είναι εξαιρετικά δοκιμάσιμο χάρη στο TestClient του (βασισμένο σε Starlette/httpx) και στο σύστημα dependency injection του, το οποίο κάνει trivial το mocking των dependencies. Οι δοκιμές συνήθως χρησιμοποιούν pytest και το TestClient για να στείλουν αιτήματα στην εφαρμογή χωρίς ένα εκτελούμενο server.
Βασική δοκιμή endpoint με TestClient
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 στέλνει πραγματικά αιτήματα στην εφαρμογή σας in-process (δεν χρειάζεται server), οπότε δοκιμάζετε την πλήρη ροή — routing, validation, serialization — και κάνετε assertions σε status codes και JSON responses.
Αντικατάσταση dependencies (το κλειδί για καθαρές δοκιμές)
# 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
Το dependency_overrides του FastAPI σας επιτρέπει να αντικαταστήσετε οποιοδήποτε dependency (database session, auth, external services) με ένα test double — το θεμέλιο των γρήγορων, απομονωμένων δοκιμών, που γίνεται trivial από το σχέδιο DI.
Δοκιμή προστατευμένων endpoints
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
Στρατηγική δοκιμών
✓ 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
Γιατί είναι σημαντικό
Οι δοκιμές είναι απαραίτητες για αξιόπιστες εφαρμογές, και το FastAPI είναι αξιοσημείωτα δοκιμάσιμο — η κατανόηση του τρόπου δοκιμής του είναι σημαντική τόσο για την ποιότητα του κώδικα όσο και επειδή το framework είναι σχεδιασμένο για δοκιμασιμότητα.
Το TestClient διευκολύνει τη δοκιμή της πλήρους ροής request/response in-process (δεν χρειάζεται server), επαληθεύοντας routing, validation, serialization, και responses όπως θα τα βίωναν οι clients.
Το χαρακτηριστικό που ξεχωρίζει είναι η αντικατάσταση dependencies: επειδή το FastAPI χρησιμοποιεί dependency injection, μπορείτε εύκολα να αντικαταστήσετε οποιοδήποτε dependency — database sessions, authentication, external services — με test doubles μέσω app.dependency_overrides, ενεργοποιώντας γρήγορες, απομονωμένες δοκιμές χωρίς πραγματική υποδομή (αυτή η δοκιμασιμότητα είναι ένα σημαντικό όφελος του σχεδίου DI).
Η γνώση του τρόπου χρήσης του TestClient, της αντικατάστασης dependencies για απομόνωση (test databases, mocked auth/services), της δοκιμής προστατευμένων endpoints, και της δομής μιας λογικής στρατηγικής δοκιμών (status codes, response shapes, validation, auth, edge cases) είναι σημαντική γνώση senior-level για την κατασκευή ισχυρών εφαρμογών FastAPI.
Οι καλά δοκιμασμένα APIs ανιχνεύουν regressions και ενεργοποιούν ενδεδειγμένη refactoring, και τα εργαλεία δοκιμών του FastAPI κάνουν τις ολοκληρωμένες δοκιμές ευθεία, κάνοντας αυτό ένα συχνά σχετικό, επαγγελματικά σημαντικό θέμα.
