单元测试
基本结构
rust
▶ Run// src/lib.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn divide(a: i32, b: i32) -> Option<i32> {
if b == 0 {
None
} else {
Some(a / b)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add_positive() {
assert_eq!(add(2, 3), 5);
}
#[test]
fn test_add_negative() {
assert_eq!(add(-1, -1), -2);
}
#[test]
fn test_add_mixed() {
assert_eq!(add(-1, 1), 0);
}
#[test]
fn test_divide_ok() {
assert_eq!(divide(10, 2), Some(5));
}
#[test]
fn test_divide_by_zero() {
assert_eq!(divide(10, 0), None);
}
}测试私有函数
rust
▶ Runmod internal {
fn private_func() -> i32 {
42
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_private() {
// 可以访问私有函数
assert_eq!(private_func(), 42);
}
}
}测试模块组织
rust
▶ Run#[cfg(test)]
mod tests {
use super::*;
// 辅助函数
fn create_test_user() -> User {
User::new(String::from("Test"), 25)
}
// 相关测试分组
mod user_tests {
use super::*;
#[test]
fn test_user_creation() {
let user = create_test_user();
assert_eq!(user.name(), "Test");
}
#[test]
fn test_user_is_adult() {
let user = create_test_user();
assert!(user.is_adult());
}
}
mod api_tests {
use super::*;
#[test]
fn test_api_response() {
// API 测试
}
}
}