Porta
테스트를 늘리기 전에 리스크 맵부터 만든 이유

엔지니어링

테스트를 늘리기 전에 리스크 맵부터 만든 이유

테스트 개수보다 먼저 중요한 건 어떤 경로가 실제로 위험한지였고, Porta는 그 우선순위부터 문서로 고정했어요.

테스트 품질 이야기는 추상적으로 흐르기 쉬워요. 테스트를 더 추가하자, 커버리지를 올리자, 회귀를 더 빨리 잡자 같은 말은 모두 맞지만 충분하지는 않아요.

하지만 제품 안에 auth, billing, webhook, streaming, 외부 API 호출이 같이 들어오기 시작하면, 단순한 테스트 개수는 좋은 계획 도구가 되지 못해요.

그래서 Porta는 또 한 번 넓게 테스트를 늘리기 전에, 먼저 리스크 맵을 만들었어요.

중요한 질문은 테스트 개수가 아니었다

여기서 유용했던 질문은 "테스트가 몇 개인가?"가 아니었어요.

진짜 중요한 질문은 이거였어요.

"현재 테스트가 놓쳤을 때 제품에 가장 크게 아픈 실패는 무엇인가?"

이 질문으로 바꾸면 대화가 달라져요. Mock 기반 happy-path 테스트 하나와 DB-backed idempotency 테스트 하나는 같은 "1개의 테스트"로 보일 수 있지만, 줄여주는 리스크는 전혀 달라요.

맵은 프레임워크가 아니라 요청 흐름에서 시작했다

먼저 도움이 됐던 건 위험한 영역을 제품 언어로 다시 쓰는 일이었어요.

  • auth와 authorization
  • billing consume와 idempotency
  • webhook deduplication
  • external API resilience
  • abuse와 rate limiting

이 프레이밍이 중요한 이유는 테스트를 모듈이 아니라 실패 모드에 연결해 주기 때문이에요.

"이 router 테스트를 더 늘려야 한다"가 아니라, "이 경로는 중복 과금, 권한 누수, 동시성 경합을 일으킬 수 있다"라고 말할 수 있게 돼요.

훨씬 더 좋은 우선순위 언어이에요.

P0 경로에는 DB-backed integration test를 먼저 붙였다

맵이 명시되자 첫 투자처도 분명해졌어요.

가장 위험한 흐름은 mock가 실제 문제를 가릴 수 있는 곳들이었어요.

  • owner와 admin의 접근 차이
  • billing request_id 중복 처리
  • webhook receipt 고유성
  • 실제 insert와 timestamp에 의존하는 rate-limit window

이런 곳은 DB가 단순한 저장소가 아니라, 동작 자체의 일부예요.

그래서 전략은 자연스럽게 이렇게 정리됐어요.

"위험한 경로부터 DB-backed integration test로 옮긴다."

같은 가정을 반복하는 mock 테스트를 더 쌓는 것보다 훨씬 의미 있는 방향이었어요.

PR 체인이 작업을 더 검토 가능하게 만들었다

리스크 맵에서 특히 좋았던 건 PR tracker였어요.

각 단계마다:

  • 범위가 좁고
  • 상태가 있고
  • 어떤 리스크를 줄였는지 한 문장으로 적혀 있어요

행정적으로 보일 수 있지만, 실제로는 꽤 강한 엔지니어링 도구예요.

작업을 검토 가능하게 만들고, 테스트 개선 작업이 하나의 모호한 "품질 향상 브랜치"로 커지는 걸 막고, 각 테스트 묶음이 왜 존재하는지 설명하게 만들어요.

이 접근은 production code를 덜 비틀게 했다

테스트 개선 작업에는 함정이 있어요.

계획이 너무 커지면 production code가 harness에 맞춰 휘기 시작해요.

여기서 더 좋은 결과는 더 보수적인 방식이었어요.

  • production 동작은 명시적으로 유지하고
  • 리스크가 큰 곳에만 real DB fixture를 쓰고
  • 불안정한 외부 시스템만 mock하고, 핵심 내부 로직은 그대로 검증하는 것

빠르게 움직이는 제품에서 테스트 스위트를 키우는 데는 이런 방식이 더 건강해요.

실제로 바뀌는 건 테스트만이 아니에요

리스크 맵은 테스트 파일 정리표 이상이었어요.

팀이 자신감을 말하는 방식 자체도 바꿔요.

"테스트가 꽤 넓다" 대신 아래처럼 말할 수 있기 때문이에요.

  • auth와 project access는 DB-backed matrix로 확인한다
  • billing deduplication은 실제 uniqueness 제약 아래에서 본다
  • webhook duplication race는 harness에 들어가 있다
  • rate-limit window는 저장된 이벤트 기준으로 본다

이쪽이 훨씬 더 날카롭고, 설명 가능한 자신감이에요.

마무리

테스트가 많다고 자동으로 좋은 건 아니에요. 리스크를 더 줄여야 좋은 거예요.

Porta에서는 맵을 먼저 쓴 덕분에, 제품이 실제로 취약한 곳에 테스트 비용을 더 정확히 쓸 수 있었어요.

나중에 도구가 바뀌더라도, 이 순서만큼은 계속 남길 가치가 있어요.