概述
Rust內置了單元測試的支持,這點和Golang一樣,非常的棒,我超級喜歡單元測試!!!
本節課的代碼還是基于之前的求公約數的案例。
之前的完整代碼如下:
fn gcd(mut n: u64, mut m: u64) -> u64 {assert!(n != 0 && m != 0);while m != 0 {if m < n {let t = m;m = n;n = t;}m = m % n;}n
}fn main() {let r: u64 = gcd(88, 99);println!("{}", r);
}
添加單元測試代碼
基于之前的代碼,我們可以添加如下測試代碼:
#[test]
fn test_gcd(){assert_eq!(gcd(14, 15), 1);assert_eq!(gcd(2*3*5*11*17, 3*7*11*13*19), 3*11);
}
#[test]
是一個標記,將test_gcd
標記為一個測試函數,在正常編譯的時候會跳過它。但是如果使用 cargo test
命令運行程序,則會自動包含并調用它。
在Rust中,因為這種機制的存在,我們可以將測試代碼緊挨著函數編寫,而不必單獨為測試代碼開辟一個新的文件。
實戰:單元測試
創建項目:
cargo new hello
修改代碼:
cd hello
vim src/main.rs
完整代碼如下:
fn gcd(mut n: u64, mut m: u64) -> u64 {assert!(n != 0 && m != 0);while m != 0 {if m < n {let t = m;m = n;n = t;}m %= n;}n
}#[test]
fn test_gcd(){assert_eq!(gcd(14, 15), 1);assert_eq!(gcd(2*3*5*11*17, 3*7*11*13*19), 3*11);
}fn main() {let r: u64 = gcd(88, 99);println!("{}", r);
}
執行測試:
zhangdapeng@zhangdapeng:~/code/hello$ cargo testCompiling c10_func v0.1.0 (/home/zhangdapeng/code/hello)Finished `test` profile [unoptimized + debuginfo] target(s) in 0.34sRunning unittests src/main.rs (target/debug/deps/c10_func-7066c0fd0fc42bb9)running 1 test
test test_gcd ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
運行代碼:
zhangdapeng@zhangdapeng:~/code/hello$ cargo testCompiling c10_func v0.1.0 (/home/zhangdapeng/code/hello)Finished `test` profile [unoptimized + debuginfo] target(s) in 0.34sRunning unittests src/main.rs (target/debug/deps/c10_func-7066c0fd0fc42bb9)running 1 test
test test_gcd ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
代碼清理:
zhangdapeng@zhangdapeng:~/code/hello$ cargo cleanRemoved 52 files, 14.0MiB total