개발 slecs

주문 컨트롤러 공급 유형 테스트의 사전 결함 7건 수정

목차

테스트 코드에서 사전 결함 7건을 정정했다. 정확히는 OrderControllerSupplyTypeTest — 공급 유형별 주문 흐름을 검증하는 컨트롤러 테스트 파일에서 발견된 버그들.

왜 테스트 코드의 "사전 결함"이 심각한가

흔히 테스트 코드는 "동작하는 코드 옆에 있는 보조 파일" 정도로 가볍게 여기는 경우가 있다. 하지만 팀을 이끌면서 늘 강조하는 건, 테스트 코드의 결함은 프로덕션 결함보다 어떤 의미에서 더 위험하다는 것이다.

이유는 단순하다. 결함 있는 테스트는 거짓 안전감을 준다. 빨간불이 켜져야 할 상황에 초록불이 켜지거나, 반대로 멀쩡한 로직인데 계속 실패를 뱉어내면서 팀 전체의 CI 신뢰도를 갉아먹는다. 특히 OrderControllerSupplyTypeTest처럼 공급 유형이라는 비즈니스 분기가 복잡한 영역을 다루는 테스트라면, 결함이 7건씩 쌓여 있다는 건 그 테스트 스위트 전체가 사실상 "있으나 마나" 상태였다는 뜻이다.

"사전 결함"이라는 표현도 중요하다. 단순히 assert가 틀린 게 아니라, 테스트가 실행되기도 전에 — setUp, 픽스처 구성, Mock 세팅, 의존성 주입 등 — 어딘가에서 이미 망가져 있는 상태. 이런 결함은 발견하기도 귀찮고, 고치기도 지저분하다. 그래서 미뤄지는 경우가 많다.

어떤 유형의 결함들이었나

7건이라는 숫자는 단순 오타 수정이 아니라, 꽤 조직적으로 훑어야 나오는 수치다. OrderControllerSupplyTypeTest 하나의 파일에서 이 정도가 나왔다면, 아마 아래 유형들이 복합적으로 섞여 있었을 가능성이 높다.

결함 유형 설명 발생 빈도
Mock 설정 누락 또는 오타 @MockBean 주입 후 when() 체인이 실제 메서드 시그니처와 불일치 많음
픽스처 데이터 타입 불일치 공급 유형 enum/코드값이 실제 도메인 모델과 달라 바인딩 실패 종종
HTTP 요청 파라미터 오기입 perform(post(...)) 에서 파라미터명이 실제 컨트롤러와 다름 많음
assert 기댓값 오류 리턴 상태코드나 JSON 경로가 실제 응답 구조와 불일치 종종
테스트 격리 미흡 테스트 간 상태가 공유되어 순서에 따라 실패/성공이 뒤바뀜 가끔

공급 유형 분기는 보통 한 컨트롤러 안에서 여러 경로를 타기 때문에, 케이스별로 별도의 테스트 메서드를 작성하다 보면 이런 누적 오류가 생기기 쉽다.

수정 작업 자체에서 배운 것

// Before: 공급 유형 코드가 하드코딩된 문자열로 들어가 있었음
mockMvc.perform(post("/order/create")
    .param("supplyType", "01")  // 실제 enum은 SupplyType.DIRECT
    .param("orderId", "TEST_001"))
    .andExpect(status().isOk());

// After: 실제 도메인 모델의 값 사용
mockMvc.perform(post("/order/create")
    .param("supplyType", SupplyType.DIRECT.getCode())
    .param("orderId", "TEST_001"))
    .andExpect(status().isOk());

이런 차이가 사소해 보이지만, 서비스 로직이 바뀌거나 enum 코드값이 리팩토링되는 순간 테스트는 조용히 깨진 채로 방치된다. 상수를 직접 참조하면 컴파일 타임에 잡힌다.

테스트 결함 정정 작업을 혼자 묵묵히 하는 것도 좋지만, 팀 차원에서는 이 작업을 기술 부채 청산 이슈로 등록하고, 왜 7건이나 쌓였는지 원인을 짚는 게 더 중요하다. 리뷰 단계에서 테스트 파일도 동등하게 검토했는지, 테스트 작성 기준이 명문화되어 있는지.

이번 건을 계기로 테스트 파일도 PR 리뷰에서 프로덕션 코드와 동일한 기준으로 들여다보는 걸 팀 컨벤션으로 다시 한번 못 박았다. 결함 7건 정정보다 이게 더 의미 있는 산출물이라고 생각한다.

끝.

댓글 0

첫 댓글 달아줘.