#time #test #unit-testing

tokitsuge

一个友好的单元测试工具,提供获取当前时间的功能

1 个不稳定版本

0.1.0 2023 年 8 月 17 日

#440 in 测试

MIT/Apache

16KB
127

🐔️ Tokitsuge

Tokitsuge 是一个友好的单元测试工具,提供获取当前时间的功能。

用法

只需将 SystemTime::now 替换为 Clock::now

use tokitsuge::Clock;

fn some_time_depended_function() {
    Clock::now()
}

此代码本身只是调用 SystemTime::now 来获取系统时间(因此在生产环境中没有额外的开销)。启用 Cargo.toml 中的 freeze 功能运行测试将更改行为。

[dependencies]
tokitsuge = "0.1.0"

[dev-dependencies]
tokitsuge = { version = "0.1.0", features = ["freeze"] }
use tokitsuge::Clock;

fn some_time_depended_function() {
    Clock::now()
}

#[cfg(test)]
mod tests {
    use std::thread::sleep;
    use std::time::Duration;
    use super::*;

    #[test]
    fn test_some_time_depended_function() {
        // Real system time.
        let t1 = some_time_depended_function();
        
        {
            let frozen_clock = Clock::freeze();

            // Fixed time.
            let ft1 = some_time_depended_function();
            assert_eq!(ft1, frozen_clock.fixed_time());

            // This function will always return the same time until `frozen_clock` is dropped.
            sleep(Duration::from_millis(1));
            let ft2 = some_time_depended_function();
            assert_eq!(ft1, ft2);
            
            // Instead of sleep, FrozenClock#advance and FrozenClock#unwind can be used.
            frozen_clock.advance(Duration::from_millis(1));
            let ft3 = some_time_depended_function();
            assert_eq!(ft2 < ft3);
        }
        
        // Time flows again.
        let t2 = some_time_depended_function();
        assert!(t1 < t2);
    }
}

注意

此工具**不适用于**测试多线程操作。

测试代码和被测试代码必须在同一线程中运行,因为此工具使用线程局部变量来防止冻结效果传播到其他测试。

许可证

根据您的选择,许可协议为 Apache 许可证,版本 2.0MIT 许可证

无运行时依赖

功能