Bean Network Tester

在 CI 中模擬糟糕的網路

視窗是可選的。同一個可執行檔案可以作為命令列工具執行,在設定時間後自行結束,並以管線能讀取的方式報告發生了什麼。

一個步驟的樣子

在測試期間施加影響,然後讓它自行停止。沒有需要記得執行的清理步驟:

BeanNetworkTester.exe --loss 10 --latency 200 --target myapp.exe --duration 60

在 GitHub Actions 作業中,使用自行代管的 Windows 執行器:

- name: Test the app on a poor connection
  shell: pwsh
  run: |
    Start-Process -FilePath BeanNetworkTester.exe `
      -ArgumentList '--loss 10 --latency 200 --target myapp.exe --duration 90'
    npm test

關於執行器有兩點:擷取流量需要管理員權限,而代管執行器不會給你這些權限,所以這應該放在自行代管的 Windows 機器上。

每一種結束方式都有結束代碼

沒有任何一種結束方式會以一大段堆疊追蹤資訊收場。一次執行的每種結束方式都有一個編號,所以管線能區分「你的應用失敗了」和「工具無法啟動」:

代碼含義
0已按要求完成。
1執行過程中出現故障。
2命令列用法有誤。
3某個設定或取值無效。
4場景檔案被拒絕。
5無法讀取或寫入檔案。
6關於本次執行的斷言未能成立。
7沒有管理員權限,因此無法載入驅動程式。
130被中斷,通常是按下了 Ctrl+C。
143被外部終止。

機器可讀的輸出

--format json 每行輸出一個 JSON 物件,執行期間是取樣資料,結束時是彙總,這樣後續步驟可以對它做斷言:

BeanNetworkTester.exe --loss 5 --duration 30 --format json > run.ndjson

記錄行寫入標準錯誤,資料寫入標準輸出,所以重定向資料時兩者永遠不會混在一起。--seed 讓執行可重複,這正是一個不穩定的測試在任何人開始爭論之前所需要的。

什麼都不碰的試執行

有兩個參數讓你在信任它之前就可以放心地接入:--dry-run 報告這些設定會做什麼然後結束,--simulate 則讓整個引擎針對合成流量執行,既不載入驅動程式,也不觸碰網路。兩者都適用於不得影響所執行機器的建置。

接下來

準備好故意搞壞自己的網路了嗎?

下載 Windows 版