5 个不稳定版本
0.3.1 | 2024 年 2 月 11 日 |
---|---|
0.3.0 | 2024 年 2 月 10 日 |
0.2.0 | 2020 年 11 月 1 日 |
0.1.1 | 2020 年 9 月 20 日 |
0.1.0 | 2020 年 9 月 20 日 |
#254 在 测试
每月 27 下载
21KB
379 行
async-metronome
异步 Rust 的单元测试框架
此 crate 实现了一个基于 William Pugh 和 Nathaniel Ayewah 在马里兰大学开发的 MutithreadedTC 的异步单元测试框架。
"MutithreadedTC 是一个用于测试并发应用程序的框架。它具有一个节拍器,用于对多个线程中的活动顺序提供精细控制。" ...
并发应用程序通常不是确定性的,因此它们的失败也不是。根据线程的交织方式,它们可能会出现和消失。
使用 async-metronome,可以定义测试用例来演示线程的固定交织顺序。如果测试中的并发抽象相对较小,则应该能够创建多个测试用例,以确定性地覆盖所有相关的交织。
为了避免在此处复制原始文档,请查看 MultithreadedTC 网站,以及相应的 论文。
示例
#[async_metronome::test]
async fn test_send_receive() {
let (mut sender, mut receiver) = mpsc::channel::<usize>(1);
let sender = async move {
assert_tick!(0);
sender.send(42).await.unwrap();
sender.send(17).await.unwrap();
assert_tick!(1);
};
let receiver = async move {
assert_tick!(0);
await_tick!(1);
receiver.next().await;
receiver.next().await;
};
let sender = async_metronome::spawn(sender);
let receiver = async_metronome::spawn(receiver);
sender.await;
receiver.await;
}
说明(改编自 MutithreadedTC)
async-metronome 有一个内部时钟。只有在所有任务都处于挂起状态时,时钟才会前进到下一个滴答。
时钟从 tick 0
开始。在这个示例中,宏 await_tick!(1)
使接收器阻塞,直到时钟达到 tick 1
才继续。线程 1 在 tick 0
中可以自由运行,直到它在调用 sender.send(17)
时阻塞。此时,所有线程都阻塞了,时钟可以前进到下一个滴答。
在 tick 1
中,执行了接收者中的语句 receiver.next(42)
,这释放了发送者。发送者中的最后一句话断言时钟在 tick 1
,实际上断言任务在调用 sender.send(17)
时被阻塞。
完整的示例,可以在 tests/send_receive.rs 中找到。
安装
$ cargo add async-metronome
这是初始的预发布版本。测试工具中的错误特别危险 - 请谨慎使用。
许可证
根据您的选择,在以下许可证下进行许可: Apache License, Version 2.0 或 MIT 许可证。除非您明确声明,否则您提交的任何有意包含在此软件包中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双许可,不附加任何额外条款或条件。
依赖项
~3.5MB
~69K SLoC