Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

테스트

시험 더블과 운영 백엔드가 다르면, 실제 백엔드로 도는 시험을 하나는 둔다

인메모리 레이어·SQLite·가짜 큐와 실제 구현의 차이에서만 나는 버그는 단위 시험이 못 잡는다. 핵심 경로 하나는 운영과 같은 백엔드로 돌린다.

시험은 전부 통과했는데 운영에서만 메시지가 안 오거나 쿼리가 다르게 동작한다. 원인을 찾고 보면 시험에서 쓰던 인메모리 채널 레이어, SQLite, 가짜 큐가 실제 Redis·Postgres·브로커와 미묘하게 다르게 동작하는 곳이었다.

시험 더블은 빠르고 편하지만, 실제 구현의 동시성·잠금·정렬·타입 규칙까지 흉내 내지는 않는다. 그 차이에서만 나는 버그는 더블로 도는 시험으로는 영원히 잡히지 않는다.

대부분의 시험은 빠른 더블로 두고, 핵심 경로 하나는 실제 백엔드로 돌린다. 로컬에 그 백엔드가 없으면 건너뛰게 해서 개발 흐름을 막지 않는다. CI에는 실제 백엔드를 띄워 항상 돌게 한다.

import os
import pytest

REDIS_URL = os.environ.get("TEST_REDIS_URL")

@pytest.mark.skipif(not REDIS_URL, reason="실제 Redis가 없으면 건너뛴다")
async def test_group_message_reaches_background_listener(settings):
    settings.CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {"hosts": [REDIS_URL]},
        }
    }
    ...

버그를 고칠 때 「왜 시험이 이걸 못 잡았나」를 함께 답한다. 답이 「더블이 실제와 달라서」라면, 그 경로를 실제 백엔드로 도는 시험을 하나 더한다.

문의 →