文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
13.1 单元测试
直接在源码文件内编写测试函数,并以 #[test]
标记。
// add.rs fn add(x: i32, y: i32) -> i32 { x + y } #[test] fn add_test() { assert_eq!(add(1, 2), 3); // 用断言判断测试结果。 } #[test] fn result_test() -> Result<(), &'static str> { // 以 Result 返回测试结果。 return Err("abc"); }
确保该模块直接或间接导入根模块。
cargo test -- --ignored
: 测试被忽略的函数。cargo test <name>
: 指定名称测试。(函数部分名,或my::add
这样的模块名)
$ cargo test running 1 test test my::add::add_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; ...; finished in 0.00s
组织
将源文件内所有测试函数放入专门模块。
子模块可访问父模块私有成员。
fn add(x: i32, y: i32) -> i32 { x + y } #[cfg(test)] mod tests{ use super::*; #[test] fn add_test() { assert_eq!(add(1, 2), 3); } }
注解
除测试函数外,还有一些专用注解。
#[test] #[should_panic] // #[should_panic(expected = "abc")] fn abc_test() { abc(); } #[test] #[ignore] // cargo test -- --ignored fn ign_test() { }
集成测试
集成测试(integration test)是外部测试,只能针对公开成员。
- 确保测试目标是 library。(可以与 main.rs 共存)
- 确保要测试模块已导入 lib.rs。
- 创建与 src 同级目录 tests。
- 创建测试文件,如 my_add_test.rs。
每个测试文件都被当作独立 crate 编译。
$ tree . ├── Cargo.lock ├── Cargo.toml ├── src │ ├── lib.rs │ ├── main.rs │ ├── my │ │ └── add.rs │ └── my.rs └── tests └── my_add_test.rs
// src/lib.rs pub mod my;
// tests/my_add_test.rs use demo::my::add::*; #[test] fn add_test() { assert_eq!(add(1, 2), 3); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论