Rust内置了强大的测试框架,使得编写和运行测试变得非常简单。Rust的测试系统主要包括单元测试、集成测试和文档测试。
1. 单元测试
单元测试通常放在与被测试代码相同的文件中,使用#[cfg(test)]
模块和#[test]
属性标记。
1.1 基本测试结构
// 在src/lib.rs或任何模块中pub fn add(a: i32, b: i32) -> i32 {a + b
}#[cfg(test)] // 只在测试时编译
mod tests {use super::*; // 导入外部项#[test] // 标记这是一个测试函数fn test_add() {assert_eq!(add(2, 2), 4);}#[test]#[should_panic] // 测试应该panic的情况fn test_panic() {panic!("This test should fail");}
}
1.2 常用断言宏
#[test]
fn test_assertions() {assert!(true); // 简单断言assert_eq!(2 + 2, 4); // 相等断言assert_ne!(3, 4); // 不等断言let result = std::panic::catch_unwind(|| {// 可能panic的代码});assert!(result.is_err()); // 验证是否panic
}
1.3 测试错误处理
pub fn divide(a: i32, b: i32) -> Result<i32, String> {if b == 0 {Err(String::from("Cannot divide by zero"))} else {Ok(a / b)}
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_divide() {assert_eq!(divide(10, 2), Ok(5));assert_eq!(divide(10, 0), Err(String::from("Cannot divide by zero")));}
}
2. 集成测试
集成测试位于单独的tests
目录中,测试库的公开API。
2.1 基本集成测试
项目结构:
my_project/
├── Cargo.toml
├── src/
│ └── lib.rs
└── tests/└── integration_test.rs
// tests/integration_test.rs
use my_project; // 导入你的库#[test]
fn test_library_function() {assert_eq!(my_project: