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 版