pubfnadd(left:usize, right:usize)->usize{
left + right
}#[cfg(test)]modtests{usesuper::*;#[test]fnit_works(){let result =add(2,2);assert_eq!(result,4);}}
由cargo test 命令运行项目中所有的测试
$ cargo test
Compiling adder v0.1.0 (file:///projects/adder)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.57s
Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
增加因调用了 panic! 而失败的测试
pubfnadd(left:usize, right:usize)->usize{
left + right
}#[cfg(test)]modtests{usesuper::*;#[test]fnexploration(){let result =add(2,2);assert_eq!(result,4);}#[test]fnanother(){panic!("Make this test fail");}}
调用 cargo test 运行测试
$ cargo test
Compiling adder v0.1.0 (file:///projects/adder)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s
Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4)
running 2 tests
test tests::another ... FAILED
test tests::exploration ... ok
failures:
---- tests::another stdout ----
thread 'tests::another' panicked at src/lib.rs:17:9:
Make this test fail
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::another
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: test failed, to rerun pass `--lib`
pubfngreeting(name:&str)->String{format!("Hello {}!", name)}#[cfg(test)]modtests{usesuper::*;#[test]fngreeting_contains_name(){let result =greeting("Carol");assert!(
result.contains("Carol"),"Greeting did not contain name, value was `{}`",
result
);}}
5.使用should_panic 检查 panic
pubstructGuess{
value:i32,}implGuess{pubfnnew(value:i32)->Guess{if value <1|| value >100{panic!("Guess value must be between 1 and 100, got {}.", value);}Guess{ value }}}#[cfg(test)]modtests{usesuper::*;#[test]#[should_panic]fngreater_than_100(){Guess::new(200);}}
6.将Result<T, E>用于测试
#[cfg(test)]modtests{#[test]fnit_works()->Result<(),String>{if2+2==4{Ok(())}else{Err(String::from("two plus two does not equal four"))}}}
fnprints_and_returns_10(a:i32)->i32{println!("I got the value {}", a);10}#[cfg(test)]modtests{usesuper::*;#[test]fnthis_test_will_pass(){let result =prints_and_returns_10(4);assert_eq!(result,10);}#[test]fnthis_test_will_fail(){let result =prints_and_returns_10(8);assert_eq!(result,5);}}
PS C:\Tools\devTools\vscode\code\rust\显示函数输出> cargo test
Compiling 显示函数输出 v0.1.0 (C:\Tools\devTools\vscode\code\rust\显示函数输出)
warning: function `prints_and_returns_10` is never used
--> src\lib.rs:1:4
|
1 | fn prints_and_returns_10(a: i32) -> i32 {
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `显示函数输出` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.67s
Running unittests src\lib.rs (target\debug\deps\显示函数输出-68b68f71791c7651.exe)
running 2 tests
test tests::this_test_will_pass ... ok
test tests::this_test_will_fail ... FAILED
failures:
---- tests::this_test_will_fail stdout ----
I got the value 8
thread 'tests::this_test_will_fail' panicked at src\lib.rs:17:9:
assertion `left == right` failed
left: 10
right: 5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::this_test_will_fail
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
1.显示成功测试的输出
cargotest -- --show-output
3.通过指定名称来运行部分测试
1.运行单个测试
可以向 cargo test funName 传递任意测试的名称来只运行某个测试
2.过滤运行多个测试
可以指定部分测试的名称,任何名称匹配这个名称的测试会被运行
cargo test add 匹配名称带add字段方法的所有测试
4.除非特别指定否则忽略某些测试
pubfnadd_two(a:i32)->i32{
a +2}#[cfg(test)]modtests{usesuper::*;#[test]fnadd_two_and_two(){assert_eq!(4,add_two(2));}#[test]fnadd_three_and_two(){assert_eq!(5,add_two(3));}#[test]#[ignore]fnone_hundred(){assert_eq!(102,add_two(100));}}
在 #[test] 之后添加 #[ignore] 行,进行cargo test ,会忽略添加 #[ignore]
如果只要运行被忽略的测试,可以使用 cargo test – --ignored
如果测试方法包含注解 #[ignore] ,想要运行全部测试,可以运行 cargo test – --include-ignored
tests/common/mod.rs
pubfnsetup(){// setup code specific to your library's tests would go here}
tests/integration_test.rs
useadder::add_two;modcommon;#[test]fnit_adds_two(){common::setup();assert_eq!(4,add_two(2));}