PHpullh

PYTHON · 테스트

통합 테스트

여러 컴포넌트의 상호작용을 검증하는 통합 테스트 패턴입니다.

테스트고급integration통합 테스트검증fixture

핵심 설명

여러 컴포넌트의 상호작용을 검증하는 통합 테스트 패턴입니다.

Python code

import pytest

# 테스트할 시스템
class UserRepository:
    def __init__(self):
        self._store = {}
        self._next_id = 1
    def save(self, data):
        data["id"] = self._next_id
        self._store[self._next_id] = data
        self._next_id += 1
        return data
    def find(self, uid):
        return self._store.get(uid)

class EmailService:
    def __init__(self):
        self.sent = []
    def send(self, to, subject):
        self.sent.append({"to": to, "subject": subject})

class UserService:
    def __init__(self, repo, email):
        self.repo = repo
        self.email = email
    def register(self, name, email):
        user = self.repo.save({"name": name, "email": email})
        self.email.send(email, f"환영합니다 {name}님!")
        return user

# 통합 테스트 (실제 객체 사용)
@pytest.fixture
def user_system():
    repo = UserRepository()
    email = EmailService()
    service = UserService(repo, email)
    return {"service": service, "repo": repo, "email": email}

def test_registration_flow(user_system):
    svc = user_system["service"]
    user = svc.register("Alice", "alice@test.com")

    # 저장 확인
    saved = user_system["repo"].find(user["id"])
    assert saved["name"] == "Alice"

    # 이메일 발송 확인
    emails = user_system["email"].sent
    assert len(emails) == 1
    assert emails[0]["to"] == "alice@test.com"
    print("통합 테스트 통과!")

# 직접 실행
system = {"service": UserService(UserRepository(), EmailService()),
          "repo": UserRepository(), "email": EmailService()}
system["service"] = UserService(system["repo"], system["email"])
test_registration_flow(system)

학습 팁

통합 테스트는 단위 테스트보다 느리므로 CI에서 별도 스테이지로 분리하세요.

주의할 점

통합 테스트에서 외부 서비스(실제 DB, API)에 의존하면 불안정해집니다. 테스트용 인프라를 사용하세요.

자주 묻는 질문

통합 테스트란 무엇인가요?

여러 컴포넌트의 상호작용을 검증하는 통합 테스트 패턴입니다.

통합 테스트 학습 시 주의할 점은 무엇인가요?

통합 테스트에서 외부 서비스(실제 DB, API)에 의존하면 불안정해집니다. 테스트용 인프라를 사용하세요.