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