When building APIs with FastAPI, testing is very important. But sometimes, you don’t want to set up complicated testing tools just to check if an endpoint works.
That’s where TestClient
comes in. It’s built-in and easy to use. In this post, I’ll show you how to use TestClient
to quickly validate your APIs.
What is TestClient
?
TestClient
is a tool from fastapi.testclient
, which is a wrapper around requests
, and it lets you call your FastAPI endpoints like real HTTP requests — without running the server.
You can use it for:
- Testing if an endpoint works
- Sending GET/POST requests
- Checking response status and data
Basic Example
Let’s start with a simple FastAPI app and test it with TestClient
.
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/ping")
def ping():
return {"message": "pong"}
Now, test this with TestClient
:
# test_main.py
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_ping():
response = client.get("/ping")
assert response.status_code == 200
assert response.json() == {"message": "pong"}
Run the test:
pytest test_main.py
You’ll see it pass ✅
Test with Query Parameters
@app.get("/greet")
def greet(name: str = "friend"):
return {"message": f"Hello, {name}!"}
Test it:
def test_greet():
response = client.get("/greet?name=John")
assert response.json() == {"message": "Hello, John!"}
Test POST Request with JSON Body
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
@app.post("/items")
def create_item(item: Item):
return {"name": item.name, "price": item.price}
Test it:
def test_create_item():
data = {"name": "Book", "price": 12.5}
response = client.post("/items", json=data)
assert response.status_code == 200
assert response.json() == data
Test with Headers
@app.get("/secure")
def secure_route(x_token: str):
if x_token != "secret":
return {"error": "Unauthorized"}
return {"message": "Secure access granted"}
Test it:
def test_secure_route():
headers = {"x-token": "secret"}
response = client.get("/secure", headers=headers)
assert response.json() == {"message": "Secure access granted"}
Override Dependencies (Advanced Use)
Sometimes, you want to override a dependency (e.g. get_current_user
) for testing.
from fastapi import Depends
def get_user():
return {"username": "real_user"}
@app.get("/me")
def read_me(user=Depends(get_user)):
return user
Override it in the test:
def fake_user():
return {"username": "test_user"}
app.dependency_overrides[get_user] = fake_user
def test_read_me():
response = client.get("/me")
assert response.json() == {"username": "test_user"}
Summary
What You Learned | Description |
---|---|
TestClient |
Built-in tool to test FastAPI endpoints |
.get() / .post() |
Call endpoints with methods |
json , headers , params |
Send data like a real client |
dependency_overrides |
Mock logic for testing |
Conclusion
With TestClient
, you don’t need to deploy your API just to test it. You can write tests quickly and make sure your endpoints behave correctly.
It’s simple, powerful, and great for both beginners and experienced developers.