Metlivi 部落格

如何在分支遊戲故事倍增時保持其可測試性

當分支故事規模擴大時,應著重測試使各路徑產生行為差異的決策與狀態變化,而非將每條可能的路線都當作獨立的端到端腳本進行測試。將敘事建模為圖(graph),定義每個決策點的條件與結果,並構建一個涵蓋關鍵轉變、匯合點及失敗狀況的小型測試套件。接著,運用基於風險的路線抽樣與真人遊玩測試,來捕捉結構化檢查無法判斷的問題。這為敘事設計師和 QA 團隊提供了一種可重複的方法來發現缺陷,同時無需聲稱涵蓋了窮舉式的路徑覆蓋。

2026年9月27日閱讀時間 7 分鐘閱讀、藝術與文化作者:Metlivi Editorial Team
第 1 節

從記錄行為的圖開始

將每個可遊玩的段落或場景表示為節點,將每個選項表示為有向邊。在邊上標註其條件與效果:例如,`has_key = true` 會啟用「解鎖大門」,從而將 `gate_open = true`。明確標記結局、循環與匯合點(rejoin points)。匯合點是不同路線再次交會的地方;它是檢查故事能否從多種不同歷史繼續推進、而不會攜帶非預期狀態的理想位置。

圖應反映遊戲實際評估的邏輯,而不僅僅是文本結構。記錄選項讀取了哪些變數、寫入了哪些變數,以及後續有哪些節點依賴它們。包含預設值、重設規則與任何一次性效果。如果在某個分支中設定了一個標記(flag)且從未清除,這可能是刻意為之;將其記錄下來可使這一後果在審查和測試中清晰可見。

這種結構也有助於定位在冗長腳本中容易被忽略的決策點。Alexey Tikhonov 於 2024 年發表的一篇論文研究了分支敘事中角色決策點的偵測,並提出了一個基於《自我冒險》(Choose Your Own Adventure)遊戲圖的資料集。該研究的任務著重於識別敘事決策點,而非驗證 QA 方法;它可以為團隊如何盤點選項提供參考,但並不能證明此處介紹的測試方法有效。[Tikhonov, “Branching Narratives: Character Decision Points Detection”](https://aclanthology.org/2024.games-1.8/)

第 2 節

測試狀態轉變,而不僅僅是場景造訪

僅確認某個節點是否出現的測試,可能會遺漏失效的選項。對於每個重要選項,請檢查三件事:該選項是否在預期條件下可用、選擇它是否會套用預期的狀態變更,以及下一個節點和可見結果是否與該狀態相符。這些檢查將故事視為一個狀態轉變系統:給定初始狀態與動作,驗證產生的狀態與目標位置。

例如,針對選擇「出示地圖」的測試可能會斷言(assert)地圖已被出示、`trust` 保持不變,且路線到達了共享的天文台場景。與之配對的測試則從 `has_map = false` 開始,並斷言此選項不可用或遵循指定的替代方案。確切的預期行為取決於敘事規格說明;重點在於明確地進行斷言,而非僅從段落標題推斷其正確性。

在匯合點,測試不應僅止於到達該處。比較每條路線旨在保留、更改或捨棄的狀態。在某條分支中被說服的守衛在匯合後可能仍是盟友,而臨時偽裝則應該失效。將這些規則納入匯合後的預期狀態中。如果各路線旨在完全收斂,請斷言共享狀態;如果它們應保留有意義的差異,也請斷言這些差異。

第 3 節

使用虛構範例使覆蓋情況直觀可見

假設一個簡短的懸疑故事在檔案館處有一個決策點。玩家可以請求協助、潛入,或使用借來的鑰匙;每條路線都會到達同一個走廊,隨後的選擇將決定玩家是否拿取一封密封信件。以下虛構矩陣追蹤了一組精簡的測試職責。「已覆蓋」意味著已針對特定職責規劃了測試,並不代表已測試了整條路線或每種組合。

**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)的造訪並不會驗證它們。每一行都應指向圖中的相關節點或轉變,以便在條件變更時能夠追溯到受影響的測試。

