#确定性 #框架 #测试框架 #sleep #now #wrapper

diviner

Diviner,一个确定性测试框架

2个不稳定版本

0.2.0 2020年4月11日
0.1.0 2020年4月10日

#769测试

Download history 14/week @ 2024-02-19 4/week @ 2024-02-26 15/week @ 2024-03-11 39/week @ 2024-04-01

每月下载54

MIT许可证

11KB
200 代码行

diviner

Diviner是Rust的FoundationDB风格模拟测试框架。它包括两部分

  • 一个Future执行器,旨在设计为单线程和确定性。目标是在Rust中实现确定性模拟。
  • 现有Rust异步IO库的包装器。在正常构建时,包装器将使用实际实现,但在启用simulation功能时,包装器将使用与上述Future执行器集成的模拟实现,以实现确定性测试。这里提到的包装器可能包括(但不仅限于)
    • 与时间相关的函数,例如sleep或now;
    • 与网络相关的模块,例如TCPListener、TCPStream;
    • 与文件IO相关的模块;

如果您对上述术语感到困惑,这个视频可能有助于解释Diviner提供了什么。

目标是使任何满足以下规则的Rust代码能够进行确定性测试

  1. 代码使用async/await风格编写;
  2. 代码使用Diviner提供的包装器执行所有必要的IO;

示例

为了说明库的功能,在存储库中提供了几个示例

  • simple:使用async/await风格编写的最小代码片段;
  • time-manipulation:时间操作示例,在这里我们正在测试整天的睡眠,但模拟代码会操纵时间并立即完成;
  • execution-order:一个实现不佳的代理,Diviner可以使用不同的种子来测试不同执行顺序的future。因此,您可以使用触发错误的种子对代码进行确定性调试;

依赖项

~1.2–1.7MB
~28K SLoC