测试是用#[test]注解标记的普通函数。cargo test会运行项目里所有的测试。不管你的包是一个可执行程序或者是一个库,运行cargo test都是一样的,没啥区别。你可以通过传递参数运行指定的测试。cargo test math会运行名字为test的测试。
测试通常都用标准库里的assert!或者assert_eq!宏。assert!(expr)如果expr为true则通过测试,否则它会恐慌,测试失败。assert_eq!(v1,v2)和assert!(v1==v2)类似,但是失败的时候,它会展示2个变量的值。你可以在普通代码里使用这些宏,但是注意,assert!和assert_eq!在发行构建中也会存在,你应该用debug_assert!和debug_assert_eq!,这两个宏只会在调试构建中生效。
你可以用#[should_panic]注解来标记测试会出错的函数。
#[test]注解标记的函数是条件编译的,当你运行cargo test的时候,cargo构建一个带测试的程序,这些测试程序生效。运行cargo build和cargo build --release的时候,会跳过测试代码。这意味着,你的单元测试代码可以写在它测试的代码旁边,可以在需要的时候访问内部实现细节,并且没有运行时开销。但是这会导致一些警告,运行测试的时候没问题,运行非测试构建的时候会提示测试函数未被使用。你可以把这些测试代码放到一个单独的测试模块里,并用#[cfg(test)]来标记模块。rust运行测试会用多线程测试各个测试函数,你的程序应该默认线程安全。你可以设置环境变量RUST_TEST_THREADS=1来用单线程测试。
集成测试是在tests目录下的.rs文件,当你运行cargo test的时候,cargo会把每个集成测试当做独立的包来构建,以用户的角度来连接你的库,所以在集成测试里需要把库当做外部库来引用。集成测试只能测试公共的api。cargo test既运行单元测试,也运行集成测试。你可以单独运行某一个集成测试,比如集成测试的文件是tests/unfurl.rs,那么运行cargo test --test unfurl来测试。
