엔드 투 엔드 (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_item 및 test_e2e_list_items는 E2E 테스트로 전체 애플리케이션을 테스트합니다.
•
test_edge_to_edge_update_and_get_item는 두 엔드포인트 사이의 상호작용을 테스트하는 엣지 투 엣지 테스트입니다