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: