분기형 게임 스토리의 테스트 가능성을 유지하는 방법
분기형 스토리가 방대해질 때는 모든 가능한 경로를 별도의 엔드투엔드 스크립트로 테스트하지 말고, 각 경로가 다르게 작동하도록 만드는 결정과 상태 변화를 테스트하세요. 내러티브를 그래프로 모델링하고, 각 결정의 조건과 결과를 정의한 뒤, 중요 전환, 합류 지점, 실패 사례를 다루는 작은 테스트 스위트를 구축하세요. 그런 다음 리스크 기반 경로 샘플링과 실제 사람의 플레이테스트를 활용하여 구조화된 검사로는 판단할 수 없는 문제를 포착하세요. 이를 통해 내러티브 디자이너와 QA 팀은 모든 경로를 완벽히 다루었다고 과장하지 않고도 결함을 찾아낼 수 있는 반복 가능한 방법을 확보할 수 있습니다.
동작을 기록하는 그래프로 시작하기
플레이 가능한 각 지문이나 장면을 노드로, 각 선택지를 방향성 있는 엣지(간선)로 표현하세요. 엣지에는 조건과 효과를 주석으로 기록합니다. 예를 들어 `has_key = true`는 '문 열기'를 활성화하고, 이는 `gate_open = true`로 설정합니다. 엔딩, 루프, 합류 지점을 명시적으로 표시하세요. 합류 지점(rejoin point)은 서로 다른 경로가 다시 만나는 곳으로, 의도하지 않은 상태를 유지하지 않은 채 스토리가 여러 히스토리로부터 자연스럽게 이어질 수 있는지 확인하기 좋은 유용한 지점입니다.
그래프는 텍스트 구조뿐만 아니라 게임이 실제로 평가하는 대상을 반영해야 합니다. 선택지가 어떤 변수를 읽고 쓰는지, 이후 어떤 노드가 그 변수에 의존하는지 기록하세요. 기본값, 초기화 규칙, 일회성 효과도 포함해야 합니다. 한 분기에서 플래그가 설정된 후 한 번도 지워지지 않는다면, 그것이 의도된 동작일 수도 있습니다. 이를 문서화하면 리뷰 및 테스트 과정에서 그 결과를 가시화할 수 있습니다.
이러한 구조는 긴 스크립트에서 놓치기 쉬운 의사결정 지점을 찾는 데도 도움이 됩니다. Alexey Tikhonov의 2024년 논문은 분기형 내러티브에서 캐릭터의 결정 지점을 탐지하는 연구를 다루며 'Choose Your Own Adventure' 게임 그래프를 기반으로 한 데이터셋을 제안합니다. 이 연구 과제는 QA 방법 검증이 아니라 내러티브 결정 지점을 식별하는 것에 초점을 맞추고 있습니다. 따라서 팀이 선택지 목록을 정리하는 방식을 구성하는 데 참고가 될 수는 있지만, 본 가이드의 테스트 접근 방식이 유효함을 증명하는 것은 아닙니다. [Tikhonov, “Branching Narratives: Character Decision Points Detection”](https://aclanthology.org/2024.games-1.8/)
단순한 장면 방문이 아닌 상태 전환 테스트하기
노드가 표시되었는지만 확인하는 테스트는 고장 난 선택지를 놓칠 수 있습니다. 중요한 각 선택지에 대해 세 가지를 확인하세요. 의도된 조건에서 선택지가 제공되는지, 이를 선택했을 때 예상된 상태 변화가 적용되는지, 다음 노드와 화면에 표시되는 결과가 해당 상태와 일치하는지 여부입니다. 이러한 검사는 스토리를 상태 전환 시스템으로 취급합니다. 즉, 시작 상태와 행동이 주어졌을 때 결과 상태와 목적지를 검증하는 것입니다.
예를 들어 '지도 보여주기'를 선택하는 테스트는 지도가 표시되고, `trust`가 변경되지 않으며, 경로가 공통의 관측소 장면에 도달하는지 단언(assert)할 수 있습니다. 짝을 이루는 다른 테스트는 `has_map = false`로 시작하여 이 선택지를 사용할 수 없거나 지정된 대체 경로로 진행되는지 확인합니다. 정확한 예상 동작은 내러티브 명세에 따라 달라집니다. 중요한 점은 지문 제목에서 정확성을 추측하기보다 이를 명시적으로 단언하는 것입니다.
합류 지점에서는 단순히 도달 여부 이상의 것을 테스트해야 합니다. 각 경로가 유지, 변경 또는 폐기해야 하는 상태를 비교하세요. 한 분기에서 설득된 경비원은 합류 후에도 아군으로 남을 수 있지만, 일시적인 변장은 만료되어야 합니다. 이러한 규칙을 합류 후 예상 상태의 일부로 설정하세요. 경로가 완전히 수렴되도록 설계되었다면 공유된 상태를 단언하고, 유의미한 차이를 유지해야 한다면 그 차이 역시 명확히 단언하세요.
가상의 예시를 활용해 커버리지 시각화하기
기록 보관소에서 결정을 내리는 짧은 추리물을 가정해 보겠습니다. 플레이어는 도움을 요청하거나, 몰래 숨어들거나, 빌린 열쇠를 사용할 수 있습니다. 각 경로는 동일한 복도에 도달하며, 이후의 선택에 따라 플레이어가 밀봉된 편지를 집을지가 결정됩니다. 다음 가상 매트릭스는 간결한 테스트 요구 사항 세트를 추적합니다. 여기서 '커버됨'은 전체 경로나 모든 조합을 테스트했다는 뜻이 아니라, 특정 요구 사항에 대한 테스트가 계획되어 있음을 의미합니다.
**A:** `trust = high`; 보관소 관리인에게 도움을 요청함. 도움 옵션이 나타남; `trust`가 높게 유지됨; 경로가 복도에 도달함. 선택지 가용성 및 전환
**B:** `trust = low`; 도움을 요청함. 명세에 따라 도움 옵션이 숨겨지거나 거절당함. 부정 조건
**C:** `has_key = true`; 옆문을 엶. 문이 열림; 경로가 복도에 도달함; 명세된 경우에만 열쇠가 소모됨. 상태 효과 및 합류
**D:** `has_key = false`; 옆문을 열려고 시도함. 문이 열리지 않음; 성공 플래그가 설정되지 않음. 부정 단언
**E:** 복도에서 밀봉된 편지를 집음. `has_letter = true`; 이후의 증거 장면에서 편지 전용 대사가 제공됨. 다운스트림 결과
**F:** 복도에서 편지를 두고 감. `has_letter = false`; 편지 전용 대사가 나타나지 않음. 결과 대조 및 부정 단언
이는 의사결정을 돕는 도구일 뿐, 커버리지 비율이나 만능의 최소 테스트 스위트가 아닙니다. 누락된 부분을 명확하게 보여주는 역할을 합니다. 여기서는 정상 경로(happy path) 방문만으로는 검증할 수 없기 때문에, 낮은 신뢰도 관문과 '편지 없음' 결과에 대한 별도의 확인이 필요합니다. 조건이 변경되었을 때 영향받는 테스트를 추적할 수 있도록 각 행은 그래프의 관련 노드나 전환을 가리켜야 합니다.
조합이 증가할 때 분기 커버리지의 우선순위 정하기
스토리에 독립적인 플래그가 많으면 가능한 조합의 수가 급격히 늘어날 수 있습니다. 이에 대응하기 위해 이론상 가능한 모든 경로를 필수의 전체 플레이스루로 나열하지 마세요. 먼저 고위험 엣지를 식별하세요. 엔딩을 제한하거나, 아이템을 소모하거나, 지속적인 관계 데이터를 설정하거나, 히스토리를 병합하는 선택지가 이에 해당합니다. 이러한 전환과 그로 인한 중요한 다운스트림 결과를 직접 테스트하세요.
그런 다음 신중하게 조합을 샘플링하세요. 경계 조건(선택지를 바꾸는 최소값), 각 중요 조건의 양면(참/거짓), 상호작용할 수 있는 플래그의 대표 조합, 서로 다른 히스토리를 통해 합류 지점에 도달하는 경로 등을 포함합니다. 최근 변경된 사항과 복잡한 선행 조건을 가진 경로의 우선순위를 높이세요. 두 변수가 상호작용할 수 있다면, 개별 단일 변수 검사가 조합의 작동을 보장한다고 가정하지 말고 해당 조합에 대한 테스트를 추가하세요.
커버리지 측정 단위와 그 한계를 기록하세요. 팀은 모든 핵심 선택지 엣지가 실행되었는지, 관련된 경우 각 조건이 참과 거짓 모두로 확인되었는지, 모든 엔딩 트리거가 설계된 테스트에 의해 최소 한 번 이상 도달되었는지를 추적할 수 있습니다. 이는 샘플링된 내용을 보여주는 유용한 보고서이지만, 가능한 모든 히스토리, 상태 조합 또는 어색한 문장 문제가 전부 확인되었음을 증명하지는 못합니다.
게임 플레이테스트 연구에서 이와 관련되지만 적용 범위가 제한적인 아이디어를 찾아볼 수 있습니다. Gordillo 등의 2021년 arXiv 논문에서는 복잡한 3D 시나리오에서 상태 커버리지를 탐색하기 위해 새로운 행동에 대해 보상을 받는 강화학습 에이전트를 설명합니다. 이 연구는 3D 게임 환경에서의 탐색을 다루고 있으며, 분기형 내러티브 선택지나 본 글에서 설명하는 구체적인 전환 테스트 방법과는 다릅니다. 이 연구는 자동화된 탐색이 잠재적인 보완책이 될 수 있음을 뒷받침하지만, 해당 연구나 Tikhonov의 논문 모두 이 정확한 내러티브 테스트 방법을 검증하는 것은 아닙니다. [Gordillo et al., “Improving Playtesting Coverage via Curiosity Driven Reinforcement Learning Agents”](https://arxiv.org/abs/2103.13798)
부정 단언 및 사람을 통한 플레이테스트 추가하기
긍정 단언(positive assertion)은 예상된 선택지나 결과가 존재하는지 확인합니다. 부정 단언(negative assertion)은 금지된 동작이 발생하지 않는지 확인합니다. 즉, 잠긴 옵션이 나타나지 않는지, 소모된 단서가 두 번 지급되지 않는지, 편지가 없을 때 관련 대사가 출력되지 않는지, 실패한 시도가 성공 플래그를 설정하지 않는지 등을 확인하는 것입니다. 부정 검사는 다른 경로의 오래된 상태가 현재 장면으로 유출될 수 있는 공유 노드 주변에서 특히 유용합니다.
자동화된 검사는 경로 로직과 정확한 상태 변화를 검증할 수 있지만, 전환이 자연스러운지, 대사가 플레이어의 기억과 모순되지는 않는지, 문맥상 선택지가 이해하기 쉬운지를 안정적으로 판단하지는 못합니다. 따라서 사람을 통한 플레이테스트는 목적을 가지고 선별된 경로를 사용해야 합니다. 테스터에게 덜 일반적인 분기를 따라가 보거나, 특정 히스토리를 가지고 합류 지점에 도달해 보거나, 열쇠가 없는 상태에서 엔딩에 도달해 보도록 요청하세요. 결과 상태뿐만 아니라 이에 대한 플레이어의 해석도 함께 관찰해야 합니다.
플레이테스트 노트는 초기 상태 및 진행 단계와 함께 노드 및 선택지 식별자에 연결하여 기록하세요. 이렇게 하면 보고된 문제를 재현할 수 있고, 글작업의 문제인지 로직 결함인지 구별하는 데 도움이 됩니다. 수정 후에는 영향을 받은 전환 테스트와 변경된 합류 지점 또는 결과를 거치는 최소 하나의 대표 경로를 다시 실행하세요.
변화하는 스토리를 위한 실용적인 테스트 주기
스토리가 업데이트될 때마다 그래프를 내보내거나 검토하고, 변경된 노드, 조건, 효과 및 합류 지점을 식별한 다음 커버리지 매트릭스를 업데이트하세요. 먼저 핵심적인 상태 전환 테스트를 실행한 다음, 영향이 크거나 새로 변경된 섹션을 대상으로 선별된 경로 샘플링 및 사람을 통한 플레이테스트를 진행합니다. 실패가 발생하면 시작 상태와 선택 순서를 캡처하여 팀이 이를 재현하고 관련 규칙이나 지문을 수정한 뒤 회귀 검사(regression check)로 보존할 수 있도록 하세요.
목표는 무엇을 왜 확인했는지 테스트 가능한 방식으로 명확히 정리하는 것입니다. 그래프는 구조를 검토할 수 있게 해주고, 전환 테스트는 로직을 명시화하며, 분기 샘플링은 의미 있는 변화에 노력을 집중시키고, 부정 단언은 유출된 상태를 잡아내며, 사람의 플레이테스트는 해석을 평가합니다. 이들이 결합되어 경로가 늘어나는 상황에서도 테스트되지 않은 영역의 경계를 명확히 유지하면서 유용한 커버리지를 제공합니다.