第 4 節

在組合倍增時排定分支覆蓋的優先級

如果故事包含許多獨立的標記,可能出現的組合數量將迅速激增。切勿透過將每個理論上的路線列為強制完整通關來應對。首先識別高風險邊:決定結局走向、消耗物品、設定持久人物關係事實或合併歷史的選項。直接測試這些轉變及其重要的下游結果。

接著有目的地抽樣組合。包括邊界條件(改變選項的最小值)、每個關鍵條件的真假兩面、可能發生交互作用的標記代表性組合,以及透過不同歷史到達匯合點的路線。優先考慮最近的變更和具有複雜前置條件的路徑。當兩個變數可能產生交互作用時,為該配對新增測試,而非假設單獨的單變數檢查就能證明組合能夠正常運作。

記錄覆蓋單位及其局限性。團隊可以追蹤是否每個關鍵選項邊都經過執行、每個條件在相關時是否都檢查了 true 和 false 兩種情況,以及是否每個結局觸發點都至少有一項設計好的測試涵蓋到。這些是關於抽樣內容的實用報告;但都無法證明每種可能的歷史、狀態組合或措辭問題皆已被窮盡探索。

遊戲測試領域的研究可以提供相關但有範疇限制的想法。Gordillo 等人於 2021 年發表的 arXiv 論文描述了透過獎勵新穎動作來探索複雜 3D 場景中狀態覆蓋的強化學習代理。該研究關注的是 3D 遊戲環境中的探索,而非分支敘事選項或此處描述的具體狀態轉變測試方法。它支持將自動化探索視為一種可能的補充手段,但該研究與 Tikhonov 的論文皆未驗證這種確切的敘事測試方法。[Gordillo et al., “Improving Playtesting Coverage via Curiosity Driven Reinforcement Learning Agents”](https://arxiv.org/abs/2103.13798)

第 5 節

加入負向斷言與真人遊玩測試

正向斷言確認預期的選項或結果確實存在。負向斷言則確認被禁止的情況不會發生:未解鎖的選項不會出現、已消耗的線索不會重複給予、缺少的信件不會觸發其專屬台詞,或者失敗的嘗試不會設定成功標記。負向檢查在共享節點周圍特別有用,因為來自另一條路線的過期狀態可能會外洩到當前場景中。

自動化檢查可以驗證路徑邏輯和精確的狀態變化,但它們無法可靠地判斷轉變是否顯得連貫、台詞是否與玩家的記憶相矛盾,或者選項在上下文中是否易於理解。因此,真人遊玩測試應帶著明確目的使用特定路線:要求測試人員走較少見的分支、帶著特定歷史到達匯合點,或嘗試在缺少關鍵物品的情況下走向結局。同時觀察產生的狀態以及玩家對其的理解詮釋。

將遊玩測試筆記與節點和選項識別碼、初始狀態及所採取的步驟關聯起來。這使得回報的問題具有可重現性,並有助於區分寫作層面的疑慮與邏輯缺陷。修復完成後,重新執行受影響的轉變測試,並至少針對變更後的匯合點或結果執行一條代表性路線。

第 6 節

適用於動態變化故事的實用測試週期

對於每次故事更新,匯出或檢視圖譜,識別變更的節點、條件、效果與匯合點,然後更新覆蓋矩陣。首先執行針對性的狀態轉變測試;隨後針對高影響或新變更的章節進行精選路線抽樣和真人遊玩測試。當出現失敗時,擷取初始狀態與選擇順序,以便團隊重現問題、修復相關規則或段落,並將該案例保留為迴歸檢查(regression check)。

目標是建立一個對「已檢查了什麼」以及「為何檢查」可進行驗證的記錄。圖譜使結構易於檢視,轉變測試使邏輯明確,分支抽樣將精力導向有意義的變化,負向斷言捕捉外洩的狀態,而真人遊玩測試則評估詮釋感受。隨著路徑的不斷倍增,它們相輔相成提供實用的覆蓋率,同時在未測試的內容周圍劃出清晰的界限。

相關閱讀

繼續探索這個主題