为何无法运行定义在main()函数内的#[test]测试?
为什么Rust中main函数内部的测试函数无法被cargo test识别?
你遇到的问题本质是Rust测试框架的扫描规则和语言本身的内部项限制导致的:
1. cargo test的扫描范围限制
cargo test只会扫描文件/模块的顶层作用域中带有#[test]属性的函数,不会深入到函数内部的嵌套作用域去查找测试用例。把test_gcd放在main()函数内部时,它属于内部嵌套项,不在测试框架的扫描范围内,自然不会被识别。
2. Rust不支持对内部项应用测试属性
Rust的语言规则明确禁止对内部项(函数内定义的函数、结构体等)使用#[test]属性,这就是你看到「cannot test inner items」警告的原因。内部项的可见性和生命周期完全被限制在包含它的函数内部,测试框架无法绕过这个限制去调用这些内部函数。
当你把adder和test_gcd移到main()外部的顶层作用域后,它们变成了模块级的默认可见性项,既符合cargo test的扫描要求,也满足测试框架对可访问性的要求,因此能正常执行测试。
问题中的两段代码对比
初始无效写法:
fn main() { fn adder(n: u64, m:u64) -> u64 { assert!(n != 0 && m !=0); n + m } #[test] fn test_gcd(){ assert_eq!(adder(1, 10), 11); assert_eq!(adder(100, 33), 133); } println!("{}", adder(3, 4)); println!("The END"); }
修正后有效写法:
fn main() { println!("{}", adder(3, 4)); println!("The END"); } fn adder(n: u64, m:u64) -> u64 { assert!(n != 0 && m !=0); n + m } #[test] fn test_gcd(){ assert_eq!(adder(1, 10), 11); assert_eq!(adder(100, 33), 133); }
内容的提问来源于stack exchange,提问作者RVilchez
相关产品推荐
相关产品推荐

