一個項目越到後期越能感覺到自動化測試的重要性, 如果早期能把這塊做好, 可以少踩很多坑...
From Wiki:
《盜賊之海》是一款以海盜作為主題的第一人稱視角多人合作動作冒險遊戲[1][2]。遊戲支持Windows個人電腦和Xbox One電子遊戲機之間跨平台遊玩[3]。一群玩家將會通過海盜船環遊並探索開放世界,同時進行不同的任務,比如船隻駕駛或者使用大炮作戰[2][4]。玩家可以完成任務、收集戰利品或進攻其他玩家[4]。《盜賊之海》是個公共的遊戲世界,也就是說玩家們在冒險中可能會遇見對方[2]。遊戲有著卡通式畫風以及誇張的物理引擎,允許玩家進行特技動作,比如用船上的大炮把自己射出去[3][5]。
主要內容:
(做分享的套路一, 開場先說挑戰, 反正有多難說多難)
(做分享的套路二, 丟出一個傳統方案(人工測試), 反正有多爛說多爛)
人工測試的問題: 慢, 不靠譜
(話說好像我見過的項目都是這麼搞的, 難道是人力成本太低了...)
舉了個AI在轉角出Bug的例子來說為什麼人工測試不靠譜, 因為如果開發者和測試者在流程中很容易只關注功能特性本身的正確性, 而忽略了它與周邊模塊的相關性測試, 這樣的Bug就會伴隨著版本發布, 然後等過了幾星期後玩家問候了自己的親人才知道去改, 這時候開發者都不知道是哪些提交導致的問題了, 好不容易改了Bug後還可能產生新的問題來重複這個循環...
(做分享的套路三, 提出自己的方案, 通過對比體驗優勢)
所以機械性的測試讓自動化測試來跑... 那人工測試跑啥呢?
交代完背景, 開始進入正題
基於UE4的AutomationSystem修改而來, 可以整合進日常構建流程中. 開者發寫完代碼跑一遍, 立碼就有信心提交了, 再也不用擔驚受怕了
單元測試大家都長得差不多, Setup->Run->Check
集成測試用來覆蓋遊戲中的一個特性或行為, 多個單元測試之間可以做一些通信
集成測試都做成了一個個的地圖, 使用Blueprint來組裝節點執行
比如測試船的舵輪旋轉, 不用開個客戶端, 弄個測試地圖, 只有一個平台, 一個玩家, 一個舵輪, 沒了
之所以沒有放船, 那是因為需要排除不必要的干擾, 船舵方向算是另一個測試了
Blueprint也是分成那三步來執行, Assert節點測試沒通過會輸出Log, 這個測試就會被標記成失敗了
Unreal Automation窗口結果一目了然
網路測試咋做呢?
比如這個多個玩家交互的測試:
SyncClientServer會自動啟動客戶端並且跟伺服器做好握手
通過一個Blueprint把網路測試的整個流程給串了起來, 很方便
除了單元測試和集成測試, 還有些別的測試類型:
(實際開發過遊戲項目就知道如果有這些測試會省多少時間, 然而並沒有幾個項目會去搞......)
完整的流程是這樣的:
(分享的套路四, 自己挖的坑自己填, 體現技術深度)
自動化測試提升版本穩定性的同時, 也帶來了不小的負擔:
(反正問題很多, 後面就說怎麼填坑了)
自動化測試的幾個層次, 越往上依賴越多, 時間越長, 越不可靠. 上層的正確性是建立在下層穩定的基礎上, 使用Unreal引擎的類, Unreal的地圖等會造成依賴的功能模擬過多, 所以考慮把玩法測試移動到更底層的位置減少依賴
使用Actor類來做測試, ActorTest處於集成測試和單元測試的中間層次
比如這個根據光照變換形態的骷髏, 在ActorTest中做更方便
ActorTest寫起很很像單元測試, 但是背後複雜, 比如創建了個場景, 設置了時間, 更新了邏輯等. 好處是執行起來比集成測試快得多.
這就需要在集成測試和ActorTest之間做一些平衡, 比如前者用來測試正確的遊戲情景(Golden Path), 後者用來測試邊界或失敗條件. 比如一個玩家交給另一個玩家道具的例子:
只對"Golden Path"應用集成測試, 大大減少了他們的數量, 那執行時間怎麼優化呢?
那就是在一個集成測試中, 執行多個相關特性的測試, 這樣雖然打破了一個測試只測一個特性的規則, 但是減少執行時間更重要(開始自己打自己臉...)
很多測試中都會有玩家角色, 但是載入和初始化角色是相當耗時的, 比測試本身執行的時間長多了, 所以可以利用Unreal的World Transition特性, 把角色從一個測試場景轉移到另一個測試場景. 比如上圖第一個測試是控制舵輪, 第二個測試是控制絞盤, 角色是共享的, 只需要注意不要把玩家狀態從一個測試帶到另一個測試中去.
有一些測試失敗是偶現的:
忽略偶現的問題並不是代表不去管它了, 失敗的次數會被統計下來, 出現次數最多的肯定值得找人去專門查一下
(分享套路五, 開始吹自己方案的好處了, 壞處上面都當成坑填了, 深坑是不會告訴你的)
好處一: 減少了驗證構建版本的時間, 上個遊戲要花兩星期, 這個項目才1.5天. 這樣可以非常有信心地發布給玩家, 快速收集反饋, 大大加快了迭代速度
好處二: 減少了人工測試的數量, 上個項目50個, 這個項目才17個, 而且玩法複雜度不是一個量級的(省錢是省錢了, 我還沒見過哪個項目會請50個測試的...)
好處三: 減少了Bug數量. 相對於另一個項目3000個的量級(嗯, 又換了一個對比對象, 肯定這個項目Bug比Kinect Sports Rivals多...), 這個項目才214個. 因為自動化測試強制通過才能提交合入, 很多Bug在進入版本前就被修復了
好處四: 降低了項目的時間壓力, 對比另一個項目, 加班變少了 (功勞當然是自動化測試的). 做項目的都知道一出版本就會加班, Bug數量決定加班時間
(分享套路六: 開始上升到非技術層面, 談談哲學, 講講教訓, 當前提是前面不能講砸了)
講完還不忘了打廣告, 那我寫完也打個廣告吧:
NEXT Studios神秘項目招聘資深工程師, 這裡有個早期視頻和一些概念設計:
有意向的私信或發簡歷到xoyojank@qq.com