Build a FastAPI App with Test-Driven Development (TDD): A Beginner’s Guide

Author

Kritim Yantra

Apr 14, 2025

Build a FastAPI App with Test-Driven Development (TDD): A Beginner’s Guide

🌟 What You’ll Learn

  • What is FastAPI?
  • What is Test-Driven Development (TDD)?
  • Setting up your environment
  • Writing your first test
  • Creating a FastAPI endpoint
  • Running tests and iterating
  • Final thoughts

🤔 What is FastAPI?

FastAPI is a modern, fast (high-performance) web framework for building APIs with Python 3.7+ using standard Python type hints.

  • Super fast thanks to Starlette and Pydantic
  • Automatic OpenAPI docs
  • Great developer experience

🧪 What is Test-Driven Development (TDD)?

Test-Driven Development (TDD) is a software development approach where you write tests before writing the actual code. The cycle usually looks like this:

  1. Write a test (that fails)
  2. Write just enough code to make the test pass
  3. Refactor and clean up the code
  4. Repeat 🔁

🛠️ Setting Up the Project

Let’s build a simple To-Do API using TDD with FastAPI.

📁 Project Structure

fastapi-todo-tdd/
├── app/
│   ├── __init__.py
│   └── main.py
├── tests/
│   └── test_main.py
├── requirements.txt
└── README.md

✅ Step 1: Install Required Packages

python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

pip install fastapi uvicorn pytest httpx

Add these to requirements.txt:

fastapi
uvicorn
pytest
httpx

🧪 Step 2: Write Your First Test

Create a file tests/test_main.py.

# tests/test_main.py

from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)

def test_read_root():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Welcome to the ToDo API"}

We haven't even created the / endpoint yet. That’s the TDD way!


🖥️ Step 3: Create the FastAPI App

Create the file app/main.py.

# app/main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Welcome to the ToDo API"}

🧪 Step 4: Run the Test

pytest

✅ You should see:

1 passed in 0.XXs

📌 Step 5: Add a New Feature with TDD

Let’s allow users to add a to-do item.

🔍 Write the Failing Test First

Update tests/test_main.py:

def test_create_todo():
    response = client.post("/todos", json={"title": "Learn FastAPI"})
    assert response.status_code == 201
    assert response.json() == {
        "id": 1,
        "title": "Learn FastAPI"
    }

🔴 Run the test now — it will fail (because the endpoint doesn’t exist yet). That’s expected!


✅ Step 6: Write the Endpoint

Update app/main.py:

from fastapi import FastAPI, status
from pydantic import BaseModel

app = FastAPI()
todos = []  # In-memory storage
id_counter = 1

class ToDo(BaseModel):
    title: str

class ToDoResponse(ToDo):
    id: int

@app.get("/")
def read_root():
    return {"message": "Welcome to the ToDo API"}

@app.post("/todos", status_code=status.HTTP_201_CREATED, response_model=ToDoResponse)
def create_todo(todo: ToDo):
    global id_counter
    new_todo = {"id": id_counter, "title": todo.title}
    todos.append(new_todo)
    id_counter += 1
    return new_todo

✅ Step 7: Run Tests Again

pytest

✅ Both tests should now pass:

2 passed in 0.XXs

Boom! You've just built a basic API endpoint using Test-Driven Development.


🧹 Optional: Add More Features

You can follow the same cycle for:

  • Listing all todos
  • Deleting a todo
  • Marking a todo as complete

Each time, write a failing test, write the minimum code, then refactor.


📚 Final Thoughts

Using TDD with FastAPI:

  • Helps you write clean, testable code
  • Gives you confidence while refactoring
  • Makes onboarding easier for teams

🚀 Next Steps

  • Add a database (SQLite or PostgreSQL)
  • Use SQLAlchemy or Tortoise ORM
  • Use pytest fixtures for setup/teardown
  • Deploy using Docker or Heroku

💬 Got Questions?

Drop your comments or questions below. Happy coding!

LIVE MENTORSHIP ONLY 5 SPOTS

Laravel Mastery
Coaching Class Program

KritiMyantra

Transform from beginner to Laravel expert with our personalized Coaching Class starting June 20, 2025. Limited enrollment ensures focused attention.

Daily Sessions

1-hour personalized coaching

Real Projects

Build portfolio applications

Best Practices

Industry-standard techniques

Career Support

Interview prep & job guidance

Total Investment
$200
Duration
30 hours
1h/day

Enrollment Closes In

Days
Hours
Minutes
Seconds
Spots Available 5 of 10 remaining
Next cohort starts:
June 20, 2025

Join the Program

Complete your application to secure your spot

Application Submitted!

Thank you for your interest in our Laravel mentorship program. We'll contact you within 24 hours with next steps.

What happens next?

  • Confirmation email with program details
  • WhatsApp message from our team
  • Onboarding call to discuss your goals

Comments

No comments yet. Be the first to comment!

Please log in to post a comment:

Sign in with Google

Related Posts