회고EthiBot

값의 자리를 바꿔 넣어도 테스트가 전부 통과했다

코스닥 종목이 코스피 기준 손절선을 받던 결함을 고치고 테스트까지 붙였다. 그런데 두 시장의 값 자리를 서로 바꿔 넣어도 테스트는 전부 통과했다. 테스트를 늘리는 대신 틀릴 수 없는 모양으로 바꿨다.
📅 2026.10.08⏱ 읽기 약 4분
EthiLab오늘 시장과 종목의 위치돈이 몰린 테마와 종목의 위치를 웹에서 확인하세요바로가기 →

코스닥 종목이 코스피 손절선을 받고 있었다

EthiBot은 종목을 사면 그 자리에서 익절선과 손절선을 정한다. 폭은 시장 국면을 보고 고르는데, 코스피와 코스닥의 국면을 따로 판단하므로 같은 시각에도 두 시장의 폭이 다를 수 있다.

결함은 주문 체결을 그 자리에서 확인하지 못한 경우에 있었다. 체결은 나중에 따로 확인해 포지션을 만드는데, 이 경로에서 종목이 어느 시장 소속인지가 빠졌다. 시장이 비어 있으면 코스피로 취급하는 규칙 때문에 코스닥 종목도 코스피 국면의 폭을 받았다.

고치는 방법은 단순했다. 주문을 낼 때 시장을 함께 기록해 두고, 나중에 체결을 확인할 때 그 값으로 시장별 폭을 고르면 된다. 코스닥 종목이면 코스닥 값, 코스피 종목이면 코스피 값이 나오는지 확인하는 테스트도 붙였다.

리뷰에서 값의 자리를 바꿔 넣어 봤다

리뷰에서 테스트가 정말 이 결함을 막는지 확인하려고 일부러 코드를 틀리게 바꿔 봤다. 포지션을 만드는 함수를 부르는 줄에서 코스닥 값이 들어갈 자리에 코스피 값을 넣었다. 고치기 전의 결함을 그대로 되살린 셈이다.

테스트는 전부 통과했다.

테스트가 확인한 것은 "시장별 값을 받으면 올바른 쪽을 고르는가"였다. 함수 안의 선택 로직은 맞았고 테스트도 그 부분은 잘 잠갔다. 그런데 그 함수에 어떤 값을 넣어 부르는가는 아무 테스트도 보지 않았다.

같은 모양의 실수를 컴파일러가 막지 못했다

함수는 숫자 네 개를 나란히 받았다. 코스피 익절 폭, 코스피 손절 폭, 코스닥 익절 폭, 코스닥 손절 폭. 넷 다 같은 종류의 숫자라서 순서가 뒤섞여도 컴파일러는 아무 말을 하지 않는다. 사람이 보기에도 한 줄에 숫자 넷이 나란히 있으면 어느 것이 어느 자리인지 쉽게 놓친다.

같은 날 같은 형태가 세 번 더 나왔다. 판단하는 함수는 테스트로 잠겼는데, 그 함수를 부르는 쪽은 비어 있었다. 거래소나 앱 실행 환경과 이어져 있어 테스트에서 그대로 돌리기 어려운 줄들이었다.

테스트를 늘리지 않고 모양을 바꿨다

처음 떠오른 처방은 부르는 쪽까지 확인하는 테스트를 더 쓰는 것이었다. 하지만 그 테스트도 같은 숫자 네 개를 나란히 넘기면 같은 실수를 할 수 있다.

그래서 값을 넘기는 모양을 바꿨다. 숫자 네 개를 따로 넘기지 않고 "코스피 몫"과 "코스닥 몫"이라는 이름이 붙은 묶음 하나로 넘긴다. 쓰는 쪽도 "이 종목의 시장 몫을 달라"고만 요청한다. 이제 코스닥 자리에 코스피 값을 넣으려면 이름부터 틀리게 적어야 하고, 그런 줄은 읽는 순간 눈에 띈다. 자리만 바뀌는 실수는 아예 만들 수 없다.

💡 같은 종류의 값을 여러 개 나란히 받는 함수는 자리 바꿈을 막지 못한다. 테스트를 하나 더 쓰기 전에, 값에 이름을 붙여 묶을 수 있는지 먼저 본다. 틀릴 수 없는 모양이 틀림을 잡는 테스트보다 싸다.

남은 것

테스트가 통과했다는 것은 "이 테스트가 이 실수를 잡는다"는 뜻이 아니다. 실수를 일부러 넣어 봤을 때 실패하는 테스트만 그 실수를 막는다. 넣어 보기 전에는 모른다.

판단하는 함수와 그 함수를 부르는 줄은 따로 확인한다. 함수가 옳아도 엉뚱한 값을 받으면 결과는 틀린다. 이날 일부러 틀리게 바꿔도 테스트가 통과한 네 곳은 전부 부르는 쪽이었다.

자리가 뜻을 정하는 값은 이름을 갖게 한다. 순서로만 구분되는 값은 언젠가 순서가 틀린다.

오늘 시장과 종목의 위치는 EthiLab에서 볼 수 있습니다.