Search

FastAPI로 살펴본 E2E 테스트 (엔드, 엣지)

엔드 투 엔드 (E2E) 테스트엣지 투 엣지 (Edge-to-Edge) 테스트
시스템을 테스트하는 방식에 따라 다르게 정의됩니다.
엔드 투 엔드 테스트: 사용자 경험을 모방하는 방식으로 전체 시스템을 테스트하는 방식입니다.
엣지 투 엣지 테스트: 엔드 투 엔드 테스트보다 범위가 작지만, 여러 컴포넌트 간의 상호작용을 포함하는 테스트입니다.
FastAPI와 pytest를 사용하여 이러한 테스트를 구현하는 방법을 보여드리겠습니다.

FastAPI와 Pytest를 사용한 엔드 투 엔드 테스트와 엣지 투 엣지 테스트 구현

FastAPI 앱 코드

우선 FastAPI 애플리케이션 코드를 작성합니다.
# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List app = FastAPI() class Item(BaseModel): name: str price: float is_offer: bool = False items = { "foo": Item(name="Foo", price=50.2, is_offer=True), "bar": Item(name="Bar", price=62.1, is_offer=False) } @app.get("/items/{item_id}", response_model=Item) async def read_item(item_id: str): if item_id not in items: raise HTTPException(status_code=404, detail="Item not found") return items[item_id] @app.put("/items/{item_id}", response_model=Item) async def update_item(item_id: str, item: Item): items[item_id] = item return items[item_id] @app.post("/items/", response_model=Item) async def create_item(item: Item): if item.name in items: raise HTTPException(status_code=400, detail="Item already exists") items[item.name] = item return item @app.get("/items/", response_model=List[Item]) async def list_items(): return list(items.values())
Python
복사

엔드 투 엔드 테스트

전체 API의 동작을 테스트하는 방식입니다.
# tests/test_e2e.py import pytest from fastapi.testclient import TestClient from app.main import app client = TestClient(app) @pytest.fixture def clear_items(): global items items = { "foo": Item(name="Foo", price=50.2, is_offer=True), "bar": Item(name="Bar", price=62.1, is_offer=False) } @pytest.mark.usefixtures("clear_items") def test_e2e_create_and_get_item(): # Create a new item response = client.post("/items/", json={"name": "Baz", "price": 70.0, "is_offer": False}) assert response.status_code == 200 assert response.json() == {"name": "Baz", "price": 70.0, "is_offer": False} # Retrieve the newly created item response = client.get("/items/Baz") assert response.status_code == 200 assert response.json() == {"name": "Baz", "price": 70.0, "is_offer": False} def test_e2e_list_items(): response = client.get("/items/") assert response.status_code == 200 assert isinstance(response.json(), list)
Python
복사

엣지 투 엣지 테스트

두 개 이상의 엔드포인트 간의 상호작용을 테스트하는 방식입니다.
# tests/test_edge_to_edge.py import pytest from fastapi.testclient import TestClient from app.main import app, items client = TestClient(app) @pytest.fixture def clear_items(): global items items = { "foo": Item(name="Foo", price=50.2, is_offer=True), "bar": Item(name="Bar", price=62.1, is_offer=False) } @pytest.mark.usefixtures("clear_items") def test_edge_to_edge_update_and_get_item(): # Update an existing item response = client.put("/items/foo", json={"name": "Foo", "price": 100.0, "is_offer": True}) assert response.status_code == 200 assert response.json() == {"name": "Foo", "price": 100.0, "is_offer": True} # Retrieve the updated item response = client.get("/items/foo") assert response.status_code == 200 assert response.json() == {"name": "Foo", "price": 100.0, "is_offer": True}
Python
복사

pytest를 사용하여 테스트 실행

테스트를 실행하기 위해서는 pytest를 사용할 수 있습니다.
pytest tests/
Shell
복사

설명

test_e2e_create_and_get_itemtest_e2e_list_items는 E2E 테스트로 전체 애플리케이션을 테스트합니다.
test_edge_to_edge_update_and_get_item는 두 엔드포인트 사이의 상호작용을 테스트하는 엣지 투 엣지 테스트입니다