測試運行順序:單元測試(同處於源文件中,以 #[cfg(tests)] 標記 mod,以 #[test] 標記 function)、集成測試(位於項目根路徑下的 tests 目錄下,不須要 #[cfg(tests)] 標記,但依然須要 #[test] 標記 function)、文檔測試。多線程
1、選項併發
cargo test [testN] -- --test-threads=1 --nocapture --ignored單元測試
[testN]:能夠指定單個測試模塊或測試用例的完整名稱單獨運行,不能批量指定;但能夠指定部分名稱,全部名稱包含此字符串的模塊(包含其中全部測試用例)、測試用例均會被執行;測試
--test-threads=1:默認是多線程併發運行測試用例,運行速度快,但會形成輸出內容交叉,指定單線程運行可保證有序輸出;線程
--nocapture:默認測試經過的用例,其輸出內容將會被捕獲(屏蔽),指定此選項將會一同顯示這些內容;blog
--ignored:被標記爲 #[ignore] 的測試用例默認不會被執行,指定此項以運行這些測試用例(一般是預計耗時很長的測試);文檔
...字符串
2、單元測試示例it
#[derive(Debug)] pub struct Rectangle { length: u32, width: u32, } impl Rectangle { pub fn can_hold(&self, other: &Rectangle) -> bool { return self.length > other.length && self.width > other.width; } pub fn add_two(&mut self) { self.length += 2; self.width += 2; } } #[cfg(test)] mod should_panic { #[test] fn notihing() { println!("nothing..."); } } #[cfg(test)] mod tests { use super::*; #[test] fn explotion() { assert_eq!(2 + 2, 4); } #[test] fn hellokitty() { assert_ne!(1 + 1, 4); } #[test] fn larger_can_hold_smaller() { let larger = Rectangle { length: 8, width: 7 }; let smaller = Rectangle { length: 5, width: 1 }; assert!(larger.can_hold(&smaller)); } #[test] fn smaller_cannot_hold_larger() { let larger = Rectangle { length: 8, width: 7 }; let smaller = Rectangle { length: 5, width: 1 }; assert!(!smaller.can_hold(&larger)); } #[test] #[ignore] #[should_panic(expected = "t")] fn should_panic() { panic! ("test panic"); } #[test] fn print_add2() { let mut model = Rectangle { length: 8, width: 1 }; model.add_two(); assert_eq!(model.length, 10); } }
...io