You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法运行定义在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:18:33