在 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 则让整个引擎针对合成流量运行,既不加载驱动,也不触碰网络。两者都适用于不得影响所运行机器的构建。