跳到正文
本頁目錄

接入測試框架

harness-shim.ps1 原地替換 LeviLauncher 測試框架的常用函數(Focus-Game、Assert-GameForeground、 Set-GameWindowSize、Move-Mouse、Click、Scroll、Press-Key、Type-Text、Get-ClientBitmap,參數不變), 改為通過控制管道與遊戲通信,並包裝 Start-Game/Stop-Game。測試場景不用改。在框架自己的 lib.ps1 之後、 腳本頂層 dot-source 它:

powershell
. "$PSScriptRoot/lib.ps1"
. "$beddDir\harness-shim.ps1"
Register-BeDDNative ([MyE2E.Native])   # 可选,见下文
# 部署完你的模组、把其他模组挪开之后:
Install-BeDDMod -ModsDir $script:ModsDir -PipeName 'BeDD-<实例名>'
# ……在 finally 里、游戏关掉之后:
Uninstall-BeDDMod -ModsDir $script:ModsDir

$beddDir 是 Be.D.D. 解壓的位置;測試框架可以自己下載。 Initialize-BeDDInstance [-Slot N] 返回要用的實例(Dir、ModsDir、PipeName),並補齊電腦上還缺的東西。

遊戲用 Start-BeDDGame.ps1 啟動,不要走啟動器;"把其他模組挪開"那一步要跳過 BeDD:它每次運行都重新裝、 結束就刪(留下一份的話,正常啟動的遊戲也會進管理窗口)。

墊片提供的函數

函數
Install-BeDDMod -ModsDir <目录> [-PipeName p] [-Trace]把模塊複製到 <目录>\BeDD,寫好它的 config.json(窗口大小取 $script:WindowW/$script:WindowH,默認 1600×900;managerScript 用來啟動管理窗口),遊戲隨後在管理窗口裡無頭運行,把 LeviLamina 切到內置崩潰記錄器,並讓客戶端指向這條管道
Uninstall-BeDDMod -ModsDir <目录>再刪掉模塊,遊戲還佔著 DLL 時會重試。放在 finally 裡調用
Set-WorldSinglePlayer <存档目录>把測試存檔設成單人(不開多人、局域網、Xbox Live 或平臺廣播)。恢復測試存檔後馬上調用
Register-BeDDNative <类型>重定向框架自己的原生輸入類的方法(見下文)
Start-Game / Stop-Game被包裝:遊戲運行期間持有共享的信令鎖($script:ExclusiveSignaling = $true 時為獨佔),沒有管理窗口時先啟動它(啟動不了時 Start-Game 拋出異常),遊戲啟動時若搶了前臺,會把前臺還給你原來的窗口

框架自己的輸入類

如果測試場景直接調用框架自己的輸入類(比如 [MyE2E.Native]::Key(0x10, $false)),給這個類加上下面幾個字段, 並在每個方法開頭加一行判斷,Register-BeDDNative 會把它們填好:

csharp
public static Action<ushort, bool> KeyRedirect;          // (vk, up)
public static Action<int, bool>    MouseButtonRedirect;  // (0 左 / 1 右 / 2 中, up)
public static Action<int>          WheelRedirect;        // (delta,每格 120)
public static Action<char>         UnicodeRedirect;
public static Action<int, int>     MoveRelativeRedirect; // 视角
public static void Key(ushort vk, bool up) { if (KeyRedirect != null) { KeyRedirect(vk, up); return; } /* 原来的 SendInput */ }

示例

完整的測試框架可以參考 BeetrootSkin 和 AlleviatedBackpacks。