FastAPI 서버개발, pytest를 이용한 단위 테스트 및 통합 테스트

FastAPI는 현대의 빠르고 간결한 웹 애플리케이션 서버를 개발하기 위한 프레임워크입니다. Python 3.7 이상에서 사용할 수 있으며, 비동기 프로그래밍을 지원하여 높은 성능을 자랑합니다. 이번 글에서는 FastAPI를 이용해 간단한 서버를 개발하고, pytest를 사용한 단위 테스트 및 통합 테스트 방법에 대해 심층적으로 다뤄 보겠습니다.

1. FastAPI 개요

FastAPI는 비동기 웹 서버 개발에 최적화된 Python 프레임워크로, RESTful API를 쉽게 구축할 수 있는 기능을 제공합니다. 데이터 검증, 문서화, 의존성 주입 등의 기능을 내장하고 있어, 능률적인 개발을 가능하게 합니다.

1.1. FastAPI의 주요 특징

  • 고속: ASGI 서버를 기반으로 비동기 처리가 가능하여 높은 성능을 자랑합니다.
  • 자동 문서화: Swagger UI 및 ReDoc을 통해 API 문서를 자동으로 생성합니다.
  • 데이터 검증: Pydantic을 이용하여 데이터의 유효성을 검사할 수 있습니다.
  • 확장성: 커스터마이징이 용이하며, 다른 프레임워크와의 통합이 쉽습니다.

2. FastAPI 서버 구축

이제 FastAPI를 사용하여 간단한 RESTful API 서버를 만들어 보겠습니다. 이 예제에서는 사용자 정보를 관리하는 API를 구축할 것입니다.

2.1. FastAPI 설치하기

pip install fastapi uvicorn

2.2. API 코드 작성하기

다음은 사용자 정보를 다루는 API의 샘플 코드입니다. 이 코드는 GET, POST, PUT, DELETE 메소드를 지원합니다.

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    age: int

users = []

@app.post("/users/", response_model=User)
def create_user(user: User):
    users.append(user)
    return user

@app.get("/users/", response_model=List[User])
def read_users():
    return users

@app.get("/users/{user_id}", response_model=User)
def read_user(user_id: int):
    return next((user for user in users if user.id == user_id), None)

@app.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, user: User):
    for i, u in enumerate(users):
        if u.id == user_id:
            users[i] = user
            return user
    return None

@app.delete("/users/{user_id}")
def delete_user(user_id: int):
    global users
    users = [user for user in users if user.id != user_id]
    return {"message": "User deleted successfully"} 

2.3. 실행하기

서버를 실행하기 위해 다음 명령어를 입력합니다.

uvicorn main:app --reload

이제 http://127.0.0.1:8000/docs를 통해 Swagger UI에서 API를 테스트할 수 있습니다.

3. 테스트하기

이제 작성한 API를 테스트하기 위해 pytest를 사용하겠습니다. pytest는 Python의 강력한 테스트 프레임워크로, 간단하고 우아한 문법으로 테스트를 작성할 수 있습니다.

3.1. pytest 설치하기

pip install pytest httpx

3.2. 테스트 코드 작성하기

다음은 FastAPI 서버에 대한 단위 테스트 및 통합 테스트 샘플 코드입니다.

from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_create_user():
    response = client.post("/users/", json={"id": 1, "name": "Alice", "age": 30})
    assert response.status_code == 200
    assert response.json() == {"id": 1, "name": "Alice", "age": 30}

def test_read_users():
    response = client.get("/users/")
    assert response.status_code == 200
    assert len(response.json()) == 1

def test_read_user():
    response = client.get("/users/1")
    assert response.status_code == 200
    assert response.json() == {"id": 1, "name": "Alice", "age": 30}

def test_update_user():
    response = client.put("/users/1", json={"id": 1, "name": "Bob", "age": 25})
    assert response.status_code == 200
    assert response.json() == {"id": 1, "name": "Bob", "age": 25}

def test_delete_user():
    response = client.delete("/users/1")
    assert response.status_code == 200
    assert response.json() == {"message": "User deleted successfully"}

    response = client.get("/users/")
    assert len(response.json()) == 0

3.3. 테스트 실행하기

작성한 테스트를 실행하기 위해 다음 명령어를 입력합니다.

pytest

테스트가 성공적으로 진행된다면 문제없이 FastAPI 서버가 잘 작동하고 있다는 것입니다. 각 테스트 케이스는 API의 각 기능을 검증하고 있습니다.

4. 결론

이번 포스트에서는 FastAPI를 사용하여 간단한 RESTful API 서버를 구축하고, pytest를 이용하여 단위 테스트 및 통합 테스트를 수행하는 방법에 대해 알아보았습니다. FastAPI는 간편하면서도 강력한 기능을 제공하므로, 복잡한 애플리케이션을 개발하더라도 안정적인 서비스 운영이 가능합니다. 다음 포스트에서 더 많은 FastAPI의 기능과 테스트 방법에 대해 다루어 보겠습니다.