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 下载

Apache-2.0/MIT

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.0MIT 许可证
除非您明确声明,否则您提交的任何有意包含在此软件包中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~3.5MB
~69K SLoC