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의 기능과 테스트 방법에 대해 다루어 보겠습니다.