(主要是) Go 中的确定性模拟测试

主要观点:确定性模拟测试(DST)近来颇受欢迎,Antithesis 对此解释较好,其核心在于确定性。DST 能在开发周期早期发现难以重现的 bug 且重现周期短,能让客户和开发者更满意,但实施难度大。Polar Signals 受其吸引但自己写调度器有难度,后发现 Antithesis 的方案。
关键信息

  • DST 与随机测试类似但能确定性重现失败,模拟能增强路径探索。
  • 实施 DST 的关键在于设计成确定性的项目,如 TigerBeetle,要解决确定性程序在多 OS 线程运行的问题。
  • Polar Signals 尝试在 Go 中实现 DST,通过将 Go 程序编译为 WASM 运行在单 OS 线程,修改 Go 运行时读取种子,利用 Go 运行时的 fake time 处理时间随机性等方法。
  • 该方法存在局限性,如 Go 程序需能编译为 WASM,模拟协程调度顺序有限等,未来计划引入更多故障模拟和定制 WASM 运行时。
    重要细节
  • Antithesis 在 stealth 模式时就被很多项目使用,其在更低抽象层提供确定性。
  • Polar Signals 因预算限制未使用 Antithesis 但期待其免费测试项目。
  • 实现单线程执行需用 GOMAXPROCS 并将 Go 程序编译为 WASM,WebAssembly 程序设计为单线程运行。
  • Go 运行时的随机数生成器种子可通过环境变量修改,fake time 可通过设置 Go 构建标签启用。
  • 通过简单 Go 程序验证了上述变化能实现确定性执行,在 FrostDB 集成测试中发现了多个 bug。
  • 讨论了一些未采用的方案如 hermit,以及对 WASM 运行时的进一步探索。
阅读 7
0 条评论