게임 회사에서 테스트 주도 개발은 만능 해법이 아니라 적용 범위를 가르는 습관에 가깝다

테스트 주도 개발은 코드를 먼저 쓰고 나중에 검증하는 방식이 아니라, 작은 실패 테스트를 먼저 만들고 그 테스트를 통과시키는 방향으로 구현을 진행하는 개발 습관이다. 영어 약자로는 TDD라고 부른다. 이 방식은 웹 서비스나 라이브러리 이야기에서 자주 등장하지만, 게임 회사에서는 늘 같은 반응이 나온다. “렌더링도 있고, 입력도 있고, 엔진 의존성도 큰데 이걸 그대로 적용할 수 있나?”라는 질문이다.
답은 보통 “전부는 아니지만, 분명히 적용할 수 있다”에 가깝다. 게임 전체를 테스트 먼저 만드는 것은 어렵지만, 게임 안에도 순수 로직, 데이터 변환, 규칙 판정, 저장 형식, 툴링 코드처럼 테스트가 잘 맞는 층이 분명히 존재한다.
왜 게임에서는 TDD가 어렵게 느껴질까
게임은 화면, 입력 장치, 프레임 진행, 에셋 로딩, 물리, 네트워크처럼 서로 얽힌 요소가 많다. 이런 시스템은 엔진 상태와 자산 준비 상황에 크게 의존하기 때문에 작은 단위 테스트를 만들기가 쉽지 않다. 여기에 빠른 프로토타입 문화까지 겹치면 팀은 “일단 돌아가게 만든 뒤 직접 플레이해 보자”는 흐름으로 가기 쉽다.
이 판단 자체가 틀린 것은 아니다. 실제 플레이 감각은 자동 테스트만으로 대체할 수 없다. 다만 여기서 흔히 생기는 실수는 “게임은 테스트가 안 된다”는 결론으로 바로 넘어가는 것이다. 정확한 표현은 “게임의 어떤 층은 자동 테스트가 잘 맞고, 어떤 층은 수동 검증이 더 중요하다”에 가깝다.
유니티와 언리얼도 이미 그 구분을 전제로 도구를 제공한다
유니티 테스트 프레임워크는 편집 모드 테스트와 플레이 모드 테스트를 나눠 제공한다. 편집 모드 테스트는 에디터 환경에서 빠르게 실행되며, 순수 로직이나 데이터 검증에 적합하다. 플레이 모드 테스트는 실제 런타임에 가까운 상태에서 동작을 확인할 수 있다. 이 구분 자체가 곧 “모든 테스트를 같은 방식으로 하지 않는다”는 뜻이다.
언리얼도 자동화 테스트 프레임워크와 가운틀릿 같은 도구를 통해 C++ 테스트, 기능 테스트, 빌드 파이프라인 수준의 검증을 지원한다. 즉 대형 게임 엔진들도 테스트를 포기한 것이 아니라, 계층별로 다른 검증 방식을 제공하고 있다.
게임에서 테스트가 특히 잘 맞는 영역
테스트가 가장 잘 맞는 영역은 보통 게임성을 직접 느끼는 연출층보다, 그 아래의 규칙과 데이터 층이다.
- 전투 판정 공식
- 경험치와 레벨 계산
- 아이템 드롭 테이블 검증
- 저장 데이터 직렬화와 역직렬화
- 경로 탐색, 큐, 상태 전이 같은 알고리즘
- 에디터 툴과 빌드 스크립트
이런 코드는 입력과 출력이 비교적 분명해서 테스트로 보호하기 쉽다. 반대로 카메라 감각, 애니메이션 타이밍, 연출의 좋은 느낌, 실제 손맛 같은 것은 사람이 직접 플레이하며 판단해야 하는 비중이 크다.
그래서 게임 팀에서 중요한 것은 TDD를 종교처럼 밀어붙이는 것이 아니라, 아래 같은 질문을 꾸준히 하는 습관이다.
- 이 로직은 순수 함수처럼 분리할 수 있는가
- 엔진 의존성을 얇게 만들 수 있는가
- 플레이해 보지 않고도 깨짐을 잡을 수 있는 규칙인가
- 한 번 깨지면 자주 반복해서 확인해야 하는 영역인가
TDD를 도입할 때 흔히 생기는 오해
가장 흔한 오해는 “모든 코드는 테스트부터 써야 한다”는 생각이다. 실제 프로젝트에서는 모든 코드를 그렇게 다루기 어렵다. 더 현실적인 접근은 자주 깨지고, 규칙이 복잡하고, 회귀 버그가 아픈 부분부터 테스트 습관을 심는 것이다.
또 다른 오해는 테스트가 느린 개발을 만든다는 판단이다. 초반에는 맞을 수 있다. 하지만 규칙이 누적되고 라이브 서비스가 길어질수록 테스트가 없는 팀은 작은 수정도 직접 플레이와 수동 체크에 의존하게 된다. 이때 느려지는 쪽은 테스트를 쓰는 팀이 아니라, 매번 같은 검증을 사람 손으로 반복하는 팀일 가능성이 크다.
게임 회사에서의 현실적인 적용 순서
현실적으로는 다음 순서가 잘 맞는다.
- 순수 로직부터 테스트를 붙인다
- 엔진에 강하게 묶인 코드와 그렇지 않은 코드를 분리한다
- 치명적인 회귀가 자주 나는 규칙부터 우선 보호한다
- 플레이 감각 검증은 자동화와 수동 플레이를 함께 쓴다
이 흐름이면 TDD를 억지로 모든 곳에 적용하지 않으면서도, 테스트가 실제 비용을 줄이는 구간을 먼저 확보할 수 있다.
마치며
게임 회사에서 테스트 주도 개발은 “가능하다, 불가능하다”로 답할 문제가 아니다. 더 중요한 질문은 “어디에 적용하면 효과가 큰가”다. 유니티와 언리얼이 제공하는 도구도 이미 그 점을 전제로 만들어져 있다.
게임은 플레이 감각을 직접 확인해야 하는 매체다. 하지만 그렇다고 모든 검증을 사람 손에만 맡길 이유는 없다. 규칙과 데이터, 저장 형식, 에디터 툴, 반복해서 깨지는 로직을 테스트로 보호하기 시작하면 팀의 속도와 안정성은 분명히 달라진다. 결국 TDD는 만능 해법이 아니라, 게임 코드 안에서 자동화가 잘 맞는 층을 찾아내는 습관이다.
참고 자료
- Unity, Unity Test Framework manual
- Epic Games, Running Gauntlet Tests in Unreal Engine
- Epic Games, Resources for Scaling Your Unreal Engine Team