前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。
存在的問題
有時候,不同單元測試之間可能會競爭相同的資源,比如讀寫相同的文件。在這種情況下,如果并行執行測試,就會導致有競態問題。
默認情況下,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