Skip to content

单元测试

基本结构

rust
// 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);
    }
}
▶ Run

测试私有函数

rust
mod internal {
    fn private_func() -> i32 {
        42
    }

    #[cfg(test)]
    mod tests {
        use super::*;

        #[test]
        fn test_private() {
            // 可以访问私有函数
            assert_eq!(private_func(), 42);
        }
    }
}
▶ Run

测试模块组织

rust
#[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 测试
        }
    }
}
▶ Run