← 홈Setup Tip

Setup Tip

Setup Tip — 호출하는 곳이 없는 새 함수는 아무것도 바꾸지 않는다

기능 PR이 새 모듈과 그 모듈의 단위 테스트를 추가했고 CI도 초록이라면, 머지 전에 한 가지를 더 확인하라. 새로 export한 함수를 실제 실행 경로에서 부르는 곳이 있는가. 호출처가 0이면 테스트는 함수가 맞게 동작한다는 것만 증명할 뿐, 제품의 동작은 한 줄도 바뀌지 않았다.

상황

"무거운 작업을 띄우기 전에 호스트 부하를 확인하고 과부하면 기다리게 하라"는 이슈가 있다. 작업자가 PR을 올린다. 새 파일에 부하 판정 함수가 깔끔하게 들어 있고, 임계값과 경계 조건을 확인하는 단위 테스트도 함께 있다. CI는 초록이고, 작업자는 "준비 완료, 이슈를 닫아도 된다"고 보고한다.

흔한 착각

diff에 새 함수와 테스트가 있고 테스트가 통과하니 기능이 들어갔다고 읽는다. 리뷰는 함수 안의 로직이 맞는지, 테스트가 경계값을 덮는지에 집중한다. 그 함수가 제품 안 어디에서 불리는지는 diff에 보이지 않으니 자연스럽게 질문에서 빠진다.

실제로 일어난 일

저장소 전체를 검색하니 새 함수를 import하는 곳은 그 테스트 파일 하나뿐이었다. 작업을 띄우는 실제 경로는 전혀 바뀌지 않았다. 머지했다면 이슈는 "해결됨"으로 닫히고, 호스트는 예전과 똑같이 과부하 상태에서 작업을 띄웠을 것이다. 테스트는 거짓말을 하지 않았다. 다만 함수가 맞다는 것과 제품이 그 함수를 쓴다는 것은 다른 주장이다.

무엇을 확인해야 하는가

PR이 새로 export한 이름마다 테스트 폴더를 뺀 소스에서 참조를 센다. 예: git grep -n 'newFunctionName' -- src ':!*.test.*'. 정의한 줄만 나오면 호출처가 0이다. 이슈가 말한 동작이 일어나는 진입점(작업 실행, 요청 처리, 시작 훅 등)을 하나 골라, 그 경로에서 새 함수까지 호출이 실제로 이어지는지 따라가 본다.

고치는 방향

함수를 실제 진입점에 연결하고, 연결 자체를 확인하는 테스트를 하나 더 둔다. 단위 테스트는 함수를 직접 부르지만, 이 테스트는 진입점을 통해 들어가서 과부하 조건에서 실행이 기다리는지를 본다. 연결 코드를 지우면 이 테스트가 실패해야 한다. 실패하지 않는다면 그 테스트도 연결을 증명하지 못한다.

확인 방법

머지 전에 세 가지를 적는다. 새 export마다 테스트 밖 호출처 수, 진입점 테스트 이름, 연결 코드를 뺐을 때 그 테스트가 실패했는지. 호출처가 0인 export가 남아 있거나 진입점 테스트가 연결 없이도 통과한다면, 그 PR은 아직 이슈를 닫지 못한다.