How to Test FastAPI Application: Simple Guide with Examples
To test a
FastAPI application, use TestClient from fastapi.testclient to simulate HTTP requests. Write test functions with pytest that call your API endpoints and check responses for expected status codes and data.Syntax
Testing a FastAPI app involves creating a TestClient instance with your app and then calling HTTP methods like .get(), .post() on it. You check the response's status_code and .json() data to verify behavior.
Key parts:
TestClient(app): wraps your FastAPI app for testing.client.get('/path'): sends a GET request to the endpoint.response.status_code: HTTP status code returned.response.json(): parsed JSON response body.
python
from fastapi.testclient import TestClient from fastapi import FastAPI app = FastAPI() @app.get('/') def read_root(): return {"message": "Hello World"} client = TestClient(app) response = client.get('/') print(response.status_code) # 200 print(response.json()) # {'message': 'Hello World'}
Output
200
{'message': 'Hello World'}
Example
This example shows a complete test for a FastAPI app endpoint using pytest and TestClient. It tests that the root endpoint returns status 200 and the expected JSON message.
python
from fastapi import FastAPI from fastapi.testclient import TestClient app = FastAPI() @app.get('/') def read_root(): return {"message": "Hello World"} client = TestClient(app) def test_read_root(): response = client.get('/') assert response.status_code == 200 assert response.json() == {"message": "Hello World"}
Common Pitfalls
Common mistakes when testing FastAPI apps include:
- Not using
TestClientand trying to call app routes directly. - Forgetting to assert the
status_codebefore checking response data. - Not running tests with a test runner like
pytest. - Modifying global app state during tests without isolation.
Always use TestClient to simulate real HTTP requests and keep tests independent.
python
from fastapi import FastAPI from fastapi.testclient import TestClient app = FastAPI() @app.get('/items/{item_id}') def read_item(item_id: int): return {"item_id": item_id} client = TestClient(app) # Wrong: calling function directly (no HTTP context) # response = read_item(1) # returns dict, no status code # Right: use TestClient to get full response response = client.get('/items/1') assert response.status_code == 200 assert response.json() == {"item_id": 1}
Quick Reference
Summary tips for testing FastAPI applications:
- Use
TestClientfromfastapi.testclientto simulate requests. - Write test functions with
pytestand useassertto check responses. - Check both
status_codeand response body for correctness. - Keep tests isolated and avoid side effects.
- Run tests with
pytestcommand in your terminal.
Key Takeaways
Use TestClient to simulate HTTP requests to your FastAPI app in tests.
Always assert response status codes and JSON data to verify API behavior.
Write test functions compatible with pytest for easy test running.
Avoid calling route functions directly; use TestClient for realistic tests.
Keep tests independent and free of side effects for reliable results.