rust单元测试顺序执行

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

存在的问题

有时候,不同单元测试之间可能会竞争相同的资源,比如读写相同的文件。在这种情况下,如果并行执行测试,就会导致有竞态问题。

默认情况下,rust 采用多线程并行执行所有测试,当有串行需要时可以执行:cargo test – --test-threads={thread_numbers}来控制执行测试的线程数。

另外一种解决办法:serial_test

除了运行测试的时候指定线程数之外,我们也可以使用 serial_test 这个 crate。

使用方式

编辑 Cargo.toml 编辑 dependencies 块:

[dependencies]
serial_test = "3.1.1"
代码中使用

然后我们就可以在单元测试中使用了:

#[cfg(test)]
mod tests {
    use std::env::temp_dir;
    use super::*;
    use serial_test::serial;

    #[test]
    #[serial(frpc)]
    fn test_create_proxy_from_json() {
        let s = String::from("{\"name\":\"test\",\"type\":\"tcp\",\"localIP\":\"127.0.0.1\",\"localPort\":80,\"remotePort\":80}");
        let proxy: Proxy = serde_json::from_str(&s).unwrap();

        assert_eq!(proxy.name, Some("test".to_string()));
        assert_eq!(proxy.proxy_type, Some("tcp".to_string()));
        assert_eq!(proxy.local_ip, Some("127.0.0.1".to_string()));
        assert_eq!(proxy.local_port, Some(80));
        assert_eq!(proxy.remote_port, Some(80));
    }

    #[test]
    #[serial(frpc)]
    fn test_frpc() {
        let frpc_config = create_frpc_config();

        assert_eq!(frpc_config.frpc.server_addr, Some("1.2.3.4".to_string()));
        assert_eq!(frpc_config.frpc.server_port, Some(7000));

        let toml = frpc_config.to_toml();
        assert_eq!(true, toml.contains("[[proxies]]"))
    }
}

这样一来,上面这两个单元测试就不会同时执行了,从而避免了一些竞态场景的发生。

参考文档

关于 serial_test 的更多内容可查看 https://docs.rs/serial_test/3.1.1/serial_test/index.html

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白如意i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值