
AI는 테스트 작성을 잘하지만, '무엇이 옳은지' 결정하는 것은 서툴다
요약
AI는 테스트 코드의 구조를 작성하는 데는 능숙하지만, 구현된 로직의 의도를 파악하여 올바른 기대값을 결정하는 데는 한계가 있습니다. 구현과 테스트를 동일한 AI에게 맡기면 오류를 공유하게 되므로, 테스트 케이스 도출은 AI에게 맡기되 기대값은 인간이 결정하는 역할 분담이 필요합니다.
핵심 포인트
- AI는 테스트의 형태(Syntax, Mock) 작성에는 매우 능숙함
- 구현과 테스트를 동시에 AI에게 맡기면 오류를 공유하는 위험 존재
- 테스트의 핵심은 '동작'이 아닌 '의도대로의 동작'을 검증하는 것
- AI로 테스트 케이스 리스트를 뽑고, 기대값은 인간이 직접 작성할 것
Claude Code나 Cursor, Copilot을 사용하다 보면 테스트 코드(test code)가 순식간에 생성되는 것에 놀라곤 합니다. "테스트를 작성해줘"라고 부탁하면, 그럴듯한 테스트가 대량으로 쏟아져 나옵니다.
하지만, 어떤 실패를 계기로 깨달았습니다.
AI는 테스트를 "작성하는" 것은 잘하지만, "무엇이 옳은지" 결정하는 것은 서툽니다.
이 기사에서는 그 차이가 왜 중요한지, 그리고 제가 어떻게 AI와 테스트를 분담하고 있는지를 쓰고자 합니다.
어떤 기능의 구현(implementation)과 테스트를 동일한 AI에게 연속해서 부탁했습니다. 구현을 생성하게 하고, 그 흐름에서 "이 구현의 테스트를 작성해줘"라고 부탁한 것입니다.
결과적으로 테스트는 모두 그린(green) 상태로 통과했습니다. 안심하고 머지(merge)했지만, 나중에 버그가 발견되었습니다.
원인은 다음과 같습니다.
- 구현에는 로직(logic)의 오류가 있었다
- AI는 그 잘못된 구현에 맞춰서 테스트의 기대값(expected value)을 작성했다
- 그래서 구현도 테스트도 서로 "옳다"고 말하며 둘 다 통과해 버렸다
💡 틀린 답안을 틀린 모범 답안으로 채점하고 있었던 것과 같습니다. 양쪽 모두 같은 착각을 하고 있기 때문에 영원히 알아챌 수 없습니다.
여기에 AI와 테스트의 본질적인 문제가 있습니다.
테스트에는 두 가지 서로 다른 작업이 포함되어 있습니다.
| 작업 | 내용 | AI의 숙련도 |
|---|---|---|
| 테스트 작성 | 테스트의 구조·기법·모크(mock)를 준비함 | 매우 잘함 |
| 기대값 결정 | "올바른 결과는 무엇인가"를 판단함 | 서툽 |
AI는 전자인, 즉 테스트의 형태를 만드는 것은 매우 잘합니다. 구문(syntax)도 정돈되어 있고, 모크(mock)를 구성하는 방법도 알고 있습니다.
하지만 후자인, **"이 입력에 대한 올바른 출력은 무엇인가"**를 결정하는 것은 본래 그 코드의 사양(specification)을 이해하고 있는 인간의 일입니다. AI는 사양의 진정한 의도를 모르기 때문에, 눈앞에 있는 코드의 동작을 그대로 흉내 내어 기대값을 채우기 쉽습니다.
동작을 흉내 낸 기대값은, 구현이 틀려 있다면 그 틀린 부분까지 그대로 복사해 버립니다.
애초에 테스트는 무엇을 위해 존재하는 것일까요?
테스트의 가치는 "코드가 동작하는 것"을 확인하는 것이 아닙니다. "코드가 의도한 대로 동작하는 것"을 확인하는 것입니다.
- 동작하는지 여부 → 실행하면 알 수 있음
- 의도대로인지 여부 → 의도를 알고 있는 사람만이 알 수 있음
AI에게 기대값까지 맡기면, 이 "의도" 부분이 누락됩니다. 테스트는 잔뜩 있지만, 정말로 지키고 싶은 것을 지키지 못하는 상태가 됩니다.
이 실패 이후, 저는 테스트 작업을 나누기로 했습니다.
"이 함수에 대해 테스트해야 할 케이스를 뽑아줘"라고 부탁합니다.
AI는 여기서 힘을 발휘합니다. 스스로는 놓치기 쉬운 이상계(abnormal case)를 제시해 주기 때문입니다.
- 빈 입력 (empty input)
- 상한·하한 값
- 예상치 못한 타입 (unexpected type)
- 동시 실행(concurrency)이나 중복
"무엇을 테스트해야 하는가"의 리스트 만들기는 AI의 지식량이 빛을 발하는 장면입니다.
뽑아낸 케이스들에 대해, "올바른 결과는 무엇인가"는 스스로 결정합니다.
이 부분을 인간이 수행함으로써, 구현이 틀려 있으면 테스트가 실패하는 본래의 관계를 되찾을 수 있습니다. 구현과 테스트가 서로 다른 관점에서 만들어지기 때문에 모순이 표면화됩니다.
이것이 가장 중요할지도 모릅니다. 구현을 작성한 AI에게 그대로 테스트를 쓰게 하면, 같은 착각을 공유하게 됩니다.
- 구현과 테스트의 생성을 분리한다
- 혹은 기대값만큼은 반드시 인간이 작성한다
이렇게 하는 것만으로도, "둘 다 그린인데 틀려 있는" 사고는 상당히 줄었습니다.
- AI는 테스트를 작성하는 것은 잘하지만, 무엇이 옳은지를 결정하는 것은 서툴다
- 구현과 테스트를 동일한 AI에게 연속해서 쓰게 하면, 틀린 부분까지 일치하여 둘 다 통과한다
- 테스트의 가치는 "동작하는 것"이 아니라 "의도대로 동작하는 것"의 확인에 있다
- 따라서 관점 도출은 AI에게, 기대값은 인간에게 나누는 것이 유효하다
AI에 의해 테스트를 작성하는 비용은 극적으로 낮아졌습니다. 그렇기에 인간이 담당해야 할 부분이 "무엇이 옳은지를 결정하는 것"으로 좁혀져 온 것이라고 생각합니다.
테스트를 작성하는 속도에 안심하지 말고, "이 기대값은 정말로 옳은가"를 자신의 머리로 한 번 더 되물어보는 것. 이것이 AI 시대의 테스트와 함께하는 방법이라고 느끼고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기