쉬운·기술사전비유로 이해하는 AI·개발 용어
배포와 운영

테스트 / 유닛 테스트

Test / Unit Test

지금 작성한 코드가 오늘만이 아니라 다음 변경 이후에도 계속 제대로 작동한다는 걸 어떻게 알 수 있을까요.

테스트 / 유닛 테스트 개념 다이어그램

지금 작성한 코드가 오늘만이 아니라 다음 변경 이후에도, 그 다음 변경 이후에도 여전히 잘 작동한다는 걸 어떻게 알 수 있을까요. 매번 전부 손으로 다시 확인하지는 않잖아요. 테스트를 한 번 작성해두면 그 이후로는 테스트가 대신 영구적으로 확인해줘요.

테스트란 다른 코드를 실행하고 그 결과가 올바른지 확인하는 것이 유일한 역할인 작은 코드 조각이에요. 유닛 테스트는 가장 일반적인 유형으로, 보통 단일 함수 하나를 독립적으로 검사해요. 특정 입력을 주고 기대한 출력이 나오는지 확인하는 거예요. 맞으면 테스트가 통과돼요. 틀리면 크게 실패 신호를 내고 무엇이 잘못됐는지 정확히 가리켜줘요.

연기 감지기가 딱 맞는 비유예요. 한 번 설치하면 잊어버려도 돼요. 아무 일도 없으면 조용히 대기하다가 무언가 잘못되는 순간 경보를 울려요. 테스트는 코드가 해야 하는 특정 동작 하나에 대한 연기 감지기예요. 한 번 작성해두면 그 이후로는 그 동작을 무료로 감시해줘요. 누군가 그것을 망가뜨리는 순간 즉시 울려요. 미래의 내가 망가뜨려도 마찬가지예요.

비개발자에게 와닿게 설명하면 이렇게 볼 수 있어요. 소프트웨어에서 무서운 건 새 코드를 작성하는 일이 아니에요. 기존 코드를 수정하다가 세 단계 떨어진 곳의 무언가를 망가뜨렸다는 사실을 모르는 거예요. 하나를 고치면서 이전에 잘 작동하던 다른 무언가를 조용히 부숴버리는 거죠. 테스트는 그에 대한 방어막이에요. 테스트 벽을 세워두면, 변경하고 테스트를 실행했을 때 초록색 통과는 "내가 테스트로 확인한 모든 것이 여전히 작동한다"는 의미예요. 빨간색 실패는 "방금 이것을 망가뜨렸으니 확인하라"는 의미고요. 한 가지 솔직한 한계도 있어요. 테스트는 지정해둔 것만 감시해요. 초록색은 테스트한 것들이 여전히 작동한다는 뜻이지 아무것도 망가지지 않았다는 뜻이 아니에요. 그래서 실질적인 안전망은 좋은 테스트를 많이 갖추는 것이지 하나만 갖추는 게 아니에요.

AI가 코드를 작성할 때 테스트가 중요한 진짜 이유도 여기에 있어요. AI는 코드를 빠르게 많이 생성할 수 있고, 동시에 자신 있게 것들을 빠르게 망가뜨릴 수도 있어요. 테스트는 AI를 정직하게 유지하는 방법이에요. AI가 변경을 가하고 테스트가 실행되면, 커버하고 있는 무언가를 망가뜨렸을 경우 배포 전에 잡아낼 수 있어요. eval(AI의 판단을 위한)과 테스트(코드 동작을 위한)를 함께 쓰는 것이 눈 감고 달리지 않으면서 빠르게 나아가는 방법이에요.

그래서 "테스트가 있는가?"와 "테스트가 통과하는가?"를 풀어 말하면 이렇게 돼요. 실제로 작동한다는 걸 확인하는 작은 트리거들이 있는가, 그리고 그것들이 여전히 초록색인가. 이건 형식적인 절차가 아니에요. 크고 복잡한 코드베이스를 숨죽이지 않고 변경할 수 있게 해주는 거예요. 좋은 테스트 덕분에 변경이 두려움이 아니라 안심으로 느껴져요.

테스트는 한 번 설치해두는 트리거로, 코드가 망가지는 순간 즉시 알려줘요. 미래의 내가 망가뜨려도, AI가 망가뜨려도 마찬가지예요. "될 것 같다"가 "확인했으며 테스트한 것들은 여전히 작동한다"가 되는 방법이에요. 누구든 소프트웨어를 두려움 없이 변경할 수 있게 해주는 방법이기도 하고요.